
Una imagen de contenedor que exfiltra el entorno de ejecución del contenedor subyacente a un servidor remoto.
Una imagen de contenedor que extrae el runtime de contenedor subyacente y lo envía a un servidor remoto. ¡Indaga en el runtime de contenedor subyacente de tu plataforma de contenedores CSP favorita!
Como se muestra en runc CVE-2019-5736, los runtimes de contenedores Linux tradicionales se exponen a los contenedores que ejecutan a través de /proc/self/exe. whoc utiliza este enlace para leer el runtime de contenedor que lo está ejecutando.
Este es el modo predeterminado de whoc que funciona contra runtimes de contenedor enlazados dinámicamente.
whoc se establece en /proc/self/exe, y el enlazador dinámico (ld.so) de la imagen se reemplaza con upload_runtime.upload_runtime) en el proceso del runtime y le pasa la ejecución.upload_runtime lee el binario del runtime a través de /proc/self/exe y lo envía al servidor remoto configurado.
Para runtimes de contenedor enlazados estáticamente, whoc viene en otra variante: whoc:waitforexec.
upload_runtime es el punto de entrada de la imagen y se ejecuta como PID 1 del contenedor whoc.whoc e invoque un archivo que apunte a /proc/self/exe (p. ej., docker exec whoc_ctr /proc/self/exe).upload_runtime lee el binario del runtime a través de /proc/$runtime-pid/exe y lo envía al servidor remoto configurado.
Necesitarás docker y python3 instalados. Clona el repositorio:
git clone [email protected]:twistlock/whoc.git && cd whoc
Configura un servidor de archivos para recibir el runtime de contenedor extraído:
mkdir -p stash && cd stash
ln -s ../util/fileserver.py fileserver
./fileserver
Desde otra terminal, ejecuta la imagen whoc en tu entorno de contenedor preferido, por ejemplo Docker:
cd whoc
docker build -f Dockerfile_dynamic -t whoc:latest src # o ./util/build.sh
docker run --rm -it --net=host whoc:latest 127.0.0.1 # o ./util/run_local.sh
Observa que el servidor de archivos recibió el runtime de contenedor. Si ejecutas whoc bajo Docker estándar, el runtime de contenedor recibido debería ser runc.
--net=host solo se usa en pruebas locales para que el contenedor whoc pueda alcanzar fácilmente el servidor de archivos en el host a través de 127.0.0.1.
Por defecto, whoc está compilado para linux/amd64, pero también soporta otras arquitecturas de CPU. El modo de espera para exec se puede compilar como de costumbre. Para compilar whoc en modo dinámico para otras arquitecturas de CPU, debes proporcionar el argumento de compilación PLATFORM_LD_PATH_ARG con la ruta del enlazador dinámico en la arquitectura objetivo.
Hay un script de compilación de ejemplo para arm64 disponible en util/build_arm64.sh.
Ayuda para el binario principal de whoc, upload_runtime:
Usage: upload_runtime [options] <server_ip>
Options:
-p, --port Puerto del servidor remoto, por defecto 8080
-e, --exec Modo de espera para exec para runtimes de contenedor estáticos; espera hasta que ocurra un exec en el contenedor
-b, --exec-bin En modo exec, anula el binario predeterminado creado para el exec; por defecto /bin/enter
-a, --exec-extra-argument En modo exec, pasa un argumento adicional al runtime para que no salga rápidamente
-r, --exec-readdir-proc En modo exec, en lugar de adivinar el pid del runtime (lo que le da a whoc un solo intento de capturar el runtime),
encuentra el runtime buscando nuevos procesos en '/proc'