
Docker `docker cp` 임의 파일 쓰기 취약점에 대한 PoC로, 심볼릭 링크 및 tar 추출 결함을 악용하여 호스트 바이너리를 덮어쓰거나 에이전트를 실행함으로써 컨테이너 탈출 및 루트 코드 실행을 유도합니다.
docker cp 컨테이너에서 호스트로의 임의 파일 쓰기HackSpeak 배포 이미지입니다. 이 저장소는 Imperva 레드팀(Ron Masas)이 공개한 CopyEscape PoC(CVE-2026-17106)의 배포 이미지이며, 코드는 업스트림과 일치합니다. 업스트림에 LICENSE가 포함되어 있지 않아 배포 관례에 따라 MIT License, Copyright (c) 2026 HackSpeak를 적용하며, 소스 코드의 저작권은 원저작자에게 있습니다.
⚠️ 보안 연구 및 승인된 테스트 전용입니다. Linux 데모는
/usr/bin/runc를 덮어쓰며, 일회용 VM에서 실행하고 검증 가능한 백업을 먼저 수행하세요. 승인되지 않은 환경이나 프로덕션 환경에서는 실행하지 마세요.
**CopyEscape(CVE-2026-17106)**는 Docker docker cp(및 Docker Sandboxes의 sbx cp)에서 발생하는 컨테이너에서 호스트로의 임의 파일 쓰기 취약점으로, Imperva Red Team(Ron Masas)이 발견했습니다.
docker cp는 직접적인 파일 시스템 복사가 아닙니다. daemon이 컨테이너 파일 시스템에서 filepath.WalkDir를 실행하여 tar 아카이브를 생성하고, CLI는 tar를 받은 뒤 클라이언트에서 압축을 해제하여 추출합니다.addTarFile이 다시 Lstat할 때 symlink로 보입니다 → tar 스트림에 불일치 항목이 나타납니다(symlink 헤더 다음에 "하위 파일" 항목이 이어짐).filepath.Join 이후의 구성 경로에 대해 경계 검사를 수행하지만, 실제 os.Symlink는 검사되지 않은 원본 hdr.Linkname을 사용합니다(절대 경로를 가리킬 수 있음). 이후 하위 파일을 추출할 때 커널이 해당 symlink를 따라가 사용자가 지정한 대상 외부에 파일을 씁니다.docker cp를 실행한 사용자의 권한으로 호스트에서 임의의 쓰기 가능한 파일을 생성/덮어쓸 수 있습니다. macOS에서는 셸 시작 스크립트를 덮어쓰고 ~/Library/LaunchAgents를 통한 영속화가 가능하며, Linux에서는 sudo docker cp로 /usr/bin/runc를 덮어써 이후 Docker 수명 주기 작업을 통해 root 코드 실행을 달성할 수 있습니다.sudo docker cp를 사용하지 마세요.두 가지 데모(테스트 환경은 공식과 동일: Engine 29.6.1 / Desktop 4.81.0):
macOS(비파괴적, ~/pwnd 생성)
cd macos
./demo-macos.sh
Linux(영향도 높음, /usr/bin/runc 덮어쓰기)
cd linux
# 按 linux/ 内说明构建镜像并运行;⚠️ 覆盖 runc 前务必备份
자세한 단계는 이 저장소의
macos/및linux/하위 디렉터리에 있는 설명 파일을 참조하세요.
/usr/bin/runc)를 덮어쓰므로, 반드시 일회용 VM에서 실행하고 백업하세요.docker cp — https://www.imperva.com/blog/copyescape-taking-over-docker-hosts-with-docker-cp/