La société Microsoft a publié une implémentation de la sous-système eBPF pour Windows, permettant d'exécuter des gestionnaires arbitraires fonctionnant au niveau du noyau du système d'exploitation. eBPF fournit un interpréteur de bytecode intégré au noyau, permettant de créer des gestionnaires d'opérations réseau chargeables depuis l'espace utilisateur, de contrôler l'accès et de surveiller le fonctionnement des systèmes. eBPF est inclus dans le noyau Linux depuis le lancement de la version 3.18 et permet de traiter les paquets réseau entrants/sortants, de rediriger des paquets, de gérer la bande passante, d'intercepter des appels système, de contrôler l'accès et de réaliser des traçages. Grâce à l'utilisation de la compilation JIT, le bytecode est instantanément traduit en instructions machine et exécuté avec la performance d'un code compilé. Les codes sources de eBPF pour Windows sont ouverts sous licence MIT.
eBPF pour Windows peut être utilisé avec des outils existants pour eBPF et fournit une API standard appliquée aux applications eBPF sous Linux. En particulier, le projet permet de compiler du code écrit en C en bytecode eBPF à l'aide du compilateur eBPF basé sur Clang et d'exécuter des gestionnaires eBPF déjà créés pour Linux au-dessus du noyau Windows, offrant une couche de compatibilité spéciale et prenant en charge l'API standard Libbpf pour la compatibilité avec les applications interagissant avec les programmes eBPF. Des couches sont également proposées, offrant des hooks similaires à Linux pour XDP (eXpress Data Path) et socket bind, abstrahant l'accès à la pile réseau et aux pilotes réseau de Windows. Parmi les projets à venir, une compatibilité complète au niveau des sources avec des gestionnaires eBPF standards de Linux est prévue.

La principale différence de l'implémentation de eBPF pour Windows est l'utilisation d'un vérificateur de bytecode alternatif, initialement proposé par des employés de VMware et des chercheurs de universités canadiennes et israéliennes. Le vérificateur s'exécute dans un processus distinct et isolé dans l'espace utilisateur et est appliqué avant l'exécution des programmes BPF afin d'identifier les erreurs et de bloquer toute activité potentiellement malveillante.
Pour la vérification dans eBPF pour Windows, une méthode d'analyse statique basée sur l'interprétation abstraite est utilisée, qui, par rapport au vérificateur eBPF pour Linux, démontre un niveau plus bas de faux positifs, prend en charge l'analyse des boucles et offre une bonne évolutivité. La méthode prend en compte de nombreux modèles d'exécution types, obtenus grâce à l'analyse des programmes eBPF existants.
Après vérification, le bytecode est transmis à un interpréteur fonctionnant au niveau du noyau, ou il passe par un compilateur JIT avant que le code machine résultant soit exécuté avec les droits du noyau. Pour isoler les gestionnaires eBPF au niveau du noyau, un mécanisme HVCI (HyperVisor-enforced Code Integrity) est appliqué, utilisant des moyens de virtualisation pour protéger les processus dans le noyau et garantir l'intégrité du code exécuté par une signature numérique. La limitation du HVCI est qu'il est seulement possible de vérifier les programmes eBPF interprétés et qu'il ne peut pas être utilisé en même temps qu'un JIT (un choix est donné — soit la performance, soit une protection supplémentaire).
Source : opennet.ru
