
eBPF 기반 런타임 탐지기로, runc 및 Docker의 컨테이너 탈출 취약점을 모니터링하며, 빌드 및 런타임 중 CVE-2024-21626, CVE-2024-23651, CVE-2024-23652, CVE-2024-23653의 악용을 탐지하기 위해 syscall과 Docker 데몬 호출을 감시합니다.
이 저장소는 현재 보관(archive)되었습니다.
코드에 대한 더 이상의 업데이트는 이루어지지 않으며, 이 공지를 읽는 시점에는 코드가 안전하지 않거나 손상되었을 수도 있습니다. 역사적 목적으로만 간주하고 주의해서 취급하시기 바랍니다.

이 저장소에서는 runc 및 Docker 취약점 CVE-2024-21626, CVE-2024-23651, CVE-2024-23652, CVE-2024-23653에 대한 eBPF 기반 런타임 탐지의 참조 구현을 찾을 수 있습니다. 이 도구는 Linux 시스템 호출(예: chdir, mount)과 Docker 데몬의 함수 호출을 후킹(hook)하여 이를 Docker 빌드 및 컨테이너 프로세스와 연관시켜 이러한 취약점의 악용을 식별합니다.
정적 분석 기반 접근 방식은 이곳을 참조하십시오.
CVE-2024-21626은 runc 컨테이너 런타임의 취약점으로, 공격자가 컨테이너 격리를 벗어나 조작된 이미지를 통해 WORKDIR 명령어 처리의 문제를 악용하여 호스트에서 완전한 루트 RCE를 달성할 수 있게 합니다. 호스트에 대한 일부 파일 디스크립터가 열리고 닫히는 사이에 "경쟁(race)" 조건이 존재하므로, 공격자는 WORKDIR /proc/self/fd/[ID](여기서 ID는 시스템 종속 파일 디스크립터) 명령어가 포함된 Dockerfile을 생성하여 기본 호스트 머신의 파일 시스템을 가리키게 할 수 있습니다. 이는 다음 상황에서 악용될 수 있습니다:
docker build - 두 가지 경우:
ONBUILD 명령어(예: ONBUILD WORKDIR /proc/self/fd/[ID])를 포함하는 기본 이미지를 FROM 명령어로 참조하는 경우. ONBUILD 명령어는 해당 명령어를 포함하는 이미지가 아닌, 이를 기본 이미지로 사용하는 이미지에 명령어를 주입합니다. 즉, 기본 이미지가 손상되었거나 의도적으로 악의적인 경우(예: Dockerhub 또는 기타 공용 컨테이너 레지스트리에 호스팅된 경우), docker build 명령어가 실제로 빌드하는 이미지에 아무런 변경이 없더라도 악용이 가능합니다.docker run따라서 이 취약점은 빌드 시스템과 프로덕션 환경 모두를 위험에 빠뜨릴 수 있습니다.
CVE-2024-23651은 Docker의 취약점으로, RUN 명령어가 --mount=cache 플래그를 사용할 때 발생합니다. Docker 데몬 호스트에 source 디렉터리가 존재하는지 확인하는 시점과 실제 mount 시스템 호출 사이에 TOCTOU(time-of-check/time-of-use) 취약점이 존재합니다. 공격자는 이 두 호출 사이에 심볼릭 링크를 설치하는 Dockerfile을 제작하여 임의의 바인드 마운트를 유도하고, 결과적으로 호스트에서 완전한 루트 RCE를 달성할 수 있습니다.
이 취약점은 docker build 명령어에만 영향을 미칩니다.
CVE-2024-23653은 Docker의 취약점으로, # syntax 지시어와 함께 사용자 정의 Buildkit LLB 생성기를 사용할 때 발생합니다. 생성기는 Client.NewContainer 및 Container.Start GRPC 호출을 사용하여 빌드 중에 새 컨테이너를 실행할 수 있습니다. StartRequest.SecurityMode 인자는 Docker 데몬 또는 docker build 호출의 권한 기대치에 대해 적절히 검사되지 않으므로, GRPC 호출자가 빌드 중에 권한 있는(privileged) 컨테이너를 생성할 수 있습니다. 이 새 권한 있는 컨테이너는 이후 탈출하여 빌드 호스트에서 완전한 루트 RCE를 얻는 데 사용될 수 있습니다.
이 취약점은 docker build 명령어에만 영향을 미칩니다.
CVE-2024-23652는 Docker의 임의 삭제 취약점입니다. Dockerfile에서 RUN --mount를 사용할 때 마운트 대상이 존재하지 않으면 해당 환경을 위해 생성됩니다. 실행이 완료되면 생성된 디렉터리는 정리됩니다. 실행 중인 명령어가 마운트에 사용된 경로를 심볼릭 링크로 변경하면, 정리 절차가 이 심볼릭 링크를 따라가 호스트 루트 파일 시스템의 임의 디렉터리를 잠재적으로 정리할 수 있습니다.
이 취약점은 docker build 명령어에만 영향을 미칩니다.
빌드 시점 탐지는 4가지 취약점 모두에 적용됩니다.
GOOS=linux GOARCH={{amd64/arm64}} go build.sudo를 사용하여 컴파일된 바이너리를 백그라운드로 실행합니다(예: sudo ebpf-detector &).Leaky vessels vulnerability detected가 STDOUT에 출력됩니다.런타임 탐지는 WORKDIR 취약점(CVE-2024-21626)에만 적용됩니다.
Dockerfile을 사용하여 탐지기의 컨테이너 이미지를 빌드하고 이미지 레지스트리에 푸시합니다.detector.yaml의 image 값(TODO로 표시됨)을 채웁니다.kubectl apply -f detector.yml을 실행하여 Kubernetes 클러스터에서 탐지기를 DaemonSet으로 실행합니다.Leaky Vessels vulnerability detected가 출력됩니다.단위 테스트는 eBPF에 의존하므로 sudo로 실행해야 합니다: sudo go test ebpf-detector/....
WORKDIR 악용(CVE-2024-21626)은 컨테이너 초기화 중에 발생하므로 실행 중인 컨테이너에서는 감지되지 않습니다. 또한 탐지는 컨테이너 런타임이 containerd라고 가정합니다.CVE-2024-23651) 및 Buildkit 빌드 시점 컨테이너 종료 시 임의 삭제(CVE-2024-23652) 탐지는 타이밍 기반이며 경쟁 조건으로 인해 오탐(false negative)이 발생할 수 있습니다.버그 및 이슈의 최신 목록은 프로젝트 이슈를 참조하십시오.
기여는 환영합니다. 자세한 내용은 CONTRIBUTING.md를 참조하십시오.
Leaky Vessels 동적 탐지기는 Apache-2.0 라이선스 하에 있습니다. 자세한 내용은 LICENSE를 참조하십시오.