14.04.2025

¿Qué es BPF? Linux ¿Y, cómo funciona?

En un sistema operativo, existen numerosos mecanismos de monitoreo y recopilación de datos que permiten monitorear la viabilidad de los componentes clave, la seguridad y el rendimiento. En una gran red informática, la recopilación de este tipo de datos es necesaria para responder oportunamente a diversos tipos de eventos e incidentes.

Arquitectónicamente esta tarea se puede realizar de diferentes maneras, en Linux Existe un mecanismo de kernel BPF de bajo nivel que permite implementar código arbitrario en un espacio privilegiado. Los módulos Snort/Suricata lo utilizan para filtrar el tráfico entrante, y tcpdump lo elimina antes de que llegue a la pila TCP/IP. Analicemos el algoritmo de trabajo y las principales ventajas de esta solución.

¿Qué son BPF y eBPF?

BPF o Filtro de Paquetes Berkley es una máquina virtual dentro del kernel del sistema operativo que permite cargar código arbitrario. El algoritmo de esta solución está vinculado a eventos del sistema. Cualquier programa BPF se iniciará solo después de que ocurra el evento al que está vinculado.

Los programas suelen escribirse en lenguaje C utilizando bibliotecas especiales y archivos de encabezado proporcionados por el proyecto LLVM y la comunidad eBPF. El archivo se compila posteriormente en un archivo program.o y se carga en el núcleo mediante la llamada al sistema bpf().

Captura de pantalla n.° 1: Esquema

Es importante destacar que el propósito principal de un programa BPF es la monitorización y el rastreo de datos de entrada y salida de las funciones de la biblioteca/aplicación, así como el rastreo de los enlaces del sistema. Sirve para la recopilación de estadísticas, la evaluación del rendimiento y el desarrollo de subsistemas de seguridad.

Su versión extendida es eBPF, que tiene una funcionalidad similar, sin embargo, se presenta en versiones posteriores del kernel.

¿Cómo funcionan los programas y los objetos bpf?

Preinstalemos las herramientas necesarias para generar llamadas al sistema en relación con la pila BPF. Para ello, introduzca el comando en la línea:

dnf install bpftool bpftrace -y

Captura de pantalla №2 — Instalación

Luego de revisar la funcionalidad y sintaxis de la herramienta que tenemos a nuestra disposición:

herramientabpf

Captura de pantalla n.° 3: Herramienta BPF

Está disponible la gestión de objetos como programas BPF, mapas BPF, enlaces y redes.

Programas del BPF

Para el seguimiento y rastreo se utilizan varios tipos de programas con diferentes mecanismos:

Analicemos el mecanismo con más detalle en un ejemplo práctico de monitorización del proceso de autenticación de usuarios. Usaremos uprobe, que nos permitirá conectarnos a una función de biblioteca y leer los datos transferidos. Revisemos la ruta completa a sshd:

nano /usr/lib/systemd/system/system/sshd.service

Captura de pantalla n.º 4 — SSHServicio D

Para el demonio, busquemos las bibliotecas que carga; clásicamente, muchas soluciones usan PAM en Linux:

ldd /usr/sbin/sshd

Captura de pantalla №4 — Dependencias

PAM también está presente en sshd, por lo que lo usaremos para volcar credenciales. Veamos las funciones internas que pueden contener el proceso de autenticación:

readelf -Ws /lib64/libpam.so.0 | autenticación grep

Captura de pantalla n.° 5: Leer el formato ELF

Entre las funciones presentadas, la más interesante es pam_get_authtok, que trabaja con el token de usuario. Usemos bpftrace para cargar el programa y comprobar la corrección de la función encontrada:

bpftrace -e 'uprobe:/lib64/libpam.so.0:pam_get_authtok { printf(“ejecución de llamada de destino\n”); }'

Captura de pantalla n.° 6: Programa de rastreo BPF

¡Genial! El programa BPF se ejecutó porque se llamó a la función pam_get_authtok y su contexto estaba disponible. Esto significa que el programa pudo volcar las credenciales de la función y guardarlas en el almacenamiento.

Mapas del BPF

Aquí se llaman mapas BPF y almacenan todos los datos en formato clave:valor. Puedes verlos con el comando:

Mostrar mapa de bpftool

Captura de pantalla n.° 7: Mapa

Además, el PID puede usar una llamada al sistema para acceder a las celdas y exportar las credenciales. Diversos programas BPF también pueden comunicarse con los mapas. Por lo tanto, es importante tener en cuenta que el acceso a este tipo de mecanismos debe estar restringido para los usuarios normales.

Vincular objetos

La comunicación entre un programa y un punto de monitorización es posible gracias al objeto Enlace, puedes visualizar los enlaces existentes entre programas y puntos de monitorización con el comando:

Mostrar enlace de bpftool

Captura de pantalla n.° 7 — Enlace

El tipo de conexión indica que el programa puede modificar los valores durante la transmisión, y el programa de seguimiento 2 indica que el seguimiento pertenece al programa con id 2. Veámoslo con el comando:

programa bpftools mostrar id 2

Captura de pantalla n.° 8: lista de programas

Presumiblemente modifica las solicitudes del dispositivo de interfaz humana, se puede eliminar con el comando:

bpftool dump xlated id 2

Captura de pantalla n.° 9: Programa de volcado

Como resultado, obtenemos las instrucciones desensambladas utilizadas en el programa. Este tipo de análisis es útil para encontrar soluciones maliciosas y comprender el funcionamiento de mecanismos de monitoreo de bajo nivel como tcpdump y otros.