Microsoft heeft een implementatie van de eBPF-subsysteem voor Windows gepubliceerd, waarmee willekeurige handlers kunnen worden uitgevoerd die op het niveau van de besturingssysteemkernel werken. eBPF biedt een ingebouwde bytecode-interpreter in de kernel, die de mogelijkheid biedt om vanuit de gebruikersruimte geladen netwerkbewerkers te creƫren, de toegang te beheersen en de werking van systemen te volgen. eBPF is opgenomen in de Linux-kernel sinds versie 3.18 en maakt het mogelijk om binnenkomende/uitgaande netwerkpakketten te verwerken, pakketten te omleiden, de bandbreedte te beheren, systeemaanroepen af te vangen, de toegang te controleren en tracing uit te voeren. Dankzij het gebruik van JIT-compilatie wordt bytecode on-the-fly omgezet in machine-instructies en uitgevoerd met de prestaties van gecompileerde code. De sourcecode van eBPF voor Windows is open onder de MIT-licentie.
eBPF voor Windows kan worden gebruikt met bestaande eBPF-tools en biedt een standaard API, die wordt gebruikt voor eBPF-toepassingen in Linux. Het project maakt het ook mogelijk om C-code te compileren naar eBPF-bytecode met behulp van de standaard eBPF-compiler op basis van Clang en om al gemaakte eBPF-handlers voor Linux bovenop de Windows-kernel uit te voeren, met een speciale compatibiliteitslaag en het standaard Libbpf-API voor compatibiliteit met applicaties die communiceren met eBPF-programma's. Daarnaast worden er lagen aangeboden die Linux-achtige hooks voor XDP (eXpress Data Path) en socket bind bieden, die de toegang tot de netwerkstack en netwerkdrivers van Windows abstraheren. Van de plannen wordt opgemerkt dat volledige compatibiliteit op het niveau van broncode met typische eBPF-handlers voor Linux zal worden geboden.

Het belangrijkste verschil in de eBPF-implementatie voor Windows is het gebruik van een alternatieve bytecode-verifier, oorspronkelijk voorgesteld door medewerkers van VMware en onderzoekers van Canadese en Israëlische universiteiten. De verifier wordt uitgevoerd in een aparte geïsoleerde proces in de gebruikersruimte en wordt toegepast vóór de uitvoering van BPF-programma's om fouten te detecteren en mogelijke kwaadaardige activiteiten te blokkeren.
Voor de verificatie in eBPF voor Windows wordt een statische analysemethode toegepast die is gebaseerd op abstracte interpretatie, wat in vergelijking met de eBPF-verificator voor Linux een lagere mate van valse positieven laat zien, ondersteuning biedt voor de analyse van lussen en goede schaalbaarheid biedt. De methode houdt rekening met een verscheidenheid aan typische uitvoeringssjablonen, verkregen op basis van de analyse van bestaande eBPF-programma's.
Na verificatie wordt de bytecode doorgegeven aan een interpreter die op kernelniveau werkt, of wordt deze door een JIT-compiler geleid, waarna de resulterende machinecode met kernelrechten wordt uitgevoerd. Voor de isolatie van eBPF-handlers op kernelniveau wordt het HVCI-mechanisme (HyperVisor-enforced Code Integrity) toegepast, dat gebruikmaakt van virtualisatietechnieken om processen in de kernel te beschermen en integriteitsbevestiging van de uitgevoerde code via digitale handtekeningen te waarborgen. Een beperking van HVCI is dat alleen interpreterbare eBPF-programma's kunnen worden geverifieerd en dat het niet samen met JIT kan worden gebruikt (er is een keuze ā of prestaties of extra bescherming).
Bron: opennet.ru
