Microsoft ha pubblicato l'implementazione del sottosistema eBPF per Windows, che consente l'esecuzione di gestori arbitrari a livello del kernel del sistema operativo. eBPF fornisce un interprete di bytecode integrato nel kernel, che consente la creazione di gestori di operazioni di rete caricabili dallo spazio utente, il controllo degli accessi e il monitoraggio delle operazioni di sistema. eBPF è incluso nel kernel di Linux a partire dalla versione 3.18 e permette di elaborare pacchetti di rete in entrata/uscita, reindirizzare pacchetti, gestire la larghezza di banda, intercettare chiamate di sistema, controllare accessi e implementare tracciamento. Grazie all'uso della compilazione JIT, il bytecode viene tradotto in istruzioni macchina in tempo reale e viene eseguito con la velocità di un codice compilato. I codici sorgente di eBPF per Windows sono pubblici con licenza MIT.
eBPF per Windows può essere utilizzato con gli strumenti esistenti per lavorare con eBPF e offre un'API standard utilizzabile per le applicazioni eBPF in Linux. Inoltre, il progetto consente la compilazione di codice scritto in C in bytecode eBPF tramite il compilatore eBPF basato su Clang e l'esecuzione di gestori eBPF già creati per Linux sopra il kernel di Windows, fornendo uno strato di compatibilità speciale e supportando l'API Libbpf per la compatibilità con le applicazioni che interagiscono con programmi eBPF. Sono previste anche interfacce che offrono hook simili a Linux per XDP (eXpress Data Path) e socket bind, astrarre l'accesso allo stack di rete e ai driver di rete di Windows. Tra i piani è prevista la fornitura di compatibilità completa a livello di codice sorgente con gestori eBPF standard di Linux.

La principale differenza nell'implementazione di eBPF per Windows è l'utilizzo di un verificatore di bytecode alternativo, originariamente proposto da dipendenti di VMware e ricercatori di università canadesi e israeliane. Il verificatore viene eseguito in un processo isolato separato nello spazio utente e viene applicato prima dell'esecuzione dei programmi BPF per identificare errori e bloccare eventuali attività dannose.
Per il controllo in eBPF per Windows viene utilizzato un metodo di analisi statica basato sull'interpretazione astratta (Abstract Interpretation), che, rispetto al verificatore eBPF per Linux, mostra un livello inferiore di falsi positivi, supporta l'analisi dei cicli e offre una buona scalabilità. Il metodo tiene conto di numerosi schemi di esecuzione tipici, ottenuti dall'analisi di programmi eBPF esistenti.
Dopo la verifica, il bytecode viene inviato a un interprete che opera a livello di kernel, oppure passato a un compilatore JIT, seguito dall'esecuzione del codice macchina risultante con i diritti del kernel. Per isolare i gestori eBPF a livello di kernel viene applicato il meccanismo HVCI (HyperVisor-enforced Code Integrity), che utilizza tecniche di virtualizzazione per proteggere i processi nel kernel e garantisce la convalida dell'integrità del codice eseguito tramite firma digitale. Una limitazione di HVCI è la possibilità di convalidare solo i programmi eBPF interpretabili e l'impossibilità di utilizzarlo in combinazione con JIT (viene fornita la scelta: o prestazioni o protezione aggiuntiva).
Fonte: opennet.ru
