
기본 컨테이너 런타임을 원격 서버로 유출하는 컨테이너 이미지
내부 컨테이너 런타임을 추출하여 원격 서버로 전송하는 컨테이너 이미지입니다. 즐겨찾는 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 컨테이너에 exec로 접속하여 /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
다른 셸에서, 선택한 컨테이너 환경(예: Docker)에서 whoc 이미지를 실행하세요:
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에 대한 도움말:
Usage: upload_runtime [options] <server_ip>
Options:
-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' 아래에서 새 프로세스를 검색하여 런타임을 찾음