Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
jailer — Jailer es un sistema de aislamiento de procesos basado en eBPF que proporciona control de acceso obligatorio (MAC) para Linux. Realiza un seguimiento de los procesos mediante mapas de almacenamiento de tareas BPF y aplica políticas basadas en roles sobre el acceso a archivos, las operaciones de red y la ejecución de procesos. | Kitploit
Herramientas/GitHubGitHub/gen0sec/jailer
Herramientas DefensivasSeguridad de ContenedoresSeguridad de RedesSeguridad en la Nube
GitHubgen0sec/jailer

jailer

Ver RepositorioSitio web
5821hace 1 mesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

Jailer es un sistema de aislamiento de procesos basado en eBPF que proporciona control de acceso obligatorio (MAC) para Linux. Realiza un seguimiento de los procesos mediante mapas de almacenamiento de tareas BPF y aplica políticas basadas en roles sobre el acceso a archivos, las operaciones de red y la ejecución de procesos.

Compartir

Jailer - Control de Acceso Obligatorio eBPF

Advertencia: Este proyecto está en desarrollo intensivo y NO está listo para uso en producción. Las APIs, formatos de políticas y el comportamiento pueden cambiar sin previo aviso. Úselo solo para pruebas y experimentación.

Agradecimientos

Nota: Esta es una implementación independiente y no es el mismo proyecto que la solución de Meta. Si bien BpfJailer es funcionalmente similar y está inspirado en la idea y el diseño originales de Liam Wisehart, Justin Nga, Carl El Khoury, Mansee Chadha en Meta, este es un código base separado desarrollado de forma independiente. Agradecemos la visión y los conceptos fundamentales que inspiraron este trabajo.

Comunidad

Join us on Discord Substack

Jailer es un sistema de confinamiento de procesos basado en eBPF que proporciona control de acceso obligatorio (MAC) para Linux. Realiza un seguimiento de los procesos mediante mapas BPF task_storage y aplica políticas basadas en roles sobre acceso a archivos, operaciones de red y ejecución de procesos.

Características (Versión Actual)

Demo de Nginx

Nginx demo

Demo Compleja

asciicast

Requisitos del Kernel

Versión Mínima del Kernel

  • Linux 5.11+ (para soporte de BPF_MAP_TYPE_TASK_STORAGE)
  • Recomendado: Linux 6.1+ (mejor soporte de BTF)

Configuración de Kernel Requerida

root@kitploit:~
# Verificar la configuración actual del kernel
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)

Opciones requeridas:

root@kitploit:~
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y

Habilitar BPF LSM

BPF LSM debe estar habilitado en los parámetros de arranque del kernel:

root@kitploit:~
# Verificar si BPF LSM está activo
cat /sys/kernel/security/lsm
# Debería incluir "bpf" en la lista

# Si no, agregar a los parámetros de arranque del kernel:
# Editar /etc/default/grub y añadir a GRUB_CMDLINE_LINUX:
#   lsm=lockdown,capability,landlock,yama,apparmor,bpf

# Luego actualizar grub y reiniciar:
sudo update-grub
sudo reboot

Para sistemas Ubuntu/Debian, también se puede usar:

root@kitploit:~
# Crear un script para habilitar BPF LSM
cat > /tmp/enable_bpf_lsm.sh << 'EOF'
#!/bin/bash
GRUB_FILE="/etc/default/grub"
if grep -q "lsm=" "$GRUB_FILE"; then
    sudo sed -i 's/lsm=[^""]*/lsm=lockdown,capability,landlock,yama,apparmor,bpf/' "$GRUB_FILE"
else
    sudo sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,landlock,yama,apparmor,bpf"/' "$GRUB_FILE"
fi
sudo update-grub
echo "BPF LSM habilitado. Por favor, reinicie."
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh

Compilación

Prerrequisitos

root@kitploit:~
# Instalar Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Instalar dependencias de compilación (Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)

# Instalar target BPF para Rust
rustup target add bpfel-unknown-none

Compilar Todos los Componentes

root@kitploit:~
cd bpfjail

# Compilar programas BPF
cd bpfjailer-bpf && cargo build --release && cd ..

# Compilar demonio y cliente
cargo build --release

Inicio Rápido

1. Iniciar el Demonio

root@kitploit:~
# Ejecutar como root (carga config/policy.json si existe)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon

Salida esperada:

root@kitploit:~
[INFO] Demonio BpfJailer iniciando...
[INFO] Cargando programas eBPF de BpfJailer con libbpf-rs...
[INFO] ✓ mapa pending_enrollments disponible para inscripción
[INFO] ✓ mapa network_rules disponible para filtrado de puerto/protocolo
[INFO] ✓ mapa task_storage creado exitosamente
[INFO] ✓ Programa task_alloc adjuntado
[INFO] ✓ Programa file_open adjuntado
[INFO] ✓ Programa socket_bind adjuntado
[INFO] ✓ Programa socket_connect adjuntado
[INFO] ✓ Programa bprm_check_security adjuntado
[INFO] Inicializado con roles predeterminados: restricted (1), permissive (2)
[INFO] Política cargada desde config/policy.json
[INFO] Cargados 5 roles
[INFO] Servidor de inscripción escuchando en /run/bpfjailer/enrollment.sock

2. Ejecutar Pruebas de Seguridad

root@kitploit:~
# Ejecutar pruebas de vulnerabilidad SIN jail (se muestran ataques exitosos)
sudo python3 tests/vulnerable_apps/run_tests.py

# Ejecutar pruebas de vulnerabilidad CON rol restringido (se muestran ataques bloqueados)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1

# Ejecutar una prueba específica
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path

# Listar pruebas y roles disponibles
sudo python3 tests/vulnerable_apps/run_tests.py --list

Ejemplo de salida con rol restringido:

root@kitploit:~
============================================================
PRUEBA: Path Traversal / Lectura Arbitraria de Archivos
============================================================
Intentando leer /etc/passwd mediante path traversal...
BLOQUEADO - Permiso denegado (BpfJailer bloqueó el acceso al archivo)

============================================================
PRUEBA: Inyección de Comandos
============================================================
Intentando inyección de comandos...
BLOQUEADO - Permiso denegado (BpfJailer bloqueó exec)

============================================================
PRUEBA: Reverse Shell / Exfiltración de Datos
============================================================
Prueba 1: Conexión reverse shell a 127.0.0.1:4444
BLOQUEADO - Permiso denegado (BpfJailer bloqueó connect)

Pruebas de Seguridad Disponibles

3. Prueba Manual de Inscripción

root@kitploit:~
#!/usr/bin/env python3
import socket
import json
import os

# Conectar al demonio
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/run/bpfjailer/enrollment.sock")

# Inscribir con rol restringido (ID 1)
request = {"Enroll": {"pod_id": 1, "role_id": 1}}
sock.send((json.dumps(request) + "\n").encode())
response = sock.recv(4096).decode()
print(f"Inscripción: {response}")
sock.close()

# Intentar leer un archivo (debería estar bloqueado)
try:
    open("/etc/passwd").read()
    print("Acceso a archivo: PERMITIDO")
except PermissionError:
    print("Acceso a archivo: BLOQUEADO")

Archivo de Política

BpfJailer carga los roles desde un archivo de política JSON. El demonio busca el archivo de política en este orden:

  1. Variable de entorno $BPFJAILER_POLICY
  2. /etc/bpfjailer/policy.json
  3. config/policy.json (relativo al directorio de trabajo)

Ejemplo de Archivo de Política

root@kitploit:~
{
  "roles": {
    "restricted": {
      "id": 1,
      "name": "restricted",
      "flags": {
        "allow_file_access": false,
        "allow_network": false,
        "allow_exec": false
      },
      "network_rules": []
    },
    "webserver": {
      "id": 3,
      "name": "webserver",
      "flags": {
        "allow_file_access": true,
        "allow_network": true,
        "allow_exec": false
      },
      "network_rules": [
        {"protocol": "tcp", "port": 80, "allow": true},
        {"protocol": "tcp", "port": 443, "allow": true}
      ]
    }
  },
  "pods": []
}

Banderas de Política

Roles Predeterminados

Filtrado de Puertos/Protocolos de Red

BpfJailer admite un control de red detallado con reglas TCP/UDP por puerto.

Estructura de la Regla

root@kitploit:~
mapa network_rules:
  Clave: { role_id, port, protocol, direction }
  Valor: allowed (1) o denied (0)
  • protocol: 6 = TCP, 17 = UDP
  • direction: 0 = bind, 1 = connect
  • port: 0 = comodín (todos los puertos)

Orden de Evaluación de Reglas

  1. Verificar regla de puerto específico para el rol
  2. Verificar regla de puerto comodín (port=0) para el rol
  3. Recurrir a role_flags (bit 1 = red permitida)

Ejemplo: Permitir Solo HTTP/HTTPS para Rol Restringido

root@kitploit:~
// En el código del demonio:
use bpfjailer_daemon::process_tracker::{PROTO_TCP, DIR_CONNECT};

// Permitir solo TCP connect a los puertos 80 y 443
process_tracker.add_network_rule(RoleId(1), 80, PROTO_TCP, DIR_CONNECT, true)?;
process_tracker.add_network_rule(RoleId(1), 443, PROTO_TCP, DIR_CONNECT, true)?;

Constantes de Protocolo

Rangos de Puertos

Se pueden especificar rangos de puertos en policy.json usando port_start y port_end:

root@kitploit:~
{
  "network_rules": [
    {"protocol": "tcp", "port": 443, "allow": true},
    {"protocol": "tcp", "port_start": 8000, "port_end": 8100, "allow": true}
  ]
}
CampoDescripción
portPuerto único (ej. 80)
port_start + port_endRango de puertos (ej. 8000-8100)

Nota: Los rangos grandes (>1000 puertos) consumen muchas entradas del mapa BPF. Se registra una advertencia para rangos que excedan 1000 puertos.

Arquitectura

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│                     Espacio de Usuario                       │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐    ┌──────────────────┐                    │
│  │   Cliente   │───▶│  bpfjailer-daemon │                    │
│  │  (inscribir)│    │                  │                    │
│  └─────────────┘    │  - PolicyManager │                    │
│                     │  - ProcessTracker│                    │
│                     │  - EnrollmentSvr │                    │
│                     └────────┬─────────┘                    │
│                              │ escribe en                    │
│                              ▼                              │
├─────────────────────────────────────────────────────────────┤
│                     Mapas BPF                                │
│  ┌──────────────────┐  ┌─────────────┐  ┌──────────────┐   │
│  │pending_enrollments│  │ role_flags  │  │ task_storage │   │
│  │   (PID → info)   │  │ (rol→flags) │  │(tarea→info)  │   │
│  └──────────────────┘  └─────────────┘  └──────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                     Hooks BPF LSM                            │
│  ┌────────────┐ ┌───────────┐ ┌─────────────┐ ┌──────────┐ │
│  │ task_alloc │ │ file_open │ │socket_bind/ │ │bprm_check│ │
│  │(herencia   │ │(migración │ │  connect    │ │_security │ │
│  │ + init)    │ │ + check)  │ │  (check)    │ │ (check)  │ │
│  └────────────┘ └───────────┘ └─────────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘

Flujo de Inscripción

  1. El proceso se conecta a /run/bpfjailer/enrollment.sock
  2. Envía JSON: {"Enroll": {"pod_id": N, "role_id": M}}
  3. El demonio escribe en pending_enrollments[PID] y role_flags[role_id]
  4. En la siguiente llamada al sistema (file_open, exec), BPF migra la inscripción a task_storage
  5. Todas las llamadas al sistema futuras verifican task_storage + role_flags para su aplicación
  6. Los procesos hijos heredan mediante el hook task_alloc

Modos de Instalación

BpfJailer admite dos modos de instalación:

1. Modo Demonio (Estándar)

Utiliza un demonio en ejecución para la inscripción y gestión de políticas:

root@kitploit:~
# Instalar servicio systemd
sudo cp config/bpfjailer-daemon.service /etc/systemd/system/
sudo cp target/release/bpfjailer-daemon /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# Habilitar e iniciar
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-daemon
sudo systemctl start bpfjailer-daemon

Características:

  • API de inscripción basada en sockets
  • Recarga en caliente de políticas (detener/iniciar demonio)
  • Registro completo en el proceso del demonio

2. Modo Sin Demonio (Bootstrap)

Carga los programas BPF en el arranque temprano y sale. Los programas permanecen activos hasta el reinicio:

root@kitploit:~
# Instalar servicio bootstrap
sudo cp config/bpfjailer-bootstrap.service /etc/systemd/system/
sudo cp target/release/bpfjailer-bootstrap /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# Habilitar (se ejecutará en el próximo arranque)
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-bootstrap

# O ejecutar manualmente ahora
sudo bpfjailer-bootstrap

Características:

  • Sin demonio en ejecución (superficie de ataque reducida)
  • Programas BPF fijados en /sys/fs/bpf/bpfjailer/
  • No se puede detener sin reiniciar
  • Eventos de auditoría enviados a systemd-journald mediante buffer perf
  • Solo funcionan métodos de inscripción alternativos (exec/cgroup/xattr)

Verificar programas fijados:

root@kitploit:~
ls -la /sys/fs/bpf/bpfjailer/
ls -la /sys/fs/bpf/bpfjailer/maps/
ls -la /sys/fs/bpf/bpfjailer/progs/

Ver eventos de auditoría:

root@kitploit:~
# Los eventos se emiten al buffer perf, recogidos por journald
journalctl -f | grep bpfjailer

Comparación de Modos

Solución de Problemas

"Error al crear el mapa task_storage"

root@kitploit:~
# Verificar versión del kernel (necesita 5.11+)
uname -r

# Verificar que BPF LSM esté activo
cat /sys/kernel/security/lsm | grep bpf

# Verificar que BTF esté disponible
ls -la /sys/kernel/btf/vmlinux

"Error al adjuntar el programa"

root@kitploit:~
# Verificar si los programas BPF se pueden cargar
sudo bpftool prog list

# Verificar capacidades
sudo capsh --print | grep cap_bpf

Permiso denegado al inscribirse

root@kitploit:~
# Asegurarse de que el demonio se ejecute como root
ps aux | grep bpfjailer

# Verificar permisos del socket
ls -la /run/bpfjailer/enrollment.sock

Métodos de Inscripción Alternativos

Además de la inscripción por socket Unix, BpfJailer admite inscripción automática basada en:

Inscripción por Ejecutable

Auto-inscribir todos los procesos que ejecuten un binario específico:

root@kitploit:~
{
  "exec_enrollments": [
    {
      "executable_path": "/usr/bin/nginx",
      "pod_id": 1000,
      "role": "webserver"
    }
  ]
}

Cuando cualquier proceso ejecuta /usr/bin/nginx, se inscribe automáticamente con el rol webserver. Esto se empareja mediante el inodo del ejecutable, por lo que los enlaces simbólicos y duros se manejan correctamente.

Inscripción por Cgroup

Auto-inscribir todos los procesos en un cgroup específico:

root@kitploit:~
{
  "cgroup_enrollments": [
    {
      "cgroup_path": "/sys/fs/cgroup/bpfjailer/sandbox",
      "pod_id": 2000,
      "role": "sandbox"
    }
  ]
}

Crear el cgroup y mover procesos a él:

root@kitploit:~
# Crear cgroup
sudo mkdir -p /sys/fs/cgroup/bpfjailer/sandbox

# Mover proceso al cgroup
echo $$ | sudo tee /sys/fs/cgroup/bpfjailer/sandbox/cgroup.procs

# El proceso ahora está auto-inscrito con el rol sandbox

Inscripción por Xattr

Establecer atributos extendidos en ejecutables para información de inscripción:

root@kitploit:~
# Establecer xattrs de inscripción
sudo setfattr -n user.bpfjailer.pod_id -v $(printf '\x01\x00\x00\x00\x00\x00\x00\x00') /ruta/al/binario
sudo setfattr -n user.bpfjailer.role_id -v $(printf '\x03\x00\x00\x00') /ruta/al/binario

