
Ein Linux-Kernel-Rootkit in Rust, das einen eigens entwickelten Typ-2-Hypervisor sowie eBPF-XDP- und TC-Programme verwendet.
BlackPill ist ein heimliches Linux-Rootkit, geschrieben in Rust.
Das Rootkit besteht aus mehreren Modulen (gemeint sind Rust-Module, keine Kernel-Module):
Die Architektur sieht wie folgt aus:

Und so wird bösartiger Code von der C2 an den VM-Gast übertragen und dort ausgeführt:

Die C2 sendet maßgeschneiderte, assemblierte x86_64-Mnemonics an das Rootkit, das sie anschließend zur Ausführung an den VM-Gast sendet. Der VM-Gast ist vom Host isoliert und kann zur Ausführung von bösartigem Code verwendet werden.
Der Kernel sieht keine eingehenden bösartigen Pakete, da sie vom eBPF-XDP-Programm gefiltert und an das LKM-Modul gesendet werden; ausgehende Pakete werden vom eBPF-TC-Programm modifiziert.
[!IMPORTANT]
Dieses Projekt befindet sich noch in der Entwicklung. Nicht alle Funktionen sind funktionsfähig!
Sie können gerne Issues oder Pull Requests einreichen.
Hooking ist eine grundlegende Fähigkeit des Rootkits und wird mithilfe von kprobes im Linux-Kernel implementiert. Diese Technik fängt die Ausführung von Systemfunktionen ab und leitet sie um, um ihr Verhalten zu überwachen oder zu verändern. Im Kontext dieses Rootkits bietet kprobes einen leistungsstarken Mechanismus, um mit Kernel-Funktionen zu interagieren, ohne den Quellcode direkt zu verändern.
Um Tarnung zu gewährleisten, setzt das Rootkit zwei primäre Anti-Erkennungsmechanismen ein:
Entfernen des Moduls aus der Kernel-Modulliste
Wenn ein Kernel-Modul geladen wird, wird es zur Modulliste des Kernels hinzugefügt, die über Werkzeuge wie lsmod oder /proc/modules sichtbar ist. Um die Erkennung zu verhindern:
Hooking der filldir64-Funktion, um ein bestimmtes Verzeichnis zu verbergen
Um vom Rootkit verwendete Dateien zu verbergen, wird ein Hook auf die filldir64-Funktion implementiert. Diese Funktion wird aufgerufen, wenn ein Prozess den Inhalt eines Verzeichnisses liest (z. B. über getdents- oder readdir-Systemaufrufe).
filldir64-Funktion mithilfe von kprobes ab./BLACKPILL-BLACKPILL entspricht (das zum Speichern kritischer Rootkit-Dateien verwendet wird), wird er herausgefiltert und nicht an den Benutzer zurückgegeben.Verwendung von eBPF-XDP- und TC-Programmen zur Änderung des ein- und ausgehenden Netzwerkverkehrs
Um unsere bösartige Netzwerkkommunikation zu normalisieren, verwenden wir eBPF-XDP- (eXpress Data Path) und TC-Programme (Traffic Control). Dadurch können wir:
Unser einfacher Hypervisor wurde wie folgt implementiert:
Initiale Systemkonfiguration
Eintritt in den VMX- oder SVM-Modus
Verwalten der Übergänge zwischen Host und Gast
Erstellung des Gastsystems
Kommunikation
Persistenz ist eine entscheidende Fähigkeit eines jeden Rootkits, da sie es ihm ermöglicht, die Kontrolle über das Zielsystem auch nach einem Neustart aufrechtzuerhalten.
In seiner aktuellen Implementierung demonstriert der Persistenzmechanismus seine Funktionalität, indem er mithilfe des /bin/touch-Befehls eine Testdatei im Dateisystem erstellt. Diese Platzhalteraktion zeigt die Fähigkeit des Rootkits, privilegierte Operationen auszuführen, und kann erweitert werden, um fortschrittlichere Persistenzstrategien zu implementieren.
Dies ist inzwischen hinfällig, da es nicht unsere Priorität ist, ein Rootkit auf APT-Niveau zu entwickeln, sondern mehr Forschung zu weniger verbreiteten Konzepten zu betreiben.
Vor dem Kompilieren unseres Rootkits sind mehrere Schritte erforderlich. Die Entwicklungsumgebung besteht aus:
Beginnen Sie mit dem Klonen des Repositorys und seiner flachen Submodule:
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1
Auf einer Arch-basierten Distribution:
sudo pacman -S qemu-base qemu-desktop docker grub
Installieren Sie auf einer Arch-basierten Linux-Distribution Rust und andere Abhängigkeiten:
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm
Danach benötigen wir die Rust-Quellen und bindgen:
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli