Empezamos con un poco de historia... eBPF viene de BPF (Berkeley Packet Filter), desarrollado en los a帽os 90 para Linux y BSD. La idea original era filtrar paquetes de red de manera eficiente, permitiendo que los programas inspeccionaran headers de red sin salir del kernel y sin escribir c贸digo kernel complejo. Antes de BPF los filtros de paquetes eran lentos y monol铆ticos, con BPF dispon铆amos de un peque帽o lenguaje de bytecode, ejecutado por una m谩quina virtual ligera en el kernel y nos permit铆a escribir “programas” que analizaban paquetes en tiempo real y solo pasaban al userland lo que te interesaba. Era seguro, r谩pido y muy flexible.
Posteriormente alrededor de 2014-2015 surge eBPF (Extended BPF) como una extensi贸n masiva de BPF cl谩sico. Sus mejoras clave:
- Hooks gen茅ricos: no solo red, ahora puedes engancharte a syscalls, tracepoints, funciones del kernel (kprobes), funciones de programas userland (uprobes), sockets, etc.
- Estructuras de datos avanzadas (maps): hash, arrays, stacks, bloom filters… para compartir datos entre kernel y userland.
- Verificaci贸n de seguridad: el bytecode pasa un verificador que garantiza que no habr谩 bucles infinitos ni accesos ilegales.
Y 10 a帽os despu茅s, eBPF (Extended Berkeley Packet Filter) se ha convertido en una de las piezas m谩s potentes e innovadoras del kernel Linux. Es decir, lo que comenz贸 como un simple mecanismo para filtrar paquetes de red ha evolucionado en un motor de ejecuci贸n de bytecode dentro del kernel, con aplicaciones en observabilidad, seguridad, tracing y rendimiento.
Debido a ello, los equipos de seguridad defensiva han abrazado eBPF para monitorizar llamadas al sistema, detectar anomal铆as en tiempo real y reducir la superficie de ataque. Pero como suele suceder, lo que potencia la defensa tambi茅n puede inspirar al ataque. Investigadores han comenzado a explorar el lado oscuro de eBPF: rootkits invisibles, t茅cnicas de evasi贸n de EDR, persistencia en kernel space y manipulaci贸n sigilosa de syscalls.
Este art铆culo vamos a jugar un poco con eBPF para entender c贸mo un atacante podr铆a abusar de esta tecnolog铆a con varias PoCs sencillas. Primero empezamos con la instalaci贸n:
馃敼 Ubuntu/Debian (kernel moderno recomendado)
馃敼 Fedora
馃敼 Arch Linux
馃敼 Verificar
-
Comprueba que el kernel soporta eBPF:
(idealmente 5.x o 6.x).
-
Comprueba que el pseudo-filesystem est谩 montado:
Si no aparece, m贸ntalo con:
-
Prueba que funciona con un one-liner de
bpftrace:
Deber铆as ver en tiempo real qu茅 procesos invocan execve.
Ahora que lo tenemos en nuestro sistema, vamos con las PoCs:
PoC 1: Ocultando procesos con eBPF y kprobes
Un cl谩sico rootkit en Linux manipula la syscall getdents para que ls o ps no muestren ciertos procesos. Con eBPF podemos hacer algo similar sin modificar el kernel ni cargar m贸dulos sospechosos.
C贸digo eBPF (C):
// hide_pid.bpf.c
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/dirent.h>
#include <linux/uaccess.h>
#define HIDE_PID 1337 // PID a ocultar
SEC("kprobe/getdents64")
int bpf_prog(struct pt_regs *ctx) {
struct linux_dirent64 __user *dirent = (struct linux_dirent64 *)PT_REGS_PARM2(ctx);
// Aqu铆 podr铆amos parsear la lista de entradas y filtrar la que coincida con HIDE_PID.
// Por simplicidad este PoC s贸lo demuestra el hook.
bpf_printk("Interceptada llamada a getdents64!\n");
return 0;
}
char _license[] SEC("license") = "GPL";Carga con bpftool:
Ahora cada vez que un proceso llame a getdents64, nuestro programa eBPF se ejecutar谩.
La versi贸n completa podr铆a inspeccionar los nombres de directorio y eliminar la entrada que corresponde al PID a ocultar.
PoC 2: Persistencia avanzada: mapas “pinneados” en /sys/fs/bpf/
Normalmente, cuando un proceso userland muere, cualquier estructura de memoria que haya creado tambi茅n desaparece. Pero los maps eBPF pueden “pinnearse” en el pseudo-filesystem /sys/fs/bpf/, sobreviviendo al proceso. Esto permite a un atacante almacenar datos o estados que persisten sin depender de un demonio activo.
Ejemplo conceptual seguro:
-
Crear un map y pinnearlo:
-
Incluso si cierras el proceso que cre贸 el map, puedes volver a leerlo:
Ejemplos de mapas persistentes y agregaci贸n avanzada
a) Map persistente “pineado”
-
Este mapa sobrevive al cierre del proceso que lo cre贸.
-
Ideal para almacenar contadores agregados de syscalls o eventos en laboratorio.
b) Actualizaci贸n y lectura segura
-
Permite experimentar con agregaci贸n de datos de m煤ltiples procesos sin interferir con el kernel o userland.
Limitaciones y detecci贸n
- Cargar programas eBPF requiere privilegios (
CAP_BPFoCAP_SYS_ADMINen kernels antiguos). - Blue Teams pueden monitorizar
/sys/fs/bpf/,bpftooly syscalls relacionadas. - Herramientas como Falco y BPF LSM comienzan a detectar usos an贸malos.
Aun as铆, el blind spot es considerable, ya que muchos EDRs todav铆a no inspeccionan eBPF.



Comentarios
Publicar un comentario