一个容器镜像,用于提取底层容器运行时并将其发送到远程服务器。 探探您最喜欢的CSP容器平台的底层容器运行时!
正如runc CVE-2019-5736所示,传统的Linux容器运行时通过/proc/self/exe向其所运行的容器暴露自身。whoc利用这一链接读取正在执行它的容器运行时。
这是whoc的默认模式,适用于动态链接的容器运行时。
whoc镜像的入口点设置为/proc/self/exe,并且镜像的动态链接器(ld.so)被替换为upload_runtime。upload_runtime)加载到运行时进程中,并将执行权传递给它。upload_runtime通过/proc/self/exe读取运行时二进制文件,并将其发送到配置的远程服务器。
对于静态链接的容器运行时,whoc提供了另一种风格:whoc:waitforexec。
upload_runtime作为镜像入口点,并以whoc容器的PID 1运行。whoc容器,并调用指向/proc/self/exe的文件(例如docker exec whoc_ctr /proc/self/exe)。upload_runtime通过/proc/$runtime-pid/exe读取运行时二进制文件,并将其发送到配置的远程服务器。
您需要安装docker和python3。克隆仓库:
git clone [email protected]:twistlock/whoc.git && cd whoc
设置一个文件服务器来接收提取的容器运行时:
mkdir -p stash && cd stash
ln -s ../util/fileserver.py fileserver
./fileserver
在另一个终端中,在您选择的容器环境中运行whoc镜像,例如Docker:
cd whoc
docker build -f Dockerfile_dynamic -t whoc:latest src # 或 ./util/build.sh
docker run --rm -it --net=host whoc:latest 127.0.0.1 # 或 ./util/run_local.sh
可以看到文件服务器接收到了容器运行时。如果您在原版Docker下运行whoc,接收到的容器运行时应该是runc。
--net=host仅在本地测试中使用,以便whoc容器能够通过127.0.0.1轻松访问主机上的文件服务器。
默认情况下whoc为linux/amd64构建,但也支持其他CPU架构。等待执行模式可以像往常一样构建。要为其他CPU架构构建动态模式的whoc,您必须使用目标架构上动态链接器的路径填充PLATFORM_LD_PATH_ARG构建参数。
用于arm64的示例构建脚本位于util/build_arm64.sh。
whoc主二进制文件upload_runtime的帮助信息:
用法: upload_runtime [选项] <服务器IP>
选项:
-p, --port 远程服务器端口,默认为8080
-e, --exec 等待执行模式(用于静态容器运行时),等待对容器的exec操作发生
-b, --exec-bin 在exec模式下,覆盖为exec创建的默认二进制文件,默认为/bin/enter
-a, --exec-extra-argument 在exec模式下,向运行时传递一个额外参数,使其不会快速退出
-r, --exec-readdir-proc 在exec模式下,不猜测运行时PID(这给whoc一次捕获运行时的机会),
而是通过搜索'/proc'下的新进程来查找运行时