# EBPF

eBPF é uma tecnologia que pode executar programas em um contexto privilegiado, como o kernel do sistema operacional . É o sucessor do mecanismo de filtragem Berkeley Packet Filter (BPF, com o "e" originalmente significando "estendido") no Linux e também é usado em outras partes do kernel do Linux. Ele é usado para estender com segurança e eficiência os recursos do kernel em tempo de execução, sem exigir alterações no código-fonte do kernel ou carregar módulos do kernel . A segurança é fornecida por meio de um verificador no kernel que executa análise estática de código e rejeita programas que travam, travam ou interferem negativamente no kernel.
Este modelo de validação difere dos ambientes em sandbox, onde o ambiente de execução é restrito e o tempo de execução não tem insights sobre o programa. Exemplos de programas que são rejeitados automaticamente são programas sem fortes garantias de saída (ou seja, loops for/while sem condições de saída) e programas que desreferenciam ponteiros sem verificações de segurança.

## Projeto

Os programas carregados que passaram no verificador são interpretados ou compilados just-in-time no kernel (compilados JIT) para desempenho de execução nativo. O modelo de execução é orientado a eventos e, com poucas exceções , é executado até a conclusão, o que significa que os programas podem ser anexados a vários pontos de gancho no kernel do sistema operacional e executados após o acionamento de um evento. Os casos de uso de eBPF incluem (mas não estão limitados a) redes como XDP, rastreamento e subsistemas de segurança . Dado que a eficiência e flexibilidade do eBPF abriram novas possibilidades para resolver problemas de produção, Brendan Gregg apelidou o eBPF de "superpoderes para Linux". Linus Torvalds disse: "O BPF tem sido realmente muito útil, e o verdadeiro poder dele é como ele permite que as pessoas criem códigos especializados que não são habilitados até serem solicitados". Devido ao seu sucesso no Linux, o tempo de execução do eBPF foi portado para outros sistemas operacionais como o Windows .

## História

O eBPF foi construído sobre o Berkeley Packet Filter (cBPF). No nível mais baixo, introduziu o uso de dez registradores de 64 bits (em vez de dois registradores longos de 32 bits para cBPF), semântica de salto diferente, uma instrução de chamada e convenção de passagem de registrador correspondente, novas instruções e uma codificação diferente para estes. instruções.
Marcos mais significativos na evolução do eBPF :
| Data | Evento |
| Abril de 2011 | O primeiro compilador jit dentro do kernel Linux do clássico Berkley Packet Filter é mesclado. |
| Janeiro de 2012 | O primeiro caso de uso não relacionado a redes do clássico Berkeley Packet Filter, seccomp-bpf, aparece. Permite que chamadas de sistema sejam filtradas usando um política implementada através e instruções BPF. |
| Março de 2014 | David S. Miller, o mantenedor primário da pilha de rede do Linux, aceita o antigo retrabalhado interpretador EBF dentro do kernel. Ele foi substituído pelo interpretador eBPF e o kernel Linux traduz internamente as instruções clássicas BPF(cBPF) em ePBF. |
| Março de 2015 | The ability to attach eBPF to kprobes as first tracing use case was merged. In the same month, initial infrastructure work got accepted to attach eBPF to the networking traffic control (tc) layer allowing to attach eBPF to the core ingress and later also egress paths of the network stack, later heavily used by projects such as Cilium. |
| Agosto de 2015 | O backend eBPF foi mesclado no release 3.7.0 do LLVM. |
| Setembro de 2015 | Brendan Gregg anunciou um coleção de novas ferramentas de tracing baseadas em eBPF, como o projeto bcc, provendo um front-end para o eBPF para facilitar escrever programas. |
| Julho de 2016 | eBPF got the ability to be attached into network driver's core receive path. This layer is known today as eXpress DataPath (XDP) and was added as a response to DPDK to create a fast data path which works in combination with the Linux kernel rather than bypassing it. |
| Agosto de 2016 | Cilium was initially announced during LinuxCon as a project providing fast IPv6 container networking with eBPF and XDP. Today, Cilium has been adopted by major cloud provider's Kubernetes offerings and is one of the most widely used CNIs. |
| Novembro de 2016 | Netronome added offload of eBPF programs for XDP and tc BPF layer to their NIC. |
| Maio de 2017 | O loadbalance de nível 4 da Meta, Katran, vai ao ar. Todo pacote direcionado ao facebook.com dês de então tem sido processado por eBPF & XDP. |
| Novembro de 2017 | A eBPF se torna o seu próprio subsistema para facilitar o crescimento contínuo do gerenciamento de patches. O primeiro pull request por um mantenedor do eBPF é submetido. |
| Setembro de 2017 | Bpftool foi adicionado ao kernel Linux como um utilitário de user space para fazer instrospeção do subsistema eBPF. |
| Janeiro de 2018 | Uma nova família de sockets chamada AF_XDP foi publicada, permitindo que o processamento de pacotes de alta performance com semântica de zero-copy no nível XDP. Hoje, DPDK tem suporte official a um driver poll-mode AF_XDP. |
| Fevereiro de 2018 | O protótio do bpfilter foi publicado, permitindo a tradução de um subconjunto de regras iptables em eBPF através de um modo de usuário desenvolvido recentemente. O trabalho causou controvérsias devido ao desenvolvimento corrente do nftables e não foi mesclado na linha principal. |
| Outubro de 2018 | A nova ferramenta bpftrace foi anunciada por Brendan Gregg como DTrace 2.0 para Linux. |
| Novembro de 2018 | Introspecção eBPF foi adicionada para o kTLS para suportar a capacidade de enforcement políticas de TLS dentro do kernel. |
| Novembro de 2018 | O BTF (BPF Type Format) foi adicionado ao kernel Linux com um formato de meta data eficiente que é aproximadamente 100 vezes menor que o DWARF. |
| Dezembro de 2019 | O primeiro livro de 800 páginas sobre BPF, escrito por Brendan Gregg, foi lançado. |
| Março de 2020 | O Google upstreamed o suporte a BPF LSM no kernel Linux, possibilitando Linux Security Modules (LSMs) prográmveis através do eBPF. |
| Setembro de 2020 | O backend eBPF para o GNU Compiler Collection (GCC) foi mesclado. |

