Der Fall der Code-Verschleierung?

47

Was sind die Hauptgründe für das Schreiben von verschleiertem Code im Hinblick auf einen echten Nutzen für die Entwickler des Codes und das Unternehmen, das diesen Code ausführt (wenn es sich bei dem fraglichen Code tatsächlich um kommerziellen Code handelt)? Gibt es dokumentierte Fälle (an einigen Orten online verfügbar), die beschreiben, wann die Verschleierung mehr gut als schlecht war? Gibt es bekannte Beispiele, bei denen nachgewiesen wurde, dass eine Verschleierung einen böswilligen Dritten davon abhält, an den Code zu gelangen? Es scheint so, als würde das Aufrollen Ihrer Autofenster nicht verhindern, dass die Leute sie zerbrechen und Ihre Stereoanlage stehlen. Wenn Sie Ihren Code verschleiern, bleiben ehrliche Leute ehrlich.

=========

Hintergrund:

Dies ist ein Versuch, meine Annahmen zu diesem Thema absichtlich in Frage zu stellen.

Ich bin ein großer Gegner der Verwendung von Code-Verschleierung im Allgemeinen, aber ich bin neugierig, ob mir etwas fehlt. Ich verstehe, warum in Fällen wie JavaScript die Minimierung das Laden der Dinge beschleunigt (da gibt es einen echten funktionalen Vorteil), aber ich kann anscheinend keinen einzigen Grund für die Codeverschleierung nennen, um ein Hindernis zu sein zu entdecken, was ein Abschnitt von Code / Algorithmus tut , ist für jeden Zweck effektiv.

Angesichts der verrückten Beliebtheit von Open Source scheint die Frage zu sein, ob der Code freigegeben oder geschützt werden soll. Wenn es um kommerziellen Code geht, kann ich verstehen, warum Sie nicht alles teilen können und Sie das Gesetz haben, um Diebstahl zu bekämpfen.

Übrigens, wenn der Grund, warum jemand verschleierten Code schreibt, "Job-Sicherheit" ist, würde ich jeden Programmierer entlassen, von dem festgestellt wurde, dass er konsequent ist, und die Verschleierung absichtlich einsetzen, um zu helfen, ihre Jobs zu behalten, es sei denn, er könnte vernünftigerweise nachweisen, dass er welche hat Geschäftsvorteil. Es ist so komplett gegen Teams, dass es lächerlich ist, und weist auf jemanden hin, der sich mehr darum kümmert, seinen Job durch fehlgeleitete Praktiken zu erhalten und ihn dann beizubehalten, weil er großartige Software schreibt.

Ich erwähne nur diesen speziellen Fall, weil ich, obwohl mir klar ist, dass die Leute normalerweise Witze machen, alle Antworten abschrecken möchte, deren Grundgedanke darin besteht, dass die Verschleierung der Arbeitsplatzsicherheit allein eine gute Idee ist.

jefflunt
quelle
3
Ich denke, Sie haben alles gesagt
Paul
6
Vereinfacht gesagt, ändert die Verschleierung die Wirtschaftlichkeit der Rückentwicklung Ihres Codes, nicht mehr.
Mark Booth
Danke an alle. Ich habe sicherlich eine andere Perspektive gesehen, dank Ihrer detaillierten Antworten und Kommentare. Es gibt mehrere qualitativ hochwertige Antworten, die sich mit verschiedenen Aspekten dieses Problems befassen. Anstatt nur eine Frage zu beantworten, habe ich meine Favoriten hochgestuft.
Jefflunt
Ziehen Sie Quellcode oder Objekt- / ausführbaren Code in Betracht oder konzentrieren Sie sich darauf ? Zum Beispiel vertreibt die Gimpel-Software eine Version ihres Lint-Tools in verschleiertem C-Quellcode, sodass die typischen Unix-Clients diese kompilieren können, um sie in jeder gewünschten Umgebung auszuführen, ohne dass Gimpel N Zielumgebungen unterstützen / warten muss , einschließlich Oddball- oder Legacy-Umgebungen. Dies ist ein angemessener Unterschied zu der Objekt- / ausführbaren Verschleierung, die zum Schutz von Kopien oder Daten (z. B. unerlaubtes Kopieren) verwendet wird, um das Reverse Engineering zu verzögern oder davon abzuhalten.
Mctylr

