A Microsoft lançou uma implementação da subsistema eBPF para Windows, permitindo a execução de manipuladores arbitrários que operam a nível do núcleo do sistema operacional. O eBPF fornece um interpretador de bytecode embutido no núcleo, possibilitando a criação de manipuladores de operações de rede que podem ser carregados a partir do espaço do usuário, controlar o acesso e monitorar o desempenho do sistema. O eBPF está incluído no núcleo do Linux desde a versão 3.18 e permite o processamento de pacotes de rede de entrada/saída, redirecionamento de pacotes, gerenciamento de largura de banda, intercepção de chamadas de sistema, controle de acesso e rastreamento. Graças ao uso da compilação JIT, o bytecode é traduzido em instruções de máquina em tempo real e executado com a performance de código compilado. Os códigos fonte do eBPF para Windows são abertos sob a licença MIT.
O eBPF para Windows pode ser utilizado com as ferramentas já existentes para trabalhar com eBPF e fornece uma API padrão, aplicável para aplicativos eBPF em Linux. O projeto permite que o código escrito em C seja compilado em bytecode eBPF usando o compilador padrão eBPF baseado no Clang e execute os manipuladores eBPF já criados para Linux sobre o núcleo do Windows, oferecendo uma camada especial de compatibilidade e suportando a API padrão Libbpf para compatibilidade com aplicativos que interagem com programas eBPF. Também são oferecidas camadas que fornecem hooks semelhantes ao Linux para XDP (eXpress Data Path) e bind de socket, abstraindo o acesso à pilha de rede e aos drivers de rede do Windows. Entre os planos está a implementação de compatibilidade total em nível de código-fonte com manipuladores eBPF padrão do Linux.

A principal diferença na implementação do eBPF para Windows é o uso de um verificador de bytecode alternativo, inicialmente proposto por funcionários da VMware e pesquisadores de universidades canadenses e israelenses. O verificador é iniciado em um processo isolado separado no espaço do usuário e é aplicado antes da execução dos programas BPF com o objetivo de detectar erros e bloquear possíveis atividades maliciosas.
Para verificação do eBPF para Windows, é aplicado um método de análise estática baseado em interpretação abstrata (Abstract Interpretation), que em comparação com o verificador eBPF para Linux demonstra um nível mais baixo de falsos positivos, suporta a análise de loops e proporciona boa escalabilidade. O método leva em conta diversos padrões típicos de execução, obtidos a partir da análise de programas eBPF existentes.
Após a verificação, o bytecode é enviado para o interpretador, que opera no nível do núcleo, ou passa por um compilador JIT, seguido pela execução do código de máquina resultante com direitos de núcleo. Para isolar os manipuladores do eBPF no nível do núcleo, é aplicado o mecanismo HVCI (HyperVisor-enforced Code Integrity), que utiliza recursos de virtualização para proteger processos no núcleo e garantir a integridade do código executável por meio de assinatura digital. A limitação do HVCI é a possibilidade de verificação apenas de programas eBPF interpretáveis e a impossibilidade de uso conjunto com JIT (sendo oferecida a escolha — ou desempenho, ou proteção adicional).
Fonte: opennet.ru
