
Apache Traffic Server 10.2.0 — высокий уровень — удалённо — запись файла — неподписанный magick convert выполняет запись от имени nobody
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-magick-unsigned
Класс: запись файлов Доступ: удалённый
Apache Traffic Server 10.2.0 (b1df7334) — Apache Software Foundation
Экспериментальный magick запускает ImageMagick ConvertImageCommand из ?magick= (percent+base64 convert argv), когда в plugin.config нет RSA-ключа. verified = nullptr == key_. В README указано, что ключ существует, чтобы избежать эксплуатации. Загрузка magick.so без аргументов — это поведение плагина по умолчанию.
Подписанный CONTROL с открытым RSA-ключом в plugin.config даёт 403, файл-свидетель не создаётся. Класс остаётся записью файлов. Дистрибутивный policy.xml часто отключает URL/shell-делегаты. Не завышайте до RCE.
| ID | CVE пока нет |
| Класс | Запись файлов (неподписанный convert argv) |
| Доступ | Удалённый (неаутентифицированный HTTP ?magick= через magick.so без ключа) |
| CWE | CWE-347, CWE-73 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Продукт | Apache Traffic Server |
| Затронуто | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) экспериментальный magick с неподписанным convert |
| Аутентификация | отсутствует |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18800 |
Я зафиксировал публичный тег 10.2.0 и коммит b1df7334. Лаборатория — это собранный из исходников ats-10.2.0-lab:local обратный прокси на loopback. Неподписанный convert -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS. Файл-свидетель 161 байт, владелец nobody. Подписанный CONTROL — 403.
Неаутентифицированный GET /img.png?magick= к исходному изображению с совместимым Content-Type, при загруженном magick.so и отсутствии RSA-ключа.
| Метод | Точка сброса | Привилегия |
|---|---|---|
Неаутентифицированный GET /img.png?magick= с неподписанным convert -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS | verified = nullptr == key_ (magick.cc:593-609), затем ConvertImageCommand | Целостность / файлы (доказано в лаборатории): файл-свидетель 161 байт, владелец nobody. В логах ImageMagick's syntax. HTTP 200. |
Тот же запрос с RSA-ключом в plugin.config | EVP_DigestVerify | Закрыто (доказано в лаборатории): 403 signature verification failed. Файл-свидетель не создан. |
| Огромный blob от origin | неограниченный blob_ | Доступность (предположительно): давление на память процесса. Аналог ограничения из CVE-2026-58186. Не относится к этой строке High. |
| URL / shell-делегаты IM | policy.xml | Закрыто в этой лаборатории: HTTP/HTTPS/URL/MVG/shell-делегаты отсутствуют. Не называйте это RCE. |
Доказано в лаборатории vs предположительно: неподписанная запись файла от имени nobody, подписанный 403, лог синтаксиса — это лаборатория. Неограниченный blob DoS — предположительно. RCE не заявляется.
Требуется: экспериментальный magick.so без ключа проверки, а также ImageMagick policy.xml, который всё ещё разрешает запись через путь convert. Не загружается в стандартном plugin.config.
| Поверхность | Лаборатория |
|---|---|
| magick загружен с открытым RSA-ключом | CONTROL 403, control-sigfail=yes, файла нет |
| magick не загружен | запрос magick неактивен |
wasm WASI path_open | NOENT |
| Тело запроса как вход IM | входом является blob ответа origin |
| Ограниченное декодирование webp_transform | CVE-2026-58186 закрыт; blob magick — это аналог, который не был ограничен |
Не CVE-2026-58186. В README Magick уже было сказано, что ключ существует, чтобы избежать эксплуатации. Остаётся загрузка плагина без этого ключа.
python3 ats-magick-unsigned-Abraxas-Labs.py
или
cd lab
./run.sh
Loopback 127.0.0.1:18800 (подписанный CONTROL на втором слушателе). Проект Compose ats-magick-unsigned. Образ ats-10.2.0-lab:local. Свидетель ATS-MAGICK-UNSIGNED-WITNESS. Последняя строка:
SUCCESS ats-magick-unsigned unsigned-http=200 file-write=yes uid=nobody syntax-log=true control-http=403 control-sigfail=yes ATS-MAGICK-UNSIGNED-WITNESS
Отказывать при отсутствии key_ (fail closed). Не запускать ConvertImageCommand для клиентского ?magick= без проверенного magickSig. Считать отсутствующий ключ признаком «плагин настроен неверно», а не «неподписанная конвертация допустима». Ограничить blob_ так же, как был ограничен webp_transform.
До этого не загружайте magick.so без RSA-публичного ключа продакшн-размера. Дистрибутивный policy.xml не заменяет подпись.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/magick/magick.cc verified = nullptr == key_plugins/experimental/magick/README