Verschleierung

Was ist Verschleierung?

Verschleierung bedeutet, etwas schwer verständlich zu machen. Programmiercode wird häufig verschleiert, um geistiges Eigentum oder Geschäftsgeheimnisse zu schützen und einen Angreifer daran zu hindern, ein proprietäres Softwareprogramm zurückzuentwickeln.

Das Verschlüsseln eines Teils oder des gesamten Programmcodes ist eine Verschleierungsmethode. Andere Ansätze umfassen das Entfernen potenziell aufschlussreicher Metadaten, das Ersetzen von Klassen- und Variablennamen durch bedeutungslose Bezeichnungen und das Hinzufügen von unbenutztem oder bedeutungslosem Code zu einem Anwendungsskript. Ein Tool namens Obfuscator konvertiert den Quellcode automatisch in ein Programm, das auf die gleiche Weise funktioniert, aber schwieriger zu lesen und zu verstehen ist.

Leider verwenden auch Autoren von bösartigem Code diese Methoden, um zu verhindern, dass ihre Angriffsmechanismen von Antimalware-Tools erkannt werden. Der SolarWinds-Angriff von 2020 ist ein Beispiel dafür, wie Hacker Verschleierung einsetzen, um der Verteidigung auszuweichen.

Deobfuskationstechniken können verwendet werden, um die Verschleierung rückgängig zu machen oder rückgängig zu machen. Diese Techniken umfassen Programm-Slicing, bei dem der Programmcode auf die relevanten Anweisungen an einem bestimmten Punkt im Programm beschränkt wird. Compiler-Optimierung und Programmsynthese sind zwei weitere deobfuscation Techniken. Die Verschleierung zielt darauf ab, das Reverse Engineering zu erschweren und die Mühe nicht wert zu sein.

Wie funktioniert die Verschleierung?

Verschleierung im Computercode verwendet komplexe Umlauffrasen und redundante Logik, um den Code für den Leser schwer verständlich zu machen. Ziel ist es, den Leser mit der komplizierten Syntax dessen, was er liest, abzulenken und es ihm schwer zu machen, den wahren Inhalt der Nachricht zu bestimmen.

Mit Computercode kann der Leser eine Person, ein Computergerät oder ein anderes Programm sein. Verschleierung wird auch verwendet, um Antiviren-Tools und andere Programme zu täuschen, die stark auf digitale Signaturen angewiesen sind, um Code zu interpretieren. Decompiler sind für Sprachen wie Java, Betriebssysteme wie Android und iOS und Entwicklungsplattformen wie .NET verfügbar. Sie können Quellcode automatisch zurückentwickeln; Die Verschleierung soll es diesen Programmen erschweren, auch ihre Dekompilierung durchzuführen.

Bei der Code-Verschleierung geht es nicht darum, den Inhalt des ursprünglichen Codes eines Programms zu ändern, sondern darum, die Bereitstellungsmethode und die Darstellung dieses Codes verwirrender zu gestalten. Die Verschleierung ändert nichts an der Funktionsweise des Programms oder seiner Endausgabe.

Was folgt, ist ein Beispiel für einen normalen JavaScript-Code:

var greeting = 'Hello World';greeting = 10;var product = greeting * greeting;

Das gleiche Snippet in verschleierter Form sieht so aus:

var _0x154f=;var _0x52df=function(_0x159d61,_0x12b953){_0x159d61=_0x159d61-0x122;var _0x154f4b=_0x154f;return _0x154f4b;};(function(_0x19e682,_0x2b7215){var _0x5e377c=_0x52df;while(!!){try{var _0x2d3a87=-parseInt(_0x5e377c(0x129))*parseInt(_0x5e377c(0x123))+-parseInt(_0x5e377c(0x125))*parseInt(_0x5e377c(0x12e))+parseInt(_0x5e377c(0x127))*-parseInt(_0x5e377c(0x126))+-parseInt(_0x5e377c(0x124))*-parseInt(_0x5e377c(0x12f))+-parseInt(_0x5e377c(0x128))*-parseInt(_0x5e377c(0x12b))+parseInt(_0x5e377c(0x12a))*parseInt(_0x5e377c(0x12d))+parseInt(_0x5e377c(0x12c))*parseInt(_0x5e377c(0x122));if(_0x2d3a87===_0x2b7215)break;else _0x19e682(_0x19e682());}catch(_0x22c179){_0x19e682(_0x19e682());}}}(_0x154f,0x1918c));var greeting='Hello\x20World';greeting=0xa;var product=greeting*greeting;

Die verschleierte Version ist mit dem menschlichen Auge kaum zu verfolgen.

Verschleierungstechniken

Die Verschleierung umfasst mehrere verschiedene Methoden. Oft werden mehrere Techniken verwendet, um einen mehrschichtigen Effekt zu erzeugen.