# Verificar xattrs
getfattr -d /ruta/al/binario

Cómo Funciona la Auto-Inscripción

  1. En tiempo de exec (hook LSM bprm_check_security):

    • Verificar si el inodo del ejecutable está en el mapa exec_enrollment
    • Verificar si el ID de cgroup del proceso está en el mapa cgroup_enrollment
    • Si se encuentra, establecer automáticamente task_storage con pod_id y role_id
  2. La inscripción persiste a través de fork/exec mediante el hook task_alloc

  3. Las reglas de política (red, ruta, exec) se aplican según el role_id

Licencia

GPL-2.0 (requerido para programas BPF)

Descargar herramienta
CaracterísticaEstadoDescripción
Seguimiento de Procesos✅ FuncionandoRastrea procesos mediante el mapa BPF task_storage
Inscripción por Socket✅ FuncionandoLos procesos se inscriben mediante una API de socket Unix
Políticas Basadas en Roles✅ FuncionandoRoles restringido y permisivo
Control de Acceso a Archivos✅ FuncionandoBloquear/permitir operaciones de apertura de archivos
Herencia de Jail✅ FuncionandoLos procesos hijos heredan el jail del padre
Control de Red✅ FuncionandoBloquear/permitir bind/connect de sockets
Filtrado por Puerto/Protocolo✅ FuncionandoReglas de permitir/denegar TCP/UDP por puerto
Control de Ejecución✅ FuncionandoBloquear/permitir ejecución de procesos
Coincidencia de Rutas✅ FuncionandoRecorrido de dentry con invalidación de caché
Binarios Firmados🚧 EsqueletoValidación de firma de binarios (no implementado)
Inscripción Alternativa✅ FuncionandoAuto-inscripción por ejecutable, cgroup o xattr
Modo Sin Demonio✅ FuncionandoEl binario bootstrap fija los programas en el arranque temprano
Eventos de Auditoría✅ FuncionandoBuffer perf para integración con systemd-journald
PruebaVulnerabilidadMitigado Por
path_traversalLectura arbitraria de archivos mediante ../restricted, isolated
command_injectionEjecución de comandos de shellrestricted, webserver, isolated
reverse_shellConexiones salientes al atacanterestricted, isolated
ssrfAcceso a servicios internos/metadatos en la nuberestricted, isolated
arbitrary_writeEscritura en rutas sensiblesrestricted
crypto_minerDescargar + ejecutar + conectar a poolrestricted, webserver
privilege_escalationLeer shadow, escribir sudoersrestricted
BanderaDescripción
allow_file_accessPermitir operaciones de apertura de archivos
allow_networkPermitir bind/connect de sockets
allow_execPermitir ejecución de procesos
allow_setuidPermitir operaciones setuid
allow_ptracePermitir operaciones ptrace
ID de RolNombreAcceso a ArchivosRedEjecución
1restrictedBloqueadoBloqueadoBloqueado
2permissivePermitidoPermitidoPermitido
3webserverPermitidoPuertos 80, 443, 8080Bloqueado
4databasePermitidoPuertos 5432, 6379Bloqueado
5isolatedPermitidoBloqueadoBloqueado
6web_with_dbPermitidoPuertos 80, 443, 5432, 3306, 6379Bloqueado
7workerPermitidoPuertos 443, 5432, 6379, 5672Permitido
ConstanteValorDescripción
PROTO_TCP6Protocolo TCP
PROTO_UDP17Protocolo UDP
DIR_BIND0socket bind()
DIR_CONNECT1socket connect()
AspectoModo DemonioModo Sin Demonio
Superficie de ataqueDemonio en ejecuciónSin proceso en ejecución
InscripciónSocket Unix + alternativasSolo alternativas
Actualizaciones de políticasRecarga en calienteRequiere reinicio
Registro de auditoríaDemonio lee ringbufjournald mediante buffer perf
Eliminación de programasDetener demonioSolo reinicio
Orden de arranqueDespués de network.targetAntes de basic.target