L'eBPF (extended Berkeley Packet Filter) est devenu l'une des technologies les plus puissantes du noyau Linux — et l'un des vecteurs d'attaque les plus redoutables pour les acteurs offensifs. Conçu pour exécuter des programmes sandboxés dans le kernel avec des performances proches du natif, eBPF permet l'observation et la manipulation du trafic réseau, des appels système, des événements kernel et des fonctions utilisateur. Les attaquants exploitent eBPF pour créer des rootkits kernel-level quasi indétectables, contourner les EDR et solutions de sécurité, et établir des mécanismes de persistance furtifs. Ce guide technique couvre l'ensemble de l'utilisation offensive d'eBPF, depuis l'exploitation des vulnérabilités du vérificateur jusqu'au développement de rootkits eBPF, en passant par les techniques de détection et les contre-mesures. Les red teamers, les analystes SOC et les développeurs kernel trouveront ici une référence technique complète avec des exemples de code et des architectures d'attaque documentées.
En bref
- Architecture eBPF : programmes, maps, vérificateur, helpers et hooks
- Rootkits eBPF : dissimulation de processus, fichiers, connexions réseau et users
- Évasion EDR : manipulation des événements de télémétrie via eBPF
- Vulnérabilités du vérificateur : bypass des bornes, type confusion, speculative attacks
- Détection : audit des programmes eBPF chargés, signatures et monitoring
Architecture eBPF : Vue d'Ensemble
eBPF est une machine virtuelle dans le kernel Linux qui exécute un bytecode vérifié. Les programmes eBPF sont attachés à des hooks (points d'attachement) dans le kernel — syscalls, tracepoints, kprobes, uprobes, XDP (réseau), LSM (sécurité). Ils utilisent des maps (structures de données partagées) pour communiquer entre eux et avec l'espace utilisateur.
| Composant | Rôle | Usage offensif |
|---|---|---|
| Programmes | Bytecode eBPF exécuté dans le kernel | Interception et modification de données |
| Maps | Stockage clé-valeur partagé | Configuration du rootkit, exfiltration |
| Vérificateur | Analyse statique pré-exécution | Cible de bypass pour accès kernel arbitraire |
| Helpers | Fonctions kernel accessibles depuis eBPF | bpf_probe_read_kernel, bpf_override_return |
| Hooks (kprobes) | Points d'attachement dynamiques | Interception de n'importe quelle fonction kernel |
Rootkits eBPF : Principes et Architecture
Un rootkit eBPF exploite les capacités légitimes d'eBPF pour dissimuler la présence d'un attaquant. Contrairement aux rootkits kernel classiques (LKM — Loadable Kernel Module), les rootkits eBPF :
- Ne nécessitent pas de compiler un module kernel — pas de dépendance aux headers kernel
- Sont portables entre les versions de kernel (grâce au BTF — BPF Type Format)
- Ne déclenchent pas les alertes de module loading (pas de
insmod) - Sont plus difficiles à détecter car eBPF est un composant légitime et largement utilisé
- Peuvent être déployés par un processus avec
CAP_BPF+CAP_PERFMON(pas nécessairement root sur les kernels récents)
Dissimulation de Processus via eBPF
La technique consiste à intercepter les appels système getdents64() (utilisé par ls, ps, find) via un programme eBPF de type tracepoint ou fentry. Le programme modifie le buffer de retour pour supprimer les entrées correspondant aux processus à dissimuler :
// Programme eBPF de dissimulation de processus (simplifié)
SEC("tp/syscalls/sys_exit_getdents64")
int handle_getdents_exit(struct trace_event_raw_sys_exit *ctx) {
// Lire le buffer de retour du syscall getdents64
struct linux_dirent64 *dirp;
long ret = ctx->ret;
// Parcourir les entrées du répertoire (/proc/PID)
// Si le nom correspond au PID à cacher :
// → Décaler les entrées suivantes pour "supprimer" l'entrée
// → Décrémenter ret (nombre d'octets retournés)
// Le processus n'apparaît plus dans ps, top, /proc
return 0;
}
// Programme de dissimulation de fichiers
SEC("tp/syscalls/sys_exit_getdents64")
int hide_files(struct trace_event_raw_sys_exit *ctx) {
// Même technique pour cacher des fichiers dans un répertoire
// Filtrer par nom de fichier (e.g., ".backdoor", "rootkit.so")
return 0;
}
Dissimulation de Connexions Réseau
Les connexions réseau du rootkit (C2, reverse shell) sont dissimulées en interceptant la lecture de /proc/net/tcp et /proc/net/tcp6. Un programme eBPF de type fentry attaché à tcp4_seq_show supprime les lignes correspondant aux connexions à cacher. Le résultat : netstat, ss, et lsof ne montrent pas les connexions du rootkit.
Interception de Credentials via eBPF
// Keylogger eBPF via interception de read() sur /dev/tty
SEC("tp/syscalls/sys_exit_read")
int sniff_tty_read(struct trace_event_raw_sys_exit *ctx) {
// Si le FD correspond à un terminal (stdin, /dev/tty)
// Lire le buffer de retour (les caractères saisis)
// Envoyer vers une map perf_event pour exfiltration
char buf[256];
bpf_probe_read_user(buf, sizeof(buf), (void *)ctx->ret);
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, buf, sizeof(buf));
return 0;
}
// Interception de sudo/su pour capturer les mots de passe
SEC("uprobe//usr/bin/sudo")
int sniff_sudo(struct pt_regs *ctx) {
// Lire les arguments de la ligne de commande
// Capturer la saisie du mot de passe via PAM hooks
return 0;
}
Évasion EDR via eBPF
Les EDR modernes (CrowdStrike Falcon, SentinelOne, Elastic) utilisent eux-mêmes eBPF pour la télémétrie de sécurité. Un rootkit eBPF peut contourner ces EDR en :
- Patching des programmes eBPF de l'EDR : détacher ou remplacer les programmes eBPF de l'EDR par des versions modifiées qui filtrent les événements malveillants
- Manipulation des événements en amont : les programmes eBPF s'exécutent en chaîne — un programme attaché avec une priorité plus élevée peut modifier les données avant que l'EDR ne les voie
- Blocking des perf events : empêcher la transmission des événements de télémétrie à l'agent EDR en espace utilisateur
- bpf_override_return() : sur les kernels avec CONFIG_BPF_KPROBE_OVERRIDE, cette helper permet de modifier la valeur de retour d'une fonction kernel — un attaquant peut faire échouer silencieusement les checks de sécurité
Vulnérabilités du Vérificateur eBPF
Le vérificateur eBPF est la première ligne de défense : il analyse statiquement chaque programme avant exécution pour garantir la terminaison, la sûreté mémoire et le respect des contraintes. Mais le vérificateur est un logiciel complexe (~20 000 lignes de C) avec un historique de vulnérabilités :
| CVE | Type | Impact | Kernel |
|---|---|---|---|
| CVE-2021-3490 | Bounds tracking (ALU32) | OOB R/W kernel | 5.7-5.12 |
| CVE-2023-2163 | Verifier bypass (branch pruning) | Arbitrary R/W | 5.4-6.3 |
| CVE-2022-23222 | Type confusion (PTR_TO_MEM) | LPE | 5.8-5.16 |
| CVE-2021-34866 | Ringbuf bounds | OOB access | 5.8-5.14 |
Détection des Rootkits eBPF
La détection des programmes eBPF malveillants est un défi car eBPF est une technologie légitime. Les approches de détection :
- Audit des programmes chargés :
bpftool prog listaffiche tous les programmes eBPF actifs. Un rootkit qui n'apparaît pas dans cette liste est suspect (dissimulation de la commande bpf()). - Monitoring de bpf() syscall : surveiller les appels à
bpf(BPF_PROG_LOAD)avec les arguments (type de programme, hooks ciblés) via auditd ou un programme eBPF de surveillance. - Analyse des maps eBPF : les maps contiennent les données du rootkit (PIDs à cacher, ports à filtrer). L'inspection des maps peut révéler une activité malveillante.
- Intégrité du kernel : comparer les hooks eBPF actifs avec une baseline connue. Un programme attaché à
tcp4_seq_showougetdents64est suspect.
bpf() via seccomp, désactivez unprivileged_bpf_disabled (sysctl kernel.unprivileged_bpf_disabled=1), et surveillez les programmes eBPF chargés via bpftool et les audit logs.À retenir
- eBPF permet des rootkits kernel-level sans module kernel — plus portables et plus furtifs que les LKM
- Les rootkits eBPF dissimulent processus, fichiers, connexions réseau et interceptent les credentials
- Les EDR basés sur eBPF peuvent être contournés par des programmes eBPF à priorité plus élevée
- Le vérificateur eBPF a un historique de vulnérabilités permettant l'accès kernel arbitraire
- La détection passe par l'audit de bpf() syscall, l'inspection des programmes et maps, et le monitoring continu
FAQ — Questions Fréquentes
eBPF nécessite-t-il les droits root ?
Historiquement oui, mais les kernels récents permettent le chargement de certains types de programmes eBPF avec les capabilities CAP_BPF et CAP_PERFMON (sans root complet). Le sysctl kernel.unprivileged_bpf_disabled contrôle si les utilisateurs non privilégiés peuvent charger des programmes eBPF (désactivé par défaut sur la plupart des distributions).
Un antivirus peut-il détecter un rootkit eBPF ?
Les antivirus traditionnels (basés sur les signatures fichiers) ne détectent pas les rootkits eBPF car le bytecode est chargé en mémoire via le syscall bpf(). Les EDR avancés surveillent les appels bpf() et analysent les programmes chargés, mais un rootkit eBPF peut potentiellement intercepter et modifier cette télémétrie.
Quelle est la différence entre un rootkit eBPF et un rootkit LKM ?
Un rootkit LKM est un module kernel compilé (.ko) qui nécessite les headers kernel et déclenche des alertes de module loading. Un rootkit eBPF utilise le bytecode eBPF, est portable entre versions kernel (BTF), ne nécessite pas de compilation kernel, et utilise une interface légitime. L'eBPF est cependant plus limité (pas d'accès mémoire arbitraire sans vulnérabilité du vérificateur).
Besoin d'un accompagnement expert ?
Nos consultants spécialisés en sécurité kernel et détection avancée vous accompagnent dans l'évaluation de votre posture de sécurité.
Contactez-nousTélécharger cet article en PDF
Format A4 optimisé pour l'impression et la lecture hors ligne
À propos de l'auteur
Ayi NEDJIMI
Expert Cybersécurité Offensive & Intelligence Artificielle
Ayi NEDJIMI est consultant senior en cybersécurité offensive et intelligence artificielle, avec plus de 20 ans d'expérience sur des missions à haute criticité. Il dirige Ayi NEDJIMI Consultants, cabinet spécialisé dans le pentest d'infrastructures complexes, l'audit de sécurité et le développement de solutions IA sur mesure.
Ses interventions couvrent l'audit Active Directory et la compromission de domaines, le pentest cloud (AWS, Azure, GCP), la rétro-ingénierie de malwares, le forensics numérique et l'intégration d'IA générative (RAG, agents LLM, fine-tuning). Il accompagne des organisations de toutes tailles — des PME aux grands groupes du CAC 40 — dans leur stratégie de sécurisation.
Contributeur actif à la communauté cybersécurité, il publie régulièrement des analyses techniques, des guides méthodologiques et des outils open source. Ses travaux font référence dans les domaines du pentest AD, de la conformité (NIS2, DORA, RGPD) et de la sécurité des systèmes industriels (OT/ICS).
Ressources & Outils de l'auteur
Articles connexes
DMA Attacks : Exploitation Thunderbolt et PCIe
Vol de Mots de Passe Chrome : DPAPI, Exploits et Outils
Le vol de mots de passe Chrome constitue l'une des techniques les plus exploitées par les attaquants dans les phases de post-exploitation et de mouvement latéral. Avec plus de 65 % de parts de marché des navigateurs en 2024, Google Chrome — et par extension l'ensemble des navigateurs basés sur Ch...
Extraction Credentials Firefox : NSS, Key4.db et Exploits
L'extraction des credentials stockés dans le gestionnaire de mots de passe Firefox constitue l'une des techniques post-exploitation les plus redoutables du paysage offensif contemporain. Contrairement aux idées reçues, le mécanisme de protection de Firefox repose sur une architecture complexe art...
Commentaires
Aucun commentaire pour le moment. Soyez le premier à commenter !
Laisser un commentaire