
Detector de tiempo de ejecución basado en eBPF para vulnerabilidades de escape de contenedores en runc y Docker, que monitorea llamadas al sistema y llamadas al daemon de Docker para detectar la explotación de CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 y CVE-2024-23653 durante compilaciones y tiempo de ejecución.
Este repositorio está ahora archivado.
No se realizarán más actualizaciones al código y puede ser inseguro o incluso estar roto para cuando leas este aviso. Considéralo solo con fines históricos y trátalo con cuidado.

En este repositorio encontrarás una implementación de referencia para una detección en tiempo de ejecución basada en eBPF para las vulnerabilidades de runc y Docker CVE-2024-21626, CVE-2024-23651, CVE-2024-23652 y CVE-2024-23653. Se engancha a las llamadas al sistema de Linux (p. ej., chdir, mount) y a las invocaciones de funciones del demonio de Docker y las asocia con builds de Docker y procesos de contenedores para identificar explotaciones de estas vulnerabilidades.
Para un enfoque basado en análisis estático, consulta .
CVE-2024-21626 es una vulnerabilidad en el runtime de contenedores runc que permite a un atacante escapar del aislamiento del contenedor y lograr un RCE completo como root mediante una imagen manipulada que explota un problema en el manejo de la instrucción WORKDIR. Dado que existe una condición de "carrera" entre el momento en que se abren y se cierran algunos descriptores de archivo hacia el host, un atacante puede crear un Dockerfile con la siguiente instrucción WORKDIR /proc/self/fd/[ID] (siendo ID un descriptor de archivo dependiente del sistema) que apuntará al sistema de archivos de la máquina host subyacente. Esto puede explotarse al ejecutar:
docker build - En 2 casos:
FROM que contiene un comando ONBUILD que desencadena la explotación, p. ej., ONBUILD WORKDIR /proc/self/fd/[ID]. La instrucción ONBUILD inyecta el comando no en la imagen que lo contiene, sino en la imagen que la usa como imagen base. Esto significa que si una imagen base está comprometida o es intencionalmente maliciosa, es decir, alojada en Dockerhub u otros registros públicos de contenedores, la explotación es posible incluso si nada cambia en la imagen que el comando docker build realmente construye.docker runPor lo tanto, esta vulnerabilidad puede poner en riesgo tanto los sistemas de build como los entornos de producción.
CVE-2024-23651 es una vulnerabilidad en Docker donde un comando RUN usa la bandera --mount=cache. Existe una vulnerabilidad de tiempo de verificación/tiempo de uso (TOCTOU) entre la comprobación de que un directorio source existe en el host del demonio de Docker y la llamada real a la syscall mount. Un atacante puede crear un Dockerfile que coloque un enlace simbólico entre estas dos llamadas para inducir un bind mount arbitrario que resulte en un RCE completo como root en el host.
Esta vulnerabilidad solo afecta al comando docker build.
CVE-2024-23653 es una vulnerabilidad en Docker que ocurre cuando se usa un generador LLB personalizado de Buildkit con la directiva # syntax. El generador puede usar las llamadas GRPC Client.NewContainer y Container.Start para ejecutar un nuevo contenedor durante el build. El argumento StartRequest.SecurityMode no se verifica adecuadamente contra las expectativas de privilegios del demonio de Docker o de la llamada docker build, lo que permite al llamador de GRPC crear un contenedor privilegiado durante el build. Este nuevo contenedor privilegiado puede luego ser escapado para obtener un RCE completo como root en el host de build.
Esta vulnerabilidad solo afecta al comando docker build.
CVE-2024-23652 es una vulnerabilidad de eliminación arbitraria en Docker. Cuando se usa RUN --mount en un Dockerfile, si el destino del montaje no existe, se creará para ese entorno. Cuando la ejecución se completa, este directorio creado se limpiará. Si el comando en ejecución cambia la ruta utilizada para el montaje a un enlace simbólico, el procedimiento de limpieza atravesará este enlace simbólico y potencialmente limpiará directorios arbitrarios en el sistema de archivos raíz del host.
Esta vulnerabilidad solo afecta al comando docker build.
La detección en tiempo de build se aplica a las 4 vulnerabilidades.
GOOS=linux GOARCH={{amd64/arm64}} go build.sudo (como lo requiere eBPF) en tu entorno de build (es decir, sudo ebpf-detector &).Leaky vessels vulnerability detected impreso en STDOUT, junto con el CVE respectivo, el nombre de la vulnerabilidad y análisis forense adicional.La detección en tiempo de ejecución se aplica solo a la vulnerabilidad WORKDIR (CVE-2024-21626).
Dockerfile proporcionado y súbela a un registro de imágenes.image en el detector.yaml (marcado con TODO).kubectl apply -f detector.yml.Leaky Vessels vulnerability detected impreso en los registros de los pods del DaemonSet.Las pruebas unitarias deben ejecutarse con sudo, ya que dependen de eBPF: sudo go test ebpf-detector/....
WORKDIR en tiempo de ejecución (CVE-2024-21626) ocurre durante la inicialización del contenedor, por lo que no se detectará en contenedores en ejecución. La detección también asume que el runtime de contenedores es containerd.CVE-2024-23651) y Eliminación arbitraria en el desmontaje de contenedores en tiempo de build de Buildkit (CVE-2024-23652) se basan en temporización y pueden tener falsos negativos debido a condiciones de carrera.Para obtener una lista actualizada de errores y problemas, consulta los problemas del proyecto.
Las contribuciones son bienvenidas. Consulta CONTRIBUTING.md para más detalles.
El Detector Dinámico de Leaky Vessels está bajo la licencia Apache-2.0. Consulta LICENSE para más información.