
심각도: 치명적 (CVSS 9.8)
구성 요소: opencontainers/runc (libcontainer)
취약점 유형: CWE-59: 파일 접근 전 부적절한 링크 확인('Link Following')
runc의 maskPaths 함수에 치명적인 취약점이 존재합니다. 컨테이너 내부에서 민감한 경로(예: /proc/kcore)를 마스킹할 때, runc는 O_NOFOLLOW 플래그 없이 os.OpenFile(path, O_PATH, 0)을 사용합니다. 이로 인해 악의적인 컨테이너 프로세스가 대상 경로를 민감한 호스트 파일(예: /etc/shadow)을 가리키는 심볼릭 링크로 교체할 수 있고, runc가 컨테이너 경로가 아닌 호스트 파일에 마운트 작업을 수행하게 됩니다.
포함된 exploit.go는 이러한 우회를 가능하게 만드는 커널 동작을 보여줍니다.
Linux 환경(또는 재귀를 테스트하는 경우 CAP_SYS_ADMIN 권한이 있는 컨테이너)에서 컴파일하고 실행하세요:
go run exploit.go
// Vulnerable Code Pattern in runC:
// 1. Path is typically provided as a string (e.g. from config)
// 2. runC calls os.OpenFile(path, O_PATH...)
// 3. MISSING: unix.O_NOFOLLOW flag
// Result: Kernel follows symlink if attacker swapped the path.
필수 패치:
마스킹할 대상 경로를 열 때 unix.O_NOFOLLOW를 포함하도록 libcontainer/rootfs_linux.go를 업데이트하세요.
- dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC, 0)
+ dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0)
exploit.go: Go로 작성된 기능성 PoC 코드.analysis.md: 레이스 컨디션에 대한 상세 기술 분석.cve_draft.md: 제출용 보고서 템플릿.면책 조항: 이 코드는 보안 연구 및 교육 목적으로만 제공됩니다.