Antworten:

49

Ein sehr interessanter Anwendungsfall für die Verschleierung ist die Verfolgung der Herkunft illegaler Kopien. Unter der Annahme, dass die Verschleierung eine relativ kostengünstige Operation ist, kann der ursprüngliche Autor jedem Kunden unterschiedlich verschleierte Versionen der Anwendung zur Verfügung stellen. Wenn eine illegale Kopie gefunden wird, kann der Autor diese mit den gelieferten Versionen vergleichen und die Quelle der Piraterie zurückverfolgen.

Das ist eine Form der Steganographie , inspiriert und in Variation der kryptografischen Schemata der "Verräter-Verfolgung" . Ich habe keine Ahnung, ob es häufig 1 ist oder ob es eine gute Idee ist, aber ich habe gesehen, dass es in der Praxis unter den folgenden Parametern angewendet wird:

  • Stark umkämpfter bundesweiter Markt mit nur zwei Anbietern,
  • Etwa 50 Bereitstellungen deckten den Markt ab,
  • Die durchschnittliche Entwicklungszeit für beide Anwendungen betrug einige Jahre (mehr oder weniger).
  • Die durchschnittliche Verschleierungszeit für unsere Anwendung betrug einige Stunden.
  • Die Lebensdauer für beide Anwendungen wurde auf etwa zehn Jahre veranschlagt.

Das Grundprinzip war natürlich anfangs Sicherheit durch Unbekanntheit , und es entwickelte sich irgendwann bei dem oben erwähnten Schema 2 . Beide Anbieter hatten legal gegenseitigen Zugriff auf den Binärcode, und ich denke, es ist offensichtlich, dass Dekompilierungsversuche von beiden erwartet wurden. Die Verschleierung hat auf lange Sicht nichts zur Sicherheit beigetragen. Beide Anbieter hatten hochmotivierte und talentierte Teams, die in einem äußerst profitablen und Nischenmarkt arbeiteten. Am Ende waren unsere Produkte mehr als ähnlich, und jeder Wettbewerbsvorteil wurde durch andere, weniger undurchsichtige Mittel erzielt.

Ich kann nicht wirklich expandieren, weil (a) es sehr früh in meiner Karriere war und ich keinen klaren Überblick über die Entwurfsentscheidungen oder die Ergebnisse des Rückverfolgungsschemas (falls vorhanden) und (b) einen Teil meines Engagements bekam Mit dem Projekt wurde im Rahmen einer NDA.

Ein anderer gültiger Anwendungsfall für die Verschleierung könnte sein, wenn Sie gesetzlich dazu verpflichtet sind, Ihren Code an Dritte weiterzuleiten :

Wenn Ihre Firma IP für Technologieunternehmen ausführt oder in Fällen mit Software-Quellcode involviert ist, müssen Sie möglicherweise den Quellcode Ihres Kunden beim USPTO, einem Gericht oder Dritten einreichen.

Da der Quellcode als Geschäftsgeheimnis betrachtet wird, verwenden die meisten Aufsichtsbehörden eine "50%" -Regel. Der übermittelte Quellcode ist verdeckt, so dass er nicht unverändert verwendet werden kann.

IANAL, und der Link ist relevanter für Hardcodekopien als für den eigentlichen Arbeitscode, sodass dies möglicherweise völlig irrelevant ist.

Nun, da Javascript das kanonische Beispiel für die Verschleierung ist, gibt es einen Nebeneffekt, der nicht allgemein berücksichtigt wird und der schädlichen Code in verschleiertem Javascript verbirgt. Obwohl die Minimierung von 3 Javascript einige Vorteile mit sich bringt , sehe ich keinen Grund für eine tatsächliche Verschleierung, und ich bin froh, dass Douglas Crockford mir zustimmt :

Dann ist da noch die Frage des Code-Datenschutzes. Dies ist eine verlorene Sache. Es gibt keine Transformation, die einen entschlossenen Hacker davon abhält, Ihr Programm zu verstehen. Dies trifft auf alle Programme in allen Sprachen zu. Bei JavaScript ist dies nur offensichtlicher, da es in Quellform geliefert wird. Der Datenschutzvorteil durch Verschleierung ist eine Illusion. Wenn Sie nicht möchten, dass andere Ihre Programme sehen, trennen Sie den Server vom Computer.

