Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
POC-CopyEscape-CVE-2026-17106 — Функциональный PoC для CVE-2026-17106 (CopyEscape): гонка TOCTOU в docker cp, допускающая произвольную запись на хосте Docker. Лаборатория Docker + монитор inotify + LD_PRELOAD. Вариант для macOS безвреден, для Linux — разрушителен. | Kitploit
Инструменты/GitHubGitHub/686f6c61/poc-copyescape-cve-2026-17106
Повышение привилегийБезопасность контейнеровАнализ уязвимостейЭксплуатацияОбучение и ОбразованиеПобег из КонтейнераСостязательная АтакаЛаборатории и Практика

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
686f6c61/poc-copyescape-cve-2026-17106

POC-CopyEscape-CVE-2026-17106

Функциональный PoC для CVE-2026-17106 (CopyEscape): гонка TOCTOU в docker cp, допускающая произвольную запись на хосте Docker. Лаборатория Docker + монитор inotify + LD_PRELOAD. Вариант для macOS безвреден, для Linux — разрушителен.

Репозиторий
17 дней назадЕщё не проверено

CopyEscape — PoC для CVE-2026-17106

Образовательный PoC для CopyEscape (CVE-2026-17106), уязвимость состояния гонки TOCTOU в docker cp, которая позволяет вредоносному контейнеру записывать произвольные файлы на хост Docker. Вдохновлено оригинальной работой masasron, который обнаружил и задокументировал уязвимость в блоге "CopyEscape: Taking Over Docker Hosts with docker cp".


Содержание

  1. Краткое описание
  2. Правовое уведомление
  3. Архитектура цепочки
  4. Требования
  5. Структура репозитория
  6. Краткое руководство по использованию
  7. Проверка эксплуатации
  8. Сравнение с оригиналом
  9. Митигация
  10. Благодарности
  11. Лицензия

Краткое описание

CVE-2026-17106 — это уязвимость состояния гонки (TOCTOU) при извлечении tar-файла, который демон Docker создаёт во время docker cp <contenedor>:<ruta> <destino>. Затрагивает Docker CLI 29.6.1 и более ранние версии; исправлена начиная с 29.7.0. Ошибка находится в CLI (извлечение tar на хосте), а не в демоне.

Цепочка, названная CopyEscape, демонстрирует, как, имея только запущенный контейнер без дополнительных возможностей, атакующий может:

  1. Замаскировать реальный каталог /watched/file.txt/ под обычный файл для любого процесса, открывающего его внутри контейнера, с помощью библиотеки LD_PRELOAD, перехватывающей open, openat, openat2, fopen, stat, lstat, fstatat, statx и варианты 64.
  2. Держать файл-приманку aaa.txt размером 16 МиБ, вынуждающий демон тратить достаточно времени на создание tar, чтобы монитор успевал выиграть гонку.
  3. Отслеживать с помощью inotify обращения демона и в окне гонки заменять подкаталог escape/ на абсолютную символическую ссылку к целевой директории хоста ( в macOS или в Linux) с помощью двух атомарных с откатом.

Результат — произвольная запись файлов на хост с правами процесса, выполняющего docker cp. Вариант Linux перезаписывает /usr/bin/runc и добивается выполнения кода с правами root на хосте при следующем docker run / exec.


Правовое уведомление

Этот репозиторий содержит строго образовательные и защитные материалы.

  • Цель: продемонстрировать цепочку эксплуатации для обучения, собственного аудита и проверки патчей.
  • Разрешённое использование: запускайте её только против систем, которые принадлежат вам или на которые у вас есть явное письменное разрешение.
  • Запрещено: любое использование против сторонних систем без согласия. Автор репозитория не несёт ответственности за неправомерное использование материалов, включённых сюда.
  • Ответственность: оператор несёт единоличную ответственность за соблюдение применимого законодательства (LOPD/RGPD в Испании, CFAA в США и т. д.).
  • Вариант Linux разрушает runc хоста: используйте его только в одноразовой ВМ с проверенной резервной копией.

PoC поставляется с безвредным вариантом для macOS (записывает ~/pwnd в качестве маркера), единственная цель которого — служить воспроизводимой демонстрацией.


Архитектура цепочки

