Microsoft ha rilasciato l'implementazione del sottosistema eBPF per Windows, che consente l'esecuzione di handler arbitrari a livello del kernel del sistema operativo. eBPF fornisce un interprete di bytecode integrato nel kernel, che permette di creare handler per operazioni di rete caricabili dallo spazio utente, controllare l'accesso e monitorare il funzionamento dei sistemi. eBPF è incluso nel kernel Linux a partire dalla versione 3.18 e consente di elaborare pacchetti di rete in entrata/uscita, reindirizzare pacchetti, gestire la larghezza di banda, intercettare chiamate di sistema, controllare l'accesso e effettuare tracing. Grazie all'uso della compilazione JIT, il bytecode viene tradotto in istruzioni di macchina in tempo reale e viene eseguito con le prestazioni di un codice compilato. I sorgenti di eBPF per Windows sono disponibili con licenza MIT.
eBPF per Windows può essere utilizzato con gli strumenti esistenti per lavorare con eBPF e fornisce un'API standardizzata, utilizzata per le applicazioni in eBPF su Linux. Il progetto consente di compilare codice scritto in C in bytecode eBPF utilizzando il compilatore eBPF basato su Clang e di eseguire handler eBPF già creati per Linux sopra il kernel di Windows, fornendo un'apposita interfaccia di compatibilità e supportando l'API standard di Libbpf per la compatibilità con le applicazioni interagenti con i programmi eBPF. Sono inoltre offerte interfacce che forniscono hook simili a Linux per XDP (eXpress Data Path) e socket bind, astrando l'accesso allo stack di rete e ai driver di rete di Windows. Tra i piani, è prevista una piena compatibilità a livello di sorgente con gli handler eBPF standard di Linux.

La principale differenza nell'implementazione di eBPF per Windows è l'uso 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 nello spazio utente e viene applicato prima dell'esecuzione dei programmi BPF con l'obiettivo di rilevare errori e bloccare eventuali attività dannose.
Per la verifica in eBPF per Windows viene applicato un metodo di analisi statica basato sull'interpretazione astratta (Abstract Interpretation), che rispetto al verificatore eBPF per Linux dimostra un livello più basso di falsi positivi, supporta l'analisi dei cicli e garantisce una buona scalabilità. Il metodo tiene conto di numerosi modelli tipici di esecuzione, ricavati dall'analisi di programmi eBPF esistenti.
Dopo la verifica, il bytecode viene passato all'interprete, che opera a livello del kernel, o attraverso un compilatore JIT per l'esecuzione del codice macchina risultante con privilegi di kernel. Per isolare gli handler eBPF a livello del kernel viene utilizzato un meccanismo HVCI (HyperVisor-enforced Code Integrity), che sfrutta le risorse di virtualizzazione per proteggere i processi nel kernel e garantire l'integrità del codice eseguito tramite firma digitale. Una limitazione di HVCI è la possibilità di verificare solo i programmi eBPF interpretati e l'impossibilità di utilizzo congiunto del JIT (è fornita una scelta: o prestazioni, o protezione aggiuntiva).
Fonte: opennet.ru
