
Воспроизводит неаутентифицированную RCE-уязвимость ClamAV в ZendTo и повышение привилегий до root в авторизованной лабораторной среде, с закреплённым Docker-образом цели, проверкой по принципу fail-closed, привязанным к nonce выводом и очисткой.
Этот каталог — автономный комплект воспроизведения для авторизованной лаборатории: цепочка выполнения кода от ZendTo к ClamAV без учётной записи и её отдельное продолжение Smarty/root-cron на профиле по умолчанию. В комплект входят:
Начальный PoC выполняет выбранную вызывающей стороной команду от имени штатной служебной учётной записи clamav. Опциональный вариант продолжает эту безучётную точку опоры до выбранной вызывающей стороной команды от имени root. Оба по умолчанию используют id, отклоняют буквальный путь /root/flag и возвращают привязанный к nonce вывод по HTTPS.
Уязвимые связи группы, каталога, Smarty и root-cron являются значениями по умолчанию Debian-пакета/установщика ZendTo. Тем не менее достижимость root обусловлена окружением: этот точный положительный стенд использует том /var/zendto на ext4, работоспособные PHP CLI FFI/POSIX/exec и неограниченный процесс clamd. Включение AppArmor/SELinux или несовместимой семантики файловой системы может заблокировать продолжение на другой в остальном штатной установке.
Используйте это только на прилагаемом одноразовом стенде или другой системе, которую вам явно разрешено тестировать.
Авторитетная точная цель — локальный, намеренно неверсионируемый артефакт по пути:
image/zendto-installer-systemd-debian12.tar.zst
Git игнорирует архивы образов Docker. Перед точным регрессионным тестированием разместите авторизованную локальную копию по этому пути; scripts/setup.sh требует её записанные SHA-256 и ID образа. В source-recipe/README.md описано, как был собран и сохранён образ, производный от установщика. Новая сборка из живых репозиториев пакетов полезна для тестирования топологии, но не считается побайтно идентичной зафиксированной цели.
Скрипт настройки и точка входа контейнера отвергают любое несоответствие следующему профилю:
| Компонент | Точное протестированное значение |
|---|---|
| Docker image ID | sha256:de6d2f06ca04943362a9bdec5026e808448953728f31bd926343a4ed2ca2ef7c |
| ZendTo | 6.15-8 |
| ClamAV/libclamav package | 1.4.3+dfsg-1~deb12u2 |
| libclamav | libclamav.so.12.0.3, SHA-256 55e3cd94…027c |
| libclamav Build ID | e6427ab62146ee3001fe463d12e797e9d25bf81a |
| glibc | 2.36-9+deb12u14, SHA-256 6b4a4535…421 |
| основная база данных | v63, SHA-256 0b2182d2…365 |
| ежедневная база данных | v28082, SHA-256 cddbcccf…906 |
| база данных байт-кода | v339, SHA-256 6d4aa01f…ffb |
| clamd | MaxThreads 12, IdleTimeout 30, Restart=no |
| жизненный цикл | включённый clamav-daemon.socket, systemd PID 1 |
| веб-среда выполнения | Apache 2.4.68, PHP 8.2.32 |
| профиль MAC | неограниченный привилегированный Docker-стенд |
| root-мост | штатный clamav в www-data; /var/zendto root:www-data 0775 |
| root-потребитель | штатный root-cron очистки, ежечасно на 25-й минуте |
| кэш Smarty | детерминированный Smarty 4.5.4, скомпилированный zendto.conf |
| файловая система exchange | именованный том /var/zendto на ext4 |
Полные значения находятся в PROFILE.json.
Это строже, чем фиксация только версии пакета ClamAV. Конструкция аллокатора также зависит от glibc, трафика парсера, управляемого CVD, настроек рабочих процессов и точной целевой библиотеки. FreshClam отключён в сохранённом образе, и запуск завершается сбоем, если daily.cvd изменился или появился daily.cld.
Текущий долго работающий исследовательский контейнер в родительском рабочем пространстве не является чистым стендом: более позднее тестирование отключило его форму внешнего отправителя и обновило ежедневную базу данных. Эти изменения намеренно исключены здесь. Этот комплект использует чистую базовую линию, на которой была продемонстрирована нативная эксплуатация.
/sys/fs/cgroupzstd, Python 3 с venv, компилятор C, file и GNU readelfЦель разделяет ядро хоста и реализацию ASLR. Поэтому поведение отображений, зависящее от ядра, остаётся переменной переносимости.
Одновременно с пространством имён cgroup хоста должен работать только один systemd-стенд. На исходной исследовательской машине остановите более старый стенд, не удаляя его:
docker stop zendto-installer-systemd-native
Позже его можно восстановить командой docker start zendto-installer-systemd-native.
Из этого каталога:
./scripts/verify-bundle.sh
./scripts/setup.sh
Скрипт настройки:
.venv с зафиксированными Python-зависимостями PoC;/var/zendto и запускает systemd; иrenameat2(RENAME_EXCHANGE), выполняемую от имени clamav.Конечные точки по умолчанию доступны только через loopback:
http://127.0.0.1:18084/
https://127.0.0.1:18447/
Сертификат самоподписанный. PoC намеренно использует verify=False для каждого HTTP-запроса. Перед настройкой можно выбрать другие loopback-порты:
export ZENDTO_HTTP_PORT=19084
export ZENDTO_HTTPS_PORT=19447
./scripts/setup.sh
Используйте те же переменные окружения для последующих команд Compose/вспомогательных средств.
Проверяйте цель в любое время:
./scripts/verify-target.sh
docker compose ps
Чистая базовая линия установщика содержит:
allowExternalUploads = TRUE
confirmExternalEmails = TRUE
captcha = google
Его значения CAPTCHA и почты — это заполнители установщика, поэтому нетронутый архив не может реально доставить публичное проверочное письмо. Нативное регрессионное тестирование представляло лишь этот завершённый шаг приложения эквивалентной строкой AuthData внешнего отправителя. Целевой код, пакеты, сканер, права и путь эксплуатации не были изменены.
Создайте эту единственную лабораторную строку и файл токена с режимом 0600 командой:
./scripts/mint-lab-auth.py [email protected]
Значение токена скрыто и хранится по пути:
.lab/upload-auth-token.txt
Этот локальный помощник не является утверждением, что развёртывание с отключённой внешней загрузкой можно эксплуатировать удалённо. Если публичная форма внешнего отправителя отключена, PoC корректно останавливается до ClamAV, даже если предоставлен файл токена.
При обычном авторизованном развёртывании опустите --external-auth-token-file: вручную откройте страницу проверки, решите CAPTCHA, получите сгенерированное целью сообщение на почтовый ящик, контролируемый атакующим, и вставьте его URL/токен в скрытый запрос.