× Install ThecoreGrid App
Tap below and select "Add to Home Screen" for full-screen experience.
B2B Engineering Insights & Architectural Teardowns

Symbolische Ausführung zur Analyse von BPF-Malware

Symbolische Ausführung vereinfacht die Analyse von BPF-Malware und beseitigt das Engpassproblem im Reverse Engineering. Der Ansatz ermöglicht es, automatisch „magische“ Pakete zur Auslösung von Backdoors wiederherzustellen.

Das Problem zeigt sich nicht sofort — bis zu dem Moment, an dem die Analyse von BPF-Malware auf die Komplexität der Filter stößt. Der klassische Berkeley Packet Filter funktioniert wie eine kompakte virtuelle Maschine im Linux-Kernel. Er verarbeitet den Datenverkehr auf Bytecode-Ebene und kann Verhaltensweisen vor User-Space-Tools verbergen. Dies macht ihn zu einer geeigneten Plattform für versteckte Backdoors. Wenn der Filter Dutzende oder Hunderte von Anweisungen mit Verzweigungen enthält, wird das manuelle Reverse Engineering zum Engpass: Der Analyst ist gezwungen, die Auslösebedingungen Schritt für Schritt wiederherzustellen, was Stunden oder Tage in Anspruch nimmt.

Die Situation wird dadurch kompliziert, dass Malware „magische“ Pakete verwendet. Diese sind inaktiv, bis sie eine streng definierte Bytefolge erhalten. Solche Bedingungen sind oft durch Prüfketten mit Offsets und Werten codiert. Selbst im Kontext, beispielsweise durch LLM, reduziert sich die Aufgabe auf das Durchprobieren möglicher Ausführungswege. Mit zunehmender Anzahl von Anweisungen wächst die Komplexität nicht linear, sondern exponentiell.

Die Lösung basiert auf symbolischer Ausführung und der Formalisierung der Aufgabe als Einschränkungssystem (constraints). Anstatt den Code mit konkreten Eingabewerten auszuführen, wird die Eingabe als Variablen dargestellt. Das System verfolgt dann, welche Bedingungen erfüllt sein müssen, um den Zustand ACCEPT zu erreichen. Hierbei wird Z3 verwendet — ein Theorembeweiser, der in der Lage ist, Werte zu finden, die den gegebenen Einschränkungen genügen. Dies verwandelt die Aufgabe von „den gesamten Code verstehen“ in „ein System von Bedingungen lösen“.

Der Kompromiss ist hier offensichtlich. Wir verlieren das intuitive Verständnis des Ausführungsflusses, gewinnen jedoch an Geschwindigkeit und Automatisierung. Dieser Ansatz ist besonders effektiv für deterministische Systeme, bei denen das Ergebnis vollständig von den Eingabedaten abhängt — wie im Fall von BPF-Filtern.

Die Implementierung beginnt mit der Dekomposition des BPF-Programms. Jeder Filter ist eine Sequenz von Anweisungen mit Übergängen. Das System erstellt einen Pfadgraphen und sucht nach denjenigen, die zu ACCEPT führen. Dazu wird eine Warteschlange von Zuständen verwendet, in der gespeichert wird:

  • aktuelle Anweisung
  • Ausführungsweg
  • gesammelte Bedingungen (boolean constraints)

Bei einem bedingten Übergang werden beide Zweige festgehalten, und das System verfolgt, wie viele Bedingungen bis zu ACCEPT durchlaufen werden müssen. Dies ermöglicht es, den kürzesten Weg zu finden — das minimale Set an Bedingungen zur Auslösung des Filters.

Anschließend wird die symbolische Ausführung aktiviert. Es wird ein vereinfachtes Modell einer Maschine mit Registern (im klassischen BPF gibt es zwei) und einem Zustand erstellt. Jede Anweisung wird in einen äquivalenten Z3-Ausdruck übersetzt. Zum Beispiel werden arithmetische Operationen zu Ausdrücken über Bitvektoren. Die Bedingungen für Übergänge verwandeln sich in logische Einschränkungen.

Danach löst Z3 das Problem: Es findet die Werte der Bytes des Pakets, die allen Einschränkungen des Pfades genügen. In der Praxis ergibt dies konkrete Offsets und Werte. Zum Beispiel:

  • Überprüfung der IP-Version (IPv4 oder IPv6)
  • Überprüfung des Protokolls (z. B. UDP)
  • Überprüfung des Zielports

Diese Daten werden dann mit Hilfe von Scapy in echte Netzwerkpakete umgewandelt. Das Ergebnis ist nicht nur ein Ausführungsweg, sondern ein fertiges „magisches“ Paket, das den Backdoor aktiviert.

Die Herausforderungen bei der Implementierung hängen hauptsächlich mit der korrekten Modellierung von Anweisungen und Zuständen zusammen. Obwohl der BPF-Befehlssatz begrenzt ist, müssen Nebenwirkungen, Register und die Ausführungsreihenfolge sorgfältig berücksichtigt werden. Es ist auch wichtig, Verzweigungen korrekt zu behandeln, um gültige Wege nicht zu verlieren.

Das Ergebnis ist eine radikale Verkürzung der Analysezeit. Aufgaben, die früher Stunden manueller Analyse in Anspruch nahmen, werden jetzt in Sekunden gelöst. Dabei findet das System nicht nur den Weg, sondern generiert auch ein reproduzierbares Artefakt — ein Netzwerkpaket. In den Ausgangsdaten gibt es keine genauen Leistungsmetriken, aber der qualitative Effekt ist offensichtlich: Beseitigung des Bottlenecks in der Analyse.

Im weiteren Kontext spiegelt dies den Trend zur Automatisierung des Reverse Engineering durch formale Methoden wider. Symbolische Ausführung wird bereits seit langem in der Analyse von Binärdateien eingesetzt, aber ihre Anwendung auf BPF ist eine pragmatische Erweiterung in Richtung Kernel-Level-Logik. Besonders in Situationen, in denen Geheimhaltung und ein minimaler Footprint traditionelle Methoden weniger effektiv machen.

Der Ansatz eröffnet auch die Möglichkeit zur proaktiven Entdeckung. Die generierten Pakete können zum Scannen von Netzwerken und zur Identifizierung von Implantaten verwendet werden, die ansonsten passiv bleiben. Dies verschiebt die Analyse von reaktiv zu forschend.

Lesen

×

🚀 Deploy the Blocks

Controls: ← → to move, ↑ to rotate, ↓ to drop.
Mobile: use buttons below.