Die Firma Microsoft hat die Implementierung des eBPF-Subsystems für Windows veröffentlicht, das die Ausführung beliebiger Handler auf der Ebene des Betriebssystemkerns ermöglicht. eBPF bietet einen im Kern integrierten Bytecode-Interpreter, der die Erstellung von im Benutzerspeicher ladbaren Netzwerkoperationen-Handlern ermöglicht, den Zugriff zu kontrollieren und die Systemarbeit zu überwachen. eBPF ist seit der Kernel-Version 3.18 Teil des Linux-Kernels und ermöglicht die Verarbeitung von eingehenden und ausgehenden Netzwerkpaketen, die Umleitung von Paketen, die Verwaltung der Bandbreite, das Abfangen von Systemaufrufen, die Zugriffskontrolle und das Tracing. Durch die Verwendung von JIT-Kompilierung wird der Bytecode zur Laufzeit in Maschinenanweisungen übersetzt und mit der Leistung von kompiliertem Code ausgeführt. Der Quellcode von eBPF für Windows ist unter der MIT-Lizenz verfügbar.
eBPF für Windows kann mit bereits vorhandenen Tools für die Arbeit mit eBPF verwendet werden und bietet eine standardisierte API, die für eBPF-Anwendungen unter Linux genutzt wird. Das Projekt ermöglicht es unter anderem, in C geschriebene Codes in eBPF-Bytecode mithilfe des Standard-eBPF-Compilers auf Clang-Basis zu kompilieren und bereits für Linux entwickelte eBPF-Handler unter dem Windows-Kernel auszuführen, wobei eine spezielle Kompatibilitätsschicht bereitgestellt wird, die die Standard-API Libbpf zur Interaktion mit eBPF-Anwendungen unterstützt. Darüber hinaus werden Schichten angeboten, die Linux-ähnliche Hooks für XDP (eXpress Data Path) und Socket-Bind bereitstellen, um den Zugriff auf den Netzwerkstack und die Netzwerktreiber von Windows zu abstrahieren. Zu den zukünftigen Plänen gehört die Bereitstellung einer vollständigen Quellkompatibilität mit standardmäßigen eBPF-Handlern unter Linux.

Ein wesentliches Merkmal der eBPF-Implementierung für Windows ist der Einsatz eines alternativen Bytecode-Verifiers, der ursprünglich von Mitarbeitern von VMware sowie Forschern aus kanadischen und israelischen Universitäten vorgeschlagen wurde. Der Verifier wird in einem separaten, isolierten Prozess im Benutzerspeicherraum ausgeführt und kommt vor der Ausführung von BPF-Programmen zum Einsatz, um Fehler zu identifizieren und potenziell schädliche Aktivitäten zu blockieren.
Für die Überprüfung in eBPF für Windows wird eine statische Analyse mithilfe abstrakter Interpretation (Abstract Interpretation) angewendet, die im Vergleich zum eBPF-Verifier für Linux eine geringere Rate an Fehlalarmen zeigt, Zyklenanalysen unterstützt und eine gute Skalierbarkeit gewährleistet. Diese Methode berücksichtigt zahlreiche typische Ausführungsmuster, die auf der Analyse bestehender eBPF-Programme basieren.
Nach der Verifizierung wird der Bytecode an einen Interpreter übergeben, der auf Kernel-Ebene arbeitet, oder durch einen JIT-Compiler geleitet, gefolgt von der Ausführung des resultierenden Maschinen-Codes mit Kernel-Rechten. Zur Isolation von eBPF-Handlern auf Kernel-Ebene wird der Mechanismus HVCI (HyperVisor-enforced Code Integrity) angewendet, der Virtualisierungsressourcen nutzt, um Prozesse im Kernel zu schützen und die Integrität des ausgeführten Codes durch digitale Signaturen zu bestätigen. Eine Einschränkung von HVCI besteht darin, dass nur interpretierbare eBPF-Programme verifiziert werden können und eine gleichzeitige Nutzung mit JIT nicht möglich ist (es wird eine Wahl getroffen – entweder Leistung oder zusätzlicher Schutz).
Quelle: opennet.ru