Programme, die in kompilierten Softwaresprachen wie C# und Java geschrieben wurden, lassen sich leichter verschleiern. Dies liegt daran, dass sie Anweisungen auf mittlerer Ebene erstellen, die im Allgemeinen leichter zu lesen sind. Im Gegensatz dazu ist C ++ schwieriger zu verschleiern, da es zu Maschinencode kompiliert wird, mit dem Menschen schwieriger arbeiten können.

Einige gängige Verschleierungstechniken umfassen die folgenden:

  • Umbenennen. Der Obfuscator ändert die Methoden und Namen von Variablen. Die neuen Namen können nicht druckbare oder unsichtbare Zeichen enthalten.
  • Verpackung. Dadurch wird das gesamte Programm komprimiert, um den Code unlesbar zu machen.
  • Kontrollfluss. Der dekompilierte Code sieht aus wie Spaghetti-Logik, die unstrukturiert und schwer zu wartender Code ist, bei dem die Gedankenlinie verdeckt ist. Die Ergebnisse dieses Codes sind nicht klar, und es ist schwer zu sagen, was der Sinn des Codes ist, wenn man ihn betrachtet.
  • Befehlsmustertransformation. Dieser Ansatz verwendet allgemeine Anweisungen, die vom Compiler erstellt wurden, und tauscht sie gegen komplexere, weniger häufige Anweisungen aus, die effektiv dasselbe tun.
  • Dummy-Code einfügen. Dummy-Code kann einem Programm hinzugefügt werden, um das Lesen und Zurückentwickeln zu erschweren, hat jedoch keinen Einfluss auf die Logik oder das Ergebnis des Programms.
  • Entfernen von Metadaten oder nicht verwendetem Code. Nicht verwendeter Code und Metadaten geben dem Leser zusätzliche Informationen über das Programm, ähnlich wie Anmerkungen in einem Word-Dokument, die ihm beim Lesen und Debuggen helfen können. Durch das Entfernen von Metadaten und nicht verwendetem Code erhält der Leser weniger Informationen über das Programm und seinen Code.
  • Einfügung undurchsichtiger Prädikate. Ein Prädikat im Code ist ein logischer Ausdruck, der entweder wahr oder falsch ist. Undurchsichtige Prädikate sind bedingte Verzweigungen – oder Wenn-Dann-Anweisungen -, bei denen die Ergebnisse mit statistischer Analyse nicht einfach ermittelt werden können. Das Einfügen eines undurchsichtigen Prädikats führt zu unnötigem Code, der nie ausgeführt wird, aber für den Leser, der versucht, die dekompilierte Ausgabe zu verstehen, rätselhaft ist.
  • Anti-Debugging. Legitime Software-Ingenieure und Hacker verwenden Debug-Tools, um Code Zeile für Zeile zu untersuchen. Mit diesen Tools können Softwareingenieure Probleme mit dem Code erkennen, und Hacker können sie verwenden, um den Code zurückzuentwickeln. IT-Sicherheitsexperten können Anti-Debug-Tools verwenden, um zu erkennen, wann ein Hacker ein Debug-Programm als Teil eines Angriffs ausführt. Hacker können Anti-Debug-Tools ausführen, um festzustellen, wann ein Debug-Tool verwendet wird, um die Änderungen zu identifizieren, die sie am Code vornehmen.
  • Manipulationssicher. Diese Tools erkennen manipulierten Code und stoppen das Programm, wenn er geändert wurde.
  • String-Verschlüsselung. Diese Methode verwendet Verschlüsselung, um die Zeichenfolgen in der ausführbaren Datei auszublenden, und stellt die Werte nur dann wieder her, wenn sie zum Ausführen des Programms benötigt werden. Dies macht es schwierig, ein Programm durchzugehen und nach bestimmten Zeichenfolgen zu suchen.
  • Code-Umsetzung. Dies ist die Neuordnung von Routinen und Verzweigungen im Code, ohne sichtbare Auswirkungen auf sein Verhalten zu haben.

Messung des Verschleierungserfolgs

Der Erfolg von Verschleierungsmethoden kann anhand der folgenden Kriterien gemessen werden:

  • Stärke. Das Ausmaß, in dem transformierter Code automatisierten Deobfuskationsversuchen widersteht, bestimmt die Stärke. Je mehr Aufwand, Zeit und Ressourcen erforderlich sind, desto stärker ist der Code.
  • Differenzierung. Der Grad, in dem sich transformierter Code vom Original unterscheidet, ist ein weiteres Maß dafür, wie effektiv er ist. Einige der Methoden zur Beurteilung der Differenzierung umfassen:
    • Die Anzahl der Prädikate, die der neue Code enthält.
    • Die Tiefe des Vererbungsbaums (DIT) – eine Metrik, die verwendet wird, um die Komplexität des Codes anzuzeigen. Ein höheres DIT bedeutet ein komplexeres Programm.
  • Kosten. Eine kostengünstige Verschleierungsmethode ist nützlicher als eine teure, insbesondere wenn es darum geht, wie gut sie für größere Anwendungen skaliert werden kann.
  • Komplexität. Je mehr Ebenen der Obfuscator hinzufügt, desto komplexer wird das Programm, wodurch die Verschleierung erfolgreicher wird.

Vorteile der Verschleierung

Die Hauptvorteile der Verschleierung sind wie folgt:

  • Geheimhaltung. Die Verschleierung verbirgt die wertvollen Informationen im Code. Dies ist ein Vorteil für legitime Organisationen, die Code vor Wettbewerbern und Angreifern schützen möchten. Umgekehrt nutzen schlechte Schauspieler die Geheimhaltung der Verschleierung, um ihren bösartigen Code zu verbergen.
  • Effizienz. Einige Verschleierungstechniken, wie das Entfernen von nicht verwendetem Code, haben den Effekt, dass das Programm verkleinert und weniger ressourcenintensiv ausgeführt wird.
  • Sicherheit. Verschleierung ist eine integrierte Sicherheitsmethode, die manchmal als Anwendungsselbstschutz bezeichnet wird. Anstatt eine externe Sicherheitsmethode zu verwenden, funktioniert es innerhalb dessen, was geschützt wird. Es eignet sich gut zum Schutz von Anwendungen, die in einer nicht vertrauenswürdigen Umgebung ausgeführt werden und vertrauliche Informationen enthalten.

Nachteile der Verschleierung

Einer der Hauptnachteile der Verschleierung ist, dass sie auch in Malware verwendet wird. Malware-Autoren verwenden es, um Antivirenprogramme zu umgehen, die Code nach bestimmten Funktionen durchsuchen. Durch die Verschleierung dieser Funktionen erscheint die Malware für die Antivirensoftware legitim.

Zu den gängigen Techniken, die Malware-Autoren verwenden, gehören:

  • Exklusives oder (XOR). Eine Operation, die Daten verbirgt, indem XOR-Werte auf Code angewendet werden, sodass nur ein geschultes Auge sie entschlüsseln kann.
  • ROT-13. Eine Anweisung, die zufällige Zeichen durch Code ersetzt.

Anstatt neue Malware zu entwickeln, packen Autoren häufig verwendete Standardangriffsmethoden neu, um ihre Funktionen zu verschleiern. In einigen Fällen umfassen böswillige Akteure herstellerspezifische Techniken.

Ein weiterer Nachteil der Verschleierung ist, dass sie das Lesen von Code erschweren kann. Beispielsweise erfordert Code, der die Zeichenfolgenverschlüsselungsverschleierungsmethode verwendet, die Entschlüsselung der Zeichenfolgen zur Laufzeit, was die Leistung verlangsamt.

Verschleierung und SolarWinds

Ein Angriff auf SolarWinds, einen Hersteller von IT-Management- und Überwachungssoftware in Austin, Texas, der bereits im September 2019 begonnen haben soll, führte dazu, dass eine Vielzahl anderer Unternehmen und Regierungsbehörden verletzt wurden. Der Angriff wurde im Dezember 2020 entdeckt und russischen Hackern zugeschrieben. Es kompromittiert zunächst SolarWinds‘ Orion IT-Management-Plattform.

Die Angreifer verwendeten Sunburst-Malware, die Verschleierung, maschinelles Lernen und KI-Techniken kombinierte, um eine Hintertür in Software-Updates für die Orion-Plattform zu installieren. Um ihre Bemühungen zu verschleiern und Abwehrmaßnahmen zu umgehen, änderten sie Überwachungsprotokolle, löschten Dateien und Programme nach der Verwendung und fälschten Aktivitäten, um sie als legitime Anwendungen im Netzwerk erscheinen zu lassen.

Es wird vermutet, dass dieser Angriff auf die Lieferkette seit mehr als einem Jahr unentdeckt bleibt. Die in den Quellcode eingefügte Malware ruhte und versteckte sich, bis Benutzer die infizierten Updates herunterluden. Es verbreitete sich dann unentdeckt im Netzwerk und infizierte eine lange Liste von Organisationen, die Orion verwendeten.

Verschleierung ist eine von vielen Techniken, die Hacker anwenden, um in IT-Systeme einzudringen. Erfahren Sie mehr über die Verteidigung gegen verschiedene Arten von Cybersicherheitsangriffen im ausführlichen Cybersicherheitsplanungsleitfaden von TechTarget.

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.