Microsoft подготовил реализацию eBPF для Windows

Компания Microsoft опубликовала реализацию подсистемы eBPF для Windows, позволяющую запускать произвольные обработчики, работающие на уровне ядра операционной системы. eBPF предоставляет встроенный в ядро интерпретатор байткода, дающий возможность создавать загружаемые из пространства пользователя обработчики сетевых операций, контролировать доступ и отслеживать работу систем. eBPF включён в состав ядра Linux начиная с выпуска 3.18 и позволяет обрабатывать входящие/исходящие сетевые пакеты, перенаправлять пакеты, управлять пропускной способностью, перехватывать системные вызовы, контролировать доступ и осуществлять трассировку. Благодаря применению JIT-компиляции, байткод на лету транслируется в машинные инструкции и выполняется с производительностью скомпилированного кода. Исходные тексты eBPF для Windows открыты под лицензией MIT.

eBPF для Windows может применяться с уже существующими инструментами для работы eBPF и предоставляет типовой API, применяемый для eBPF-приложений в Linux. В том числе проект позволяет компилировать написанный на языке Си код в байткод eBPF при помощи штатного компилятора eBPF на базе Clang и запускать уже созданные для Linux обработчики eBPF поверх ядра Windows, предоставляя специальную прослойку совместимости и поддерживая штатный API Libbpf для совместимости c приложениями, взаимодействующими с программами 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 (предоставляется выбор – либо производительность, либо дополнительная защита).

Release. Ссылка here.