
CVE-2025-31133 PoC
이 문서는 runc 취약점 CVE-2025-31133에 대한 제공된 개념 증명(PoC) 스크립트의 기능을 설명합니다.
runc의 maskedPaths 처리에서 발생하는 심볼릭 링크 경쟁 조건입니다.maskedPaths의 보호를 우회하여 호스트 시스템의 민감한 파일에 쓸 수 있습니다. 이는 컨테이너 탈출(container escape) 에 해당합니다./proc/sys/kernel/core_pattern 파일을 수정하여 취약점을 안전하게 시연합니다."pwned"만을 기록하며 호스트에서 임의 코드를 실행하지 않습니다. 또한 원래 값을 복원하는 방법을 제공합니다.컨테이너의 OCI 사양(config.json)에 있는 maskedPaths 기능은 컨테이너가 민감한 시스템 파일에 접근하는 것을 막기 위한 보안 메커니즘입니다. 이는 컨테이너 내부의 이러한 민감한 경로 위에 /dev/null(빈 장치 파일)을 바인드 마운트하여 효과적으로 읽고 쓸 수 없게 만듭니다.
취약점(CVE-2025-31133)은 Time-of-Check to Time-of-Use (TOCTOU) 경쟁 조건입니다. 익스플로잇은 다음과 같이 작동합니다:
runc가 컨테이너를 설정할 때, 민감한 경로(예: /proc/sys/kernel/core_pattern)를 마스킹할 바인드 마운트의 소스로 컨테이너의 rootfs에 있는 dev/null 파일을 사용하려고 준비합니다.runc가 rootfs/dev/null로의 경로를 확인하는 시점과 실제로 마운트 작업을 수행하는 시점 사이에 작은 시간 간격이 존재합니다.rootfs/dev/null 파일을 합법적인 디바이스 노드와 호스트의 대상 파일(/proc/sys/kernel/core_pattern)을 가리키는 심볼릭 링크 사이에서 지속적이고 매우 빠르게 교체하는 스크립트를 생성할 수 있습니다.runc는 rootfs/dev/null이 심볼릭 링크인 정확한 순간에 마운트 작업을 수행합니다. 이로 인해 커널이 심볼릭 링크를 따라가게 되어 /proc/sys/kernel/core_pattern에 대한 의도된 마스킹 작업이 실패합니다./proc/sys/kernel/core_pattern에 쓸 수 있으며, 이는 호스트의 파일을 직접 수정하여 컨테이너 탈출을 달성합니다.이 PoC는 이 기술을 사용하여 /proc/sys/kernel/core_pattern에 기록합니다. 이 파일은 수정 시 프로세스 충돌 시 호스트에서 임의 코드 실행으로 이어질 수 있기 때문에 이러한 익스플로잇의 일반적인 대상입니다. 그러나 이 PoC는 쓰기 원시(write primitive)가 존재함을 증명하기 위해 무해한 문자열만 기록합니다.
poc.sh 스크립트는 위에서 설명한 전체 과정을 자동화합니다.
설정 및 정리:
runc 바이너리, 컨테이너 이름, rootfs 경로에 대한 변수를 정의합니다.cleanup 함수를 포함합니다. 이 함수는 종료, 중단 또는 종료 시 자동으로 호출됩니다.준비:
/proc/sys/kernel/core_pattern 원본 내용을 임시 파일에 저장합니다. 이는 나중에 익스플로잇 성공 여부를 확인하고 사용자가 시스템을 복원하는 데 도움을 줍니다../rootfs)와 config.json 파일을 생성합니다.config.json은 maskedPaths 아래에 /proc/sys/kernel/core_pattern을 명시적으로 나열합니다. 이는 익스플로잇이 우회하려는 바로 그 기능입니다.경쟁 함수 (symlink_race)
rootfs/dev/null을 삭제합니다.rootfs/dev/null에서 대상 호스트 파일(/proc/sys/kernel/core_pattern)로 심볼릭 링크를 생성합니다.rootfs/dev/null을 적절한 문자 디바이스(mknod)로 다시 생성합니다.실행:
symlink_race 함수가 백그라운드 프로세스로 시작됩니다.runc run ...을 실행하여 컨테이너를 생성하고 시작합니다. 이때 runc가 maskedPaths를 적용하려고 시도합니다.runc exec를 사용하여 컨테이너 내부에서 명령을 실행합니다: echo 'pwned' > /proc/sys/kernel/core_pattern.확인:
/proc/sys/kernel/core_pattern 현재 내용을 읽습니다."pwned" 문자열 및 원래 값과 비교합니다.[+] EXPLOIT SUCCEEDED! 또는 [-] Exploit did not succeed. 메시지를 출력합니다.전제 조건:
runc.busybox-static (컨테이너 셸용).runc 실행 및 /proc 수정을 위한 루트 권한 (sudo).단계:
poc.sh로 저장합니다.chmod +x poc.sh.sudo ./poc.sh.[+] EXPLOIT SUCCEEDED! 메시지가 표시되면 경쟁 조건에서 승리한 것입니다. 호스트의 /proc/sys/kernel/core_pattern이 컨테이너 내부에서 성공적으로 수정되어 취약점이 확인되었습니다.[-] Exploit did not succeed. 메시지가 표시되면 이번 시도에서는 경쟁에서 승리하지 못한 것입니다. 경쟁 조건은 확률적이며 시스템 타이밍과 부하에 크게 의존합니다. 스크립트를 몇 번 더 실행해 보십시오.PoC는 시스템 파일을 수정합니다. 원래 상태로 복원하려면 스크립트가 제안하는 명령을 실행하십시오:
# 'ORIGINAL_PATTERN'은 시스템의 실제 값이 됩니다
echo 'original_core_pattern_value' | sudo tee /proc/sys/kernel/core_pattern