## Marca

O alias eBPF é frequentemente usado de forma intercambiável com BPF, por exemplo pela comunidade do kernel Linux. eBPF e BPF são chamados de nomes de tecnologia como LLVM . O eBPF evoluiu do Berkeley Packet Filter como uma versão estendida, mas seu caso de uso superou a rede, e hoje o eBPF como pseudo-acrônimo é o preferido.
A abelha é o logotipo oficial da eBPF. No primeiro Summit da eBPF houve votação e a mascote abelha foi batizada de “eBee”. O logotipo foi originalmente criado por Vadim Shchekoldin. Mascotes eBPF não oficiais anteriores existiram no passado, mas não foram amplamente adotados.

## Governança

A Fundação eBPF foi criada em agosto de 2021 com o objetivo de expandir as contribuições feitas para ampliar os poderosos recursos do eBPF e crescer além do Linux. Os membros fundadores incluem Meta, Google, Isovalent, Microsoft e Netflix . O objetivo é arrecadar, orçamentar e gastar fundos em apoio a vários projetos de código aberto, dados abertos e/ou padrões abertos relacionados às tecnologias eBPF para impulsionar ainda mais o crescimento e a adoção do ecossistema eBPF. Desde o início, Red Hat, Huawei, Crowdstrike, Tigera, DaoCloud, Datoms, FutureWei também aderiram.

## Adoção

O eBPF foi adotado por vários usuários de produção em larga escala, por exemplo:
* A Meta usa eBPF através do seu load blancer Katran para todo trafego para facebook.com
* O Google usa eBPF no GKE, ele desenvolve e usa BPF LSM para substituir audit e usa eBPF para networking
* A Cloudflare usa eBPF para load-balancing e proteção contra DDoS e reforço de segurança
* O Netflix usa eBPF para observabilidade em nível de frota da rede e diagnóstico de performance
* O Dropbox usa eBPF através do Katran para load-balancing de nível 4
* O Android usa eBPF para NAT46 e monitoramento de trafego
* O Samsung Galaxy usa eBPF para soluções de rede
* O Yahoo! Inc usa eBPF através do loadblancer de nível 4 Cilium
* O LinkedIn usa eBPF para observabilidade de infraestrutura
* O Alibaba usa eBPF para o seu loadbalances de Pod Kubernetes
* A Datadog usa eBPF para a reforçar a rede e segurança de Kubernetes Pod
* A Trip.com usa eBPF para rede Kubernetes Pod
* A Shopify usa eBPF para detecção de intrusão através do Falco
* O DoorDash usa eBPF através do BPFAgent para monitoramento em nível de kernel
* A Microsoft portou o eBPF e XDP para o Windows
* A Seznam usa eBPF atraves do loadbalancer de nível 4 Cilium
* A DigitalOcean usa eBPF e XDP para limitar a taxa de acesso a serviços internos em seu rede virtual
* A CapitalOne usa eBPF para rede de Kubernetes Pod
* A Bell Canada usa eBPF para modernizar a rede de telco com SRv6
* A Elastic_NV usa eBPF para for code profiling como parte das suas ofertas de observabilidade
* A Apple usa eBPF para segurança de Kubernetes
* A Sky usa eBPF para rede Kubernetes Pod
* O Walmart usa eBPF para loadbalancing de nível 4
* A Huawei usa eBPF atraves do seu sistema boot seguro DIGLIM
* A Ikea usa eBPF para rede Kubernetes Pod
* O The New York Times usa eBPF para rede
* A Red Hat usa eBPF em escala para loadblancing e tracing de sua nuvem privada
* A Palantir Technologies usa eBPF para debugar problemas de rede em clusters Kubernetes em larga escala

## Segurança

Devido à facilidade de programação, o eBPF tem sido usado como uma ferramenta para implementar ataques de canal lateral de temporização microarquitetural, como Spectre, contra microprocessadores vulneráveis. Embora o eBPF sem privilégios tenha implementado mitigações contra ataques de execução transitórios, o uso sem privilégios foi finalmente desabilitado pela comunidade do kernel por padrão para proteger contra uso contra futuras vulnerabilidades de hardware.