Was die Verschleierung für "Arbeitsplatzsicherheit" angeht, so sollte dieses Verhalten die Codeüberprüfung niemals bestehen, und wenn es identifiziert wird, sollte es nicht toleriert werden. Anfangs würde ich nicht so weit gehen, den Täter zu feuern, aber Wiederholungstäter verdienen auf jeden Fall eine gute Tracht Prügel.

Zusammenfassend lässt sich sagen, dass die Verschleierung ein typisches Beispiel für Sicherheit durch Verschleierung ist. Es liegt nur auf der Hand, dass sie abschreckend wirkt und nicht mehr. Es mag kreative Anwendungsfälle geben 4, von denen ich nichts weiß, aber im Allgemeinen sind die Vorteile bestenfalls minimal.

1 Nachdem ich dies geschrieben hatte, fand ich diese Antwort heraus, die im Grunde das gleiche Schema beschreibt, so dass es vielleicht üblicher ist, als ich dachte.
2 Obwohl Steganographie immer noch Sicherheit durch Dunkelheit ist.
3 Minimierung ~ Leerzeichen entfernen und Token kürzen, nicht absichtlich verdecken.
4 Zählt der International Obfuscated C Code Contest ?

yannis
quelle
"Wenn Sie nicht möchten, dass andere Ihre Programme sehen, trennen Sie Ihren Server." - oder verwenden Sie Software Guard Extensions und vertrauen Sie Intel.
user253751
40

Der Fall der Code-Verschleierung ist, dass ein Dritter die Messlatte höher legt, um zu bestimmen, was / wie der Code funktioniert.

Dies bedeutet jedoch NICHT , dass ein Entwickler jemals verschleierten Code schreiben sollte.

Sehen Sie, dies ist das, was Ihrer Frage meines Erachtens fehlt: Die Verschleierung von Code (genau wie die JavaScript-Minimierung) muss und sollte nicht manuell vom Entwickler vorgenommen werden. Ebenso sollte dies auch nicht als Kernquelldatei in der Versionskontrolle gespeichert werden.

Die Verschleierung von Code sollte als Nachbearbeitungsschritt während der Kompilierung in Ihrem Produktionsbuild erfolgen. Es gibt auch viele Produkte von Drittanbietern, daher gibt es fast keinen Grund, dies im eigenen Haus zu tun.

Zum Beispiel: Dotfuscator

Die IEEE hat ein Papier über die Wirksamkeit der Code-Verschleierung

Die Ergebnisse zeigen, dass das Umbenennen von IDs die Effizienz von Angriffen erheblich verringert und zumindest die für einen erfolgreichen Angriff erforderliche Zeit verdoppelt (selbst im schlimmsten Fall, dh gegen den besten Angreifer). Darüber hinaus verringert die Verschleierung die Lücke zwischen unerfahrenen und erfahrenen Angreifern, wodurch letztere weniger effizient sind , und macht Systeme, die leichter anzugreifen sind, klarer denen, die an sich schwerer zu brechen sind.

Betonung meiner.

Dan McGrath
quelle
2
Ich würde +1 geben, aber für den Link ist ein kostenpflichtiges Abonnement erforderlich, auf das nicht alle Leser Zugriff haben.
Mattnz
Ja, das ist die unglückliche Tatsache der IEEE, mit der ich nicht ganz zufrieden bin, aber das ist ein anderes Thema
Dan McGrath
8
Hier gibt es eine öffentlich zugängliche PDF-Version . Ich denke, es ist in Ordnung, dies stattdessen auf der Homepage eines der Autoren der Zeitung, Mariano Ceccato, zu verwenden.
Yannis
Toller Fund. Ich hatte mit Google Scholar danach gesucht, es aber nicht gefunden. Ich habe den Link aktualisiert.
Dan McGrath
1
+1 für "Code-Verschleierung (genau wie JavaScript-Verkleinerung) erfolgt nicht - und sollte auch nicht - manuell durch den Entwickler"
João Portela
35

