
Uma imagem de contêiner que exfiltra o runtime do contêiner subjacente para um servidor remoto.
Uma imagem de contêiner que extrai o runtime de contêiner subjacente e o envia para um servidor remoto. Cutuque o runtime de contêiner subjacente da sua plataforma de contêiner CSP favorita!
Conforme mostrado pelo runc CVE-2019-5736, os runtimes de contêiner Linux tradicionais se expõem aos contêineres que estão executando através de /proc/self/exe. O whoc usa esse link para ler o runtime de contêiner que o está executando.
Este é o modo padrão do whoc que funciona contra runtimes de contêiner vinculados dinamicamente.
whoc é definido como /proc/self/exe, e o linker dinâmico da imagem (ld.so) é substituído por upload_runtime.upload_runtime) no processo do runtime e passa a execução para ele.upload_runtime lê o binário do runtime através de /proc/self/exe e o envia para o servidor remoto configurado.
Para runtimes de contêiner vinculados estaticamente, o whoc vem em outra variação: whoc:waitforexec.
upload_runtime é o entrypoint da imagem e executa como PID 1 do contêiner whoc.whoc e invoque um arquivo apontando para /proc/self/exe (ex.: docker exec whoc_ctr /proc/self/exe).upload_runtime lê o binário do runtime através de /proc/$runtime-pid/exe e o envia para o servidor remoto configurado.
Você precisará do docker e python3 instalados. Clone o repositório:
git clone [email protected]:twistlock/whoc.git && cd whoc
Configure um servidor de arquivos para receber o runtime de contêiner extraído:
mkdir -p stash && cd stash
ln -s ../util/fileserver.py fileserver
./fileserver
De outro shell, execute a imagem whoc no ambiente de contêiner de sua escolha, por exemplo Docker:
cd whoc
docker build -f Dockerfile_dynamic -t whoc:latest src # ou ./util/build.sh
docker run --rm -it --net=host whoc:latest 127.0.0.1 # ou ./util/run_local.sh
Veja que o servidor de arquivos recebeu o runtime de contêiner. Se você executar o whoc sob Docker vanilla, o runtime de contêiner recebido deve ser runc.
--net=host é usado apenas em testes locais para que o contêiner whoc possa alcançar facilmente o servidor de arquivos no host via 127.0.0.1.
Por padrão, o whoc é construído para linux/amd64, mas também suporta outras arquiteturas de CPU. O modo aguardar-para-exec pode ser construído normalmente. Para construir o whoc no modo dinâmico para outras arquiteturas de CPU, você deve preencher o argumento de build PLATFORM_LD_PATH_ARG com o caminho do linker dinâmico na arquitetura alvo.
Um exemplo de script de build para arm64 está disponível em util/build_arm64.sh.
Ajuda para o binário principal do 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'