
Lectura local de archivos alta: LiteBox v0.1.0 linux-userland seccomp SYS_open O_RDONLY no tiene verificación de ruta del host
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-seccomp-open-rdonly
Clase: Lectura de archivos (límite del FS del sandbox) Alcance: Local
LiteBox v0.1.0 (d8556e3) - Microsoft
El runner documentado para userland de Linux (litebox-runner-linux-userland) instala un filtro seccomp de denegación por defecto y luego carga un ELF invitado en el mismo proceso. SYS_open está en la lista de permitidos cuando el argumento 1 (flags) es un dword igual a OFlags::RDONLY (0). No hay predicado de ruta. Un invitado que emite una syscall real con flags 0 abre el VFS del host con el UID del runner, y luego read / mmap esos bytes. El reescritor de ELF no es un límite de seguridad en este pin. --rewrite-syscalls es -Z y está desactivado por defecto.
Este remanente es lectura del FS del host. No es escritura en el host, ni exec, ni ptrace, ni LPE, ni RCE.
| ID | sin CVE todavía |
| Clase | Lectura de archivos (límite del FS del sandbox) |
| Alcance | Local (binario invitado no confiable en el proceso del runner) |
| CWE | CWE-284, CWE-862 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Producto | microsoft/litebox |
| Afectado | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) plataforma userland de Linux + runner |
| Auth | invitado ya en ejecución dentro del sandbox |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1, linux/amd64 |
Quién: un binario invitado no confiable en litebox-runner-linux-userland. El proveedor (CvvT en GitHub #1006) y la documentación del crate del reescritor dicen que los trampolines ELF no son un límite de seguridad. La seguridad del userland de Linux es este filtro. enable_seccomp_filter es de denegación por defecto (Errno(EINVAL) en release) con TSYNC y PR_SET_NO_NEW_PRIVS. El agujero es SYS_open con flags Eq 0 sin comprobación de ruta. El comentario en page_mgmt.rs es que el mapeo CoW reabre el archivo del programa del host después de que el filtro está activo, en lugar de mantener un FD preabierto.
| Método + sink | Privilegio |
|---|---|
SYS_open("/oracle/secret", 0) real y luego SYS_read | Bytes de archivos del host que el UID del runner puede leer. Lab: fd 3, 35 bytes, testigo LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS. La ruta es el VFS del host del initramfs, no el overlay del invitado. |
| Método + sink | Privilegio |
|---|---|
SYS_open("/etc/passwd", 0) y luego read / mmap | archivos del host legibles por todos como UID del runner |
SYS_open de rutas propiedad del runner (claves ssh, .env, kubeconfig, credenciales de la nube, tar de --initial-files) | esos bytes si el UID puede abrirlos |
SYS_open("/etc/shadow", 0) | hashes de shadow solo si el runner es root |
SYS_open("/proc/self/maps", 0) | mapas del runner, incluidos .text del host / libc (mismo proceso) |
SYS_open("/proc/self/mem", 0) y luego mmap del FD | espacio de direcciones del runner que el UID puede leer vía procfs. pread no coincide con la denegación; SYS_mmap está permitido. |
Ninguna en este remanente. Los negativos probados en laboratorio devolvieron todos errno=22 EINVAL y no crearon archivos:
| Método + sink | Resultado |
|---|---|
SYS_open O_RDWR | EINVAL |
SYS_open O_CREAT | EINVAL, no se creó ningún archivo |
SYS_openat incluso con O_RDONLY | EINVAL |
SYS_execve | EINVAL |
socket, ptrace | EINVAL (denegación adicional no coincidente) |
openat / openat2 / creat / unlink / chmod permanecen como denegación no coincidente en el pin.
No está en el alcance.
process_vm_readv, io_uring_setup, bpf, mount, pivot_root, unshare, setns, connect, ioctl, getdentsAUDIT_ARCH_X86_64 o KILL_PROCESSclone3 hereda el filtro; escribir uid_map requiere un open bloqueadoin_mem + tar_ro) no cambia. Este remanente es el VFS del host mediante una syscall realFijé microsoft/litebox v0.1.0 (d8556e3, 2026-10-07) en lugar de main. Dieciocho búsquedas en el código fuente. El crate del reescritor y el GitHub #1006 ya dicen que los trampolines no son el límite. El filtro del userland de Linux sí lo es. SYS_open con flags 0 está ahí para que CoW pueda reabrir el archivo del programa. No hay comprobación de ruta.
Camino equivocado: Docker Desktop Rosetta y qemu-user-static rechazan ambos seccomp(SET_MODE_FILTER) en este host (EINVAL / ENOSYS). Por lo tanto, el laboratorio arranca un kernel virt de Alpine x86_64 bajo qemu-system-x86_64 TCG y ejecuta el filtro copiado como PID 1 para que el BPF llegue a un kernel x86_64 real. Se copiaron las reglas de seccompiler 0.5.0, no una llamada en el árbol a enable_seccomp_filter, y no el workspace completo.
cd lab
./run.sh
Loopback 127.0.0.1:19110. Proyecto de Compose litebox-seccomp-open-rdonly. Plataforma linux/amd64. Testigo LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS. Última línea:
SUCCESS litebox-seccomp-open-rdonly open-rdonly-ok rdwr-einval openat-einval execve-einval LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS
Eliminar SYS_open del filtro y preabrir los FD de CoW antes de PR_SET_SECCOMP, o añadir un predicado de ruta que no pueda ver rutas del host fuera del FS del invitado. La denegación no coincidente ya cubre openat.
La recepción del proveedor es MSRC (https://msrc.microsoft.com/create-report). No abrir un issue público en GitHub sobre microsoft/litebox.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]