Ich habe an der Entwicklung eines MMORPG teilgenommen. Dies umfasste Serverlogik und Clientlogik. Während der langjährigen Entwicklung des Projekts galt, wann immer wir die Schnittstelle zwischen Client und Server betrachteten, die Regel, dass der Client jederzeit vom Server unter der Annahme behandelt werden sollte, dass er gehackt wurde. Mit anderen Worten, der Server musste so geschrieben sein, dass es keine Antwort vom Client gab, die zum Ausfall des Servers oder zum Betrügen des Clients führen würde. Dennoch war von Anfang an bekannt, dass Hacker unweigerlich Lücken im System finden und ausnutzen würden, um zu betrügen. Und nach einer Weile taten sie es.

Natürlich haben wir vor dem Versand des Kunden in die große Welt darauf geachtet, ihn zu verschleiern. Wir glauben, dass die Verschleierung die folgenden Auswirkungen hatte:

  1. Es hielt die nicht-erfahrenen Hacker davon ab, es überhaupt zu versuchen.
  2. Es verzögerte erfahrene Hacker, irgendwelche Hacks zu erreichen.
  3. Es reduzierte die Anzahl der von erfahrenen Hackern erzielten Hacks.
  4. Dies hat die Effektivität der Hacks eingeschränkt.
  5. Das Wichtigste: Die Hacker führten mehr Testläufe mit ihren gehackten Clients auf unseren Servern durch, bevor ein funktionierender Hack durchgeführt wurde. Dies erhöhte die Wahrscheinlichkeit, dass wir sie entdeckten, indem wir nach unregelmäßigen Aktivitäten in den Serverprotokollen suchten.

Spielkonten von entdeckten Hackern wurden ohne Rückerstattung gekündigt, was das Hacking-Geschäft kostspieliger und weniger attraktiv machte.

Aus all diesen Gründen glaube ich, dass die Verschleierung einen insgesamt positiven Effekt in unserem Spiel hatte, und im weiteren Sinne kann die Verschleierung einen insgesamt positiven Effekt in jeder Software haben, die dazu neigt, gehackt zu werden. (Zum Beispiel Software mit Kopierschutzmaßnahmen.)

Die Auswirkungen der Verschleierung auf die Instandhaltung waren nahezu gleich. Es gab ein paar Stellen, an denen einige unerfahrene Programmierer Annahmen über die Namen der Bezeichner machten (sie verwendeten Reflektion), aber sobald diese aussortiert waren, war alles in Ordnung. Der Verschleierungsschritt wurde einfach Teil des gesamten Build-Schritts für die Produktionsversion des Spiels, sodass sich die meisten von uns Entwicklern nie darum kümmern mussten oder irgendetwas damit zu tun hatten. Wir hatten bereits ein Tool zum Anzeigen der Protokolle des Spiels, daher haben wir das Tool dahingehend geändert, dass die vom Obfuscator erstellte Zuordnungstabelle (Zuordnung von verschleierten Bezeichnern zu richtigen Bezeichnern) verwendet wird, um die Protokolle im laufenden Betrieb für uns zu übersetzen Sogar verschleierte Identifikatoren mussten bei Obduktionsuntersuchungen auf der Grundlage von Feldprotokollen festgestellt werden.

Mike Nakis
quelle
Welchen Einfluss hatte es auf die Wartung?
Deworde
2
@deworde Ich habe meine Antwort mit einem weiteren Absatz über die Auswirkungen der Verschleierung auf die Wartung aktualisiert.
Mike Nakis
@ MikeNakis: Darkfall? :-)
Carson63000
@ Carson63000 Ja. (Und LOL an Ihrem Avatar - ist das Kettenhemd und tragen Sie ein Schwert?)
Mike Nakis
@ MikeNakis: schön! Und ja, auf dem Avatar - nun, es ist ein Kettenhemd aus Strick und ein Holzschwert. Die Firma, für die ich gearbeitet habe, hat einige Assets für Bannerwerbung erstellt und die Mitarbeiter dazu gebracht, sich zu verkleiden, anstatt Models einzustellen. :-)
Carson63000
3

Das Lesen und Verstehen (und offensichtlich das Schreiben) von verschleiertem Code kann eine interessante mentale Herausforderung sein. Es fällt wahrscheinlich nicht in den Rahmen, den Sie fragten, aber Beispiele wie IOCCC können sowohl für Unterhaltung als auch für Entsetzen sorgen.

Vatine
quelle
3
Dies hätte eigentlich ein Kommentar zu der Frage sein sollen, keine Antwort.
Dan McGrath