
Un'immagine container che esfiltra il runtime del container sottostante a un server remoto
Un'immagine contenitore che estrae il runtime del contenitore sottostante e lo invia a un server remoto. Esplora il runtime del contenitore sottostante della tua piattaforma CSP preferita!
Come dimostrato da runc CVE-2019-5736, i runtime contenitore Linux tradizionali si espongono ai contenitori che eseguono tramite /proc/self/exe. whoc utilizza questo collegamento per leggere il runtime del contenitore che lo esegue.
Questa è la modalità predefinita di whoc che funziona con runtime contenitore collegati dinamicamente.
whoc è impostato su /proc/self/exe e il linker dinamico (ld.so) dell'immagine viene sostituito con upload_runtime.upload_runtime) nel processo del runtime e gli passa l'esecuzione.upload_runtime legge il binario del runtime tramite /proc/self/exe e lo invia al server remoto configurato.
Per runtime contenitore collegati staticamente, whoc è disponibile in un'altra versione: whoc:waitforexec.
upload_runtime è il punto di ingresso dell'immagine e viene eseguito come PID 1 del contenitore whoc.exec nel contenitore whoc e invochi un file che punta a /proc/self/exe (ad es. docker exec whoc_ctr /proc/self/exe).upload_runtime legge il binario del runtime tramite /proc/$runtime-pid/exe e lo invia al server remoto configurato.
Avrai bisogno di docker e python3 installati. Clona il repository:
git clone [email protected]:twistlock/whoc.git && cd whoc
Configura un file server per ricevere il runtime del contenitore estratto:
mkdir -p stash && cd stash
ln -s ../util/fileserver.py fileserver
./fileserver
Da un'altra shell, esegui l'immagine whoc nell'ambiente contenitore di tua scelta, ad esempio 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
Osserva che il file server ha ricevuto il runtime del contenitore. Se esegui whoc su Docker standard, il runtime ricevuto dovrebbe essere runc.
--net=host viene utilizzato solo nei test locali in modo che il contenitore whoc possa raggiungere facilmente il file server sull'host tramite 127.0.0.1.
Per impostazione predefinita whoc è compilato per linux/amd64, ma supporta anche altre architetture CPU. La modalità wait-for-exec può essere compilata come al solito. Per compilare whoc in modalità dinamica per altre architetture CPU, è necessario popolare l'argomento di build PLATFORM_LD_PATH_ARG con il percorso del linker dinamico sull'architettura di destinazione.
Uno script di build di esempio per arm64 è disponibile in util/build_arm64.sh.
Aiuto per il binario principale di whoc, upload_runtime:
Usage: upload_runtime [options] <server_ip>
Options:
-p, --port Port of remote server, defaults to 8080
-e, --exec Wait-for-exec mode for static container runtimes, waits until an exec to the container occurred
-b, --exec-bin In exec mode, overrides the default binary created for the exec, default is /bin/enter
-a, --exec-extra-argument In exec mode, pass an additional argument to the runtime so it won't exit quickly
-r, --exec-readdir-proc In exec mode, instead of guessing the runtime pid (which gives whoc one shot of catching the runtime),
find the runtime by searching for new processes under '/proc'