Ver Blog

Nysm: Ocultando Herramientas Ofensivas eBPF para una Seguridad Inquebrantable

Descubre cómo nysm utiliza eBPF para hacer desaparecer programas, tablas, y registros, llevando la seguridad a un nivel superior. Conoce sus capacidades y limitaciones

#Nysm

#eBPF

#AI

Luis Javier Navarrete -

@Luijait

CISO, Developer and Project Ideator

Introducción: Una jaula de posterior explotación sigilosa.

Con la creciente popularidad de herramientas ofensivas basadas en eBPF, desde los robots de suplantación de identidades hasta los kits root ocultando su propio PID, una pregunta surgió en nuestra mente: ¿Sería posible hacer que eBPF sea invisible para sí mismo? Desde ahí, creamos nysm, un contenedor sigiloso de eBPF que busca hacer que las herramientas ofensivas desaparezcan de la vista de los administradores del sistema, no solo escondiendo eBPF, sino mucho más:

  • Herramientas como bpftool, bpflist, bpfcc, ps, top, sockstat, ss, rkhunter, chkrootkit, lsof, auditd, entre otras... Todos estos elementos pasan desapercibidos ante lo que ocurre dentro de nysm. Esconde:
    • Nuevos programas eBPF
    • Nuevas tablas eBPF
    • Nuevos enlaces eBPF
    • Nuevos registros generados por auditd
    • Nuevos PIDs
    • Nuevos sockets

Advertencia: Esta herramienta es solo una demostración de las capacidades de eBPF. No está diseñada para ser exhaustiva. Sin embargo, las solicitudes de incorporación de cambios son bienvenidas.

Instalación

Requisitos previos:

sudo apt install git make pkg-config libelf-dev clang llvm bpftool -y
# Linux headers
cd ./nysm/src/

Compilar:

cd ./nysm/src/
make

Uso:

./nysm [OPCIÓN...] COMANDO

Funcionamiento:

En general, como eBPF no puede modificar valores devueltos o direcciones del núcleo, nuestro objetivo es encontrar la llamada más baja que interactúe con una dirección de usuario para sobrescribir su valor y ocultar los objetos deseados. Para diferenciarse de los eventos de nysm, todo se ejecuta dentro de un espacio de nombres PID separado.

Ocultar objetos eBPF: Las herramientas como bpftool tienen características que nysm quiere evadir: bpftool prog list, bpftool map list y bpftool link list. Como cualquier programa eBPF, bpftool utiliza la llamada al sistema bpf(), y más específicamente con los comandos BPF_PROG_GET_NEXT_ID, BPF_MAP_GET_NEXT_ID y BPF_LINK_GET_NEXT_ID. El resultado de estas llamadas se almacena en la dirección del usuario apuntada por el argumento attr. Para sobrescribir uattr, se establece un punto de seguimiento en la entrada de bpf() para almacenar la dirección apuntada en una tabla. Una vez hecho esto, espera al punto de seguimiento de la salida de bpf(). Cuando bpf() sale, nysm puede leer y escribir a través de la estructura bpf_attr. Después de cada BPF_*_GET_NEXT_ID, bpf_attr.start_id se reemplaza por bpf_attr.next_id. En ese momento, puede verificar bpf_attr.next_id y reemplazarlo con el siguiente ID que no fue creado en nysm. Los identificadores de programa, tabla y enlace se recopilan de security_bpf_prog(), security_bpf_map() y bpf_link_prime().

Ocultar registros de Auditd: La recepción de mensajes de Auditd se realiza mediante recvfrom(), que almacena sus mensajes en un búfer. Si el mensaje recibido se generó mediante un proceso de nysm, se reemplaza la longitud del mensaje en su encabezado nlmsghdr por 0.

Ocultar PIDs: Ocultar PIDs con eBPF no es algo nuevo. nysm oculta nuevos PIDs de alloc_pid() de getdents64() en /proc alterando la longitud del registro anterior. Como getdents64() necesita bucle a través de todos sus archivos, las instrucciones limítrofes de eBPF están fácilmente alcanzables. Por lo tanto, nysm utiliza saltos hacia adelante antes de llegar a ellos.

Ocultar sockets: Ocultar sockets es una gran palabra. De hecho, los sockets abiertos ya están ocultos para muchas herramientas, como no pueden encontrar el proceso en /proc. Además, ss utiliza socket() con la marca NETLINK_SOCK_DIAG, que devuelve todos los sockets abiertos actualmente. Después de eso, ss recibe el resultado a través de recvmsg() en un búfer de mensajes. El valor devuelto es la longitud de todos estos mensajes combinados. Aquí se aplica el mismo método que para los PIDs: la longitud del mensaje anterior se modifica para ocultar los sockets de nysm. Estos se recogen de las llamadas a connect() y bind().

Limitaciones: Incluso con el mejor esfuerzo, nysm aún tiene algunas limitaciones.

  • Cualquier herramienta que no cierre sus descriptores de archivo seguirá viendo procesos de nysm. Por ejemplo, si ./nysm bash se está ejecutando antes de top, los procesos no aparecerán. Pero si otro proceso se crea desde esa instancia de bash mientras top todavía está funcionando, el nuevo proceso será detectado. La misma situación ocurre con los sockets y herramientas como nethogs.

  • Los registros del kernel: dmesg y /var/log/kern.log, el mensaje "nysm[<PID>] instalando un programa con el helper bpf_probe_write_user de eBPF que podría corromper la memoria del usuario!" surgirá varias veces debido al verificador de eBPF en nysm ejecución.

  • Muchas trazas escritas en archivos quedan como agarrar lecturas y escrituras sería muy pesado (pero todavía es posible). Por ejemplo, /proc/net/tcp o /sys/kernel/debug/tracing/enabled_functions.

  • Ocultar ss recvmsg puede ser difícil, ya que es un desafío importante. ss utiliza socket() con la marca NETLINK_SOCK_DIAG, que devuelve todos los sockets abiertos actualmente. En ese caso, el tamaño del primer mensaje del búfer determina si el socket está visible o no. Entonces, nysm modifica la información del primer socket con valores duros.

FAQ:

  1. ¿Qué hace exactamente este proyecto? Este proyecto busca crear una jaula sigilosa utilizando eBPF que permite ocultar el uso de herramientas ofensivas basadas en eBPF. Esto incluye la ocultación de programas eBPF, tablas eBPF, enlaces eBPF, registros generados por auditd, PIDs, y sockets.

  2. ¿Por qué es importante ocultar el uso de herramientas ofensivas basadas en eBPF? Las organizaciones pueden usar estas herramientas para fines maliciosos, como hackear sistemas u obtener acceso no autorizado. Al poder ocultar el uso de estas herramientas, los atacantes pueden trabajar sin ser detectados, lo que aumenta la posibilidad de éxito en sus ataques.

  3. ¿Cómo funciona nysm para lograr esto? nysm trabaja interceptando llamadas al sistema y manipulando datos devueltos para ocultar información relacionada con herramientas offensivas basadas en eBPF. Algunos ejemplos incluyen interceptar llamadas a bpf() para ocultar identificadores de programa, tabla y enlace; reemplazar la longitud del mensaje en los registros de Auditd para ocultar eventos; y modificar la longitud del registro anterior en /proc para ocultar PIDs.

  4. ¿Existen limitaciones en esta solución? Aunque nysm puede ayudar a ocultar el uso de herramientas offensivas basadas en eBPF, aún existen algunas limitaciones. Algunas de ellas incluyen que otros programas que no cierren sus descriptores de archivo todavía podrían ver procesos de nysm, problemas para ocultar completamente registros del kernel, y que es difícil ocultar totalmente las lecturas y escrituras en archivos.

  5. ¿Es seguro utilizar nysm en entornos empresariales? Es importante tener en cuenta que aunque nysm puede ayudar a ocultar el uso de herramientas offensivas basadas en eBPF, no garantiza una protección completa contra todas las amenazas. Se recomienda investigar adecuadamente y evaluar cuidadosamente el riesgo antes de implementar nysm en un entorno empresarial.