root@kitploit:~
┌─────────────────────────────────────────────────────────────────────┐
│  1. LD_PRELOAD camufla /watched/file.txt como archivo regular       │
│     open/openat/openat2/fopen/stat/lstat/fstatat/statx → decoy       │
│     docker exec ... cat /watched/file.txt  →  "top-level file"       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  2. Layout real dentro del contenedor                               │
│     /watched/file.txt/                                               │
│     ├── aaa.txt            (16 MiB de 'B', cebo lento)               │
│     ├── escape/            (directorio real inicial)                 │
│     ├── escape/<basename>  (payload: runc o pwnd)                    │
│     └── .swap-escape       (symlink → /Users/<usr> o /usr/bin)       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  3. docker cp pide tar al daemon                                    │
│     daemon recorre /watched/file.txt/ y abre aaa.txt                │
│     inotify detecta IN_OPEN sobre aaa.txt                           │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  4. Monitor pivot: dos rename(2) atomicos con rollback              │
│     escape/ → .old-escape/   (backup)                                │
│     .swap-escape → escape/   (symlink al target del host)            │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  5. Tar resultante contiene:                                        │
│     escape → /Users/<usr>   (symlink absoluto)                       │
│     escape/<basename>        (entrada hija que atraviesa el symlink) │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  6. CLI vulnerable extrae symlink + hija                            │
│     crea escape → /Users/<usr> en el destino local                   │
│     extrae escape/<basename> A TRAVES del symlink                    │
│     escribe /Users/<usr>/<basename> en el host                       │
└──────────────────────────────────────────┬──────────────────────────┘
                                           │
                                           ▼
┌─────────────────────────────────────────────────────────────────────┐
│  macOS: ~/pwnd con "COPYESCAPE_MACOS_DEMO"  (demo inocua)           │
│  Linux: /usr/bin/runc sobrescrito          (RCE como root)          │
└─────────────────────────────────────────────────────────────────────┘

Требования

PoC предназначена для запуска в macOS со следующими требованиями:

  • Запущенный Docker Desktop 4.81+ (демон может быть любой версии; ошибка в CLI).
  • curl, tar, git и docker в PATH.
  • Подключение к интернету для загрузки уязвимой CLI 29.6.1 (около 18 МБ) и базового образа alpine:3.21.
  • HOME в виде /Users/<usuario>.

Для варианта macOS root не требуется. Вариант Linux требует root и одноразовую VM.

Скрипт run-poc.sh автоматически загружает бинарный файл уязвимой CLI 29.6.1 с официального сайта Docker (download.docker.com). Он не изменяет установленную в системе Docker Desktop: используется текущий демон, но для операции docker cp вызывается загруженный бинарный файл.


Структура репозитория

root@kitploit:~
POC CopyEscape (CVE-2026-17106)/
├── README.md                 ← Este archivo
├── LICENSE                   ← Licencia MIT
├── .gitignore
├── Dockerfile                ← Dockerfile unificado (macos | linux)
├── entrypoint.sh             ← Arranque del monitor sin LD_PRELOAD
├── monitor.c                 ← Monitor inotify unificado (una sola fuente)
├── watched_preload.c         ← LD_PRELOAD con cobertura ampliada
└── run-poc.sh                ← Runner robusto con reintentos

Каталог cli-vulnerable/ (загруженная CLI 29.6.1) исключается из репозитория через .gitignore. Скрипт автоматически загружает его, если он отсутствует.


Краткое руководство по использованию

1. Запуск PoC (вариант macOS, безвредный)

root@kitploit:~
cd poc-v2
./run-poc.sh

Скрипт:

  1. Загружает уязвимую CLI 29.6.1, если она отсутствует.
  2. Создаёт Docker-образ copyescape-macos-pocv2:local.
  3. Запускает подготовленный контейнер с COPYESCAPE_HOST_HOME=$HOME.
  4. Ожидает, пока /watched/file.txt станет читаемым внутри контейнера.
  5. Выполняет docker cp с помощью уязвимой CLI.
  6. Проверяет создание маркера ~/pwnd.

2. Параметры запускающего скрипта

root@kitploit:~
./run-poc.sh 10         # 10 intentos (la carrera es probabilistica)
./run-poc.sh --cleanup  # 5 intentos y borra la imagen al final

3. Ожидаемый вывод

root@kitploit:~
[run-poc] CLI vulnerable: 29.6.1
[run-poc] Intento 1/5 (contenedor copyescape-pocv2-NNNN-RRRR)
[run-poc]   /watched/file.txt lee: top-level file
[run-poc]   docker cp (CLI 29.6.1)...
[run-poc]   EXITO en intento 1: se creo /Users/<tu-usuario>/pwnd
  Contenido del marcador: COPYESCAPE_MACOS_DEMO
[run-poc]   Logs del monitor:
    [monitor] plataforma=macos target_dir=/Users/<tu-usuario> target_file=/Users/<tu-usuario>/pwnd quiet_ms=400 trigger=aaa.txt
    [monitor] pivoted /watched/file.txt/escape -> /Users/<tu-usuario>
[run-poc] Resumen: 1 exito en 1 intento(s).

4. Очистка

root@kitploit:~
rm -f -- "$HOME/pwnd"
rm -rf -- poc-v2/file.txt
docker image rm copyescape-macos-pocv2:local

Проверка эксплуатации

После завершения цепочки следующие элементы служат доказательством:


Сравнение с оригиналом

Что осталось от оригинала

Идея и стратегия принадлежат masasron: гонка TOCTOU против генератора tar, маскировка через LD_PRELOAD, приманка на 16 МиБ, переключение с помощью двух rename(2) и структура escape/ + .swap-escape. Без этого дизайна данная переработка не существовала бы. Концептуальная схема идентична.

Что было переписано

Примерно 15-20 % составляют строки, совпадающие дословно (короткие утилиты и константы раскладки). Остальное — новый код.


Митигация

  • Обновите CLI Docker до 29.7.0 или новее. PoC перестаёт работать (проверено на 29.7.2).
  • Не выполняйте docker cp из контейнера, которому не доверяете, и никогда от root в Linux.
  • Простое обнаружение: следить за созданием абсолютных символьных ссылок в месте назначения docker cp во время извлечения или блокировать на демоне tar-файлы, содержащие дочерние записи под символьной ссылкой.
  • Корень ошибки — тот же класс уязвимости, что и TarSlip / ZipSlip: CLI не проверяет, что последующие записи не выходят за пределы через уже созданную символьную ссылку.

Благодарности

  • Оригинальное исследование и публикация: masasron — https://github.com/masasron/CopyEscape-CVE-2026-17106
  • PoC и упаковка этого репозитория: собственная работа в образовательных целях, переписанная с нуля на основе оригинальной идеи.

Лицензия

Распространяется под лицензией MIT. Подробнее см. в файле LICENSE.

Скачать инструмент
/Users/<usuario>
/usr/bin
rename(2)
  • Полученный tar содержит символическую ссылку escape, за которой следует дочерняя запись escape/<basename>; уязвимая CLI создаёт символическую ссылку на клиенте и извлекает дочернюю запись через неё, записывая за пределы выбранного пользователем места назначения.
  • РесурсОжидаемое доказательство
    ~/pwndФайл с содержимым COPYESCAPE_MACOS_DEMO\n
    poc-v2/file.txt/Каталог (не файл) с escape -> /Users/<tu-usuario> (символическая ссылка) и aaa.txt (16 МиБ)
    docker logs <contenedor>Строка pivoted /watched/file.txt/escape -> /Users/<tu-usuario>
    CLI 29.7.2 (docker cp con CLI parcheada)Маркер не создаётся; PoC завершается неудачей
    ФайлИсходные строкиНовые строкиИзменение
    watched_preload.c89257Переписан: обёртки openat2, fstatat, statx, stat64, lstat64, open64, fopen64; потокобезопасный конструктор; защита от dlsym == NULL; O_TMPFILE
    monitor.c (macos + linux)259 + 233 = 492 (duplicados)344 (unificado)Переписан и унифицирован с -DCOPYESCAPE_TARGET_*; откат в try_pivot; настраиваемые exit_quiet_ms и триггер; надёжное обнаружение
    entrypoint.sh35env -u LD_PRELOAD вместо unset
    Dockerfile2243Унифицирован; закрепление digest; --platform; без -Werror; -static; LABEL
    demo-macos.sh → run-poc.sh88166Переписан: повторы гонки; логи при сбое; --cleanup; проверка делегирована бинарному файлу