Компания Microsoft публикува реализация на подсистемата eBPF за Windows, която позволява изпълнението на произволни обработчици, работещи на ниво ядрото на операционната система. eBPF предоставя вграден в ядрото интерпретатор на байткод, който дава възможност за създаване на обработчици на мрежови операции, зареждащи се от потребителското пространство, контрол на достъпа и проследяване на работата на системите. eBPF е включен в ядрото на Linux от версия 3.18 и позволява обработка на входящи/изходящи мрежови пакети, пренасочване на пакети, управление на пропускателната способност, прихващане на системни повиквания, контрол на достъпа и проследяване. Чрез прилагане на JIT компилация, байткодът на живо се транслира в машинни инструкции и се изпълнява с производителността на скомпилиран код. Изходните текстове на eBPF за Windows са отворени под лицензия MIT.
eBPF за Windows може да се използва с вече съществуващите инструменти за работа с eBPF и предоставя стандартен API, използван за eBPF приложения в Linux. Проектът предлага възможност за компилиране на код написан на Си в байткод на eBPF с помощта на стандартен eBPF компилатор, базиран на Clang, и за изпълнение на вече създадени eBPF обработчици за Linux върху ядрото на Windows, предоставяйки специален слой съвместимост и поддържайки стандартния API Libbpf за съвместимост с приложения, взаимодействуващи с eBPF програми. Включени са и слоеве, осигуряващи Linux-подобни hook-ове за XDP (eXpress Data Path) и socket bind, абстрахиращи достъпа до мрежовия стек и мрежовите драйвери на Windows. От плановете е отбелязана предоставянето на пълна съвместимост на ниво изходни текстове с типични eBPF обработчици на Linux.

Ключовото отличие в реализацията на eBPF за Windows е използването на алтернативен верификатор на байткод, предложен първоначално от служители на VMware и изследователи от канадски и израелски университети. Верификаторът се изпълнява в отделен изолиран процес в потребителското пространство и се прилага преди изпълнението на BPF програми с цел откриване на грешки и блокиране на възможна зловредна активност.
За проверка в eBPF за Windows се прилагава метод на статичен анализ на базата на абстрактна интерпретация (Abstract Interpretation), който в сравнение с верификатора на eBPF за Linux демонстрира по-ниско ниво на лъжливи сработвания, поддържа анализ на цикли и осигурява добра мащабируемост. Методът взема предвид множество типови шаблони на изпълнение, получени на базата на анализа на съществуващите eBPF-програми.
След верификацията байткодът се предава на интерпретатор, работещ на ниво ядрото, или се пропуска през JIT-компилатор с последващо изпълнение на получения машинен код с права на ядро. За изолацията на обработчиците eBPF на ниво ядро се прилага механизъм HVCI (HyperVisor-enforced Code Integrity), който използва виртуализационни средства за защита на процесите в ядрото и осигурява потвърждение на целостта на изпълнявания код по цифров подпис. Ограничението на HVCI е възможността за верификация само на интерпретируеми eBPF-програми и невъзможността за използване съвместно с JIT (предоставя се избор — или производителност, или допълнителна защита).
Източник: opennet.ru
