En mode utilisateur, vous pouvez définir des filtres individuels pour l'interface du Berkeley-Filter à tout moment. Dans le passé, les codes correspondants étaient écrits manuellement et traduits en un bytecode BPF. Aujourd'hui, grâce au LLVM Clang Compiler, il est possible de traduire directement les bytecodes.
Les bibliothèques du noyau d'exploitation contiennent également des exemples de programmes qui simplifient la définition des programmes eBPF. Diverses fonctions d’aide vous simplifient le travail.
Les vérificateurs de sécurité de l'eBPF
L’exécution d’appels système dans le noyau est toujours associée à certains risques de sécurité et de stabilité. Avant qu’un eBPF SysCall ne se charge, il doit passer un certain nombre de contrôles :
- On vérifie tout d’abord si l’appel système a été interrompu et ne contient pas de boucles. Cela pourrait conduire à un crash du noyau. Le graphique de flux de contrôle du programme est vérifié pour trouver les déclarations inaccessibles qui ne sont pas chargées par la suite.
- Avant et après l’exécution d’une instruction, l’état de l’appel au système eBPF est vérifié. Cela permet de garantir que le BPF étendu ne fonctionne que dans les limites autorisées et n'accède pas aux données en dehors de la Sandbox. Il n’est pas nécessaire de vérifier chaque voie individuellement. Un sous-ensemble est généralement suffisant pour cela.
- Enfin, le type de SysCall est également défini. Cette étape est importante pour limiter les fonctions du noyau qui peuvent être appelées depuis le SysCall et les structures de données auxquelles on peut accéder. Par exemple, vous pouvez utiliser des appels système qui accèdent directement aux données par paquets du réseau.
Les types SysCall traitent en gros quatre fonctions : où le programme peut être joint, quelles fonctions d'aide du noyau peuvent être appelées, si les données par paquets du réseau sont accessibles directement ou non et quel type d’objet est transmis avec priorité dans un appel système.
Actuellement, les types de SysCall eBPF suivants sont pris en charge par le noyau :
- BPF_PROG_TYPE_SOCKET_FILTER
- BPF_PROG_TYPE_KPROBE
- BPF_PROG_TYPE_SCHED_CLS
- BPF_PROG_TYPE_SCHED_ACT
- BPF_PROG_TYPE_TRACEPOINT
- BPF_PROG_TYPE_XDP
- BPF_PROG_TYPE_PERF_EVENT
- BPF_PROG_TYPE_CGROUP_SKB
- BPF_PROG_TYPE_CGROUP_SOCK
- BPF_PROG_TYPE_LWT_ *
- BPF_PROG_TYPE_SOCK_OPS
- BPF_PROG_TYPE_SK_SKB
- BPF_PROG_CGROUP_DEVICE