
Apache Traffic Server 10.2.0 — высокий уровень — удалённо — SSRF — ESI unix recvport
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-esi-unix-recvport
Класс: SSRF Доступ: Удалённый
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Плагин ESI FetchSM PluginVC сообщает порт назначения 0. Remap трактует порт 0 как UDS и переписывает схему include на http+unix, чтобы она соответствовала правилам map_with_recv_port http+unix://, предназначенным только для UDS-листенеров. Тогда внешне безобидный esi:include на http://www.example.com/secret попадает на unix-socket origin. TCP GET /secret остаётся на TCP-карте. CONTROL без unix recv-port map встраивает TCP origin (без свидетеля). Схема include http+unix сама по себе является BAD_SCHEME в валидаторе июля 2026.
Обычный esi.so плюс один map этого не достигает. Нужны ESI и хотя бы одна строка map_with_recv_port http+unix://. По умолчанию remap_required: 1 и number_of_redirections: 0.
Это не CVE-2026-58178 (приватные литералы, file://, вложенные комментарии, ограничение глубины закрыто).
| ID | CVE пока нет |
| Класс | SSRF |
| Доступ | Удалённый (неаутентифицированный HTTP к ESI vhost) |
| CWE | CWE-918 |
| CVSS | Высокий: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Продукт | Apache Traffic Server |
| Затронуто | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) ESI плюс map_with_recv_port http+unix |
| Аутентификация | нет. Плагин ESI. Recv-port unix map. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18750 / 18751. Образ ats-10.2.0-lab:local. |
Я зафиксировал тег 10.2.0, коммит b1df7334b39a878971c376da849e8da4984918b6. Образ собран из исходников.
Неаутентифицированный HTTP к ESI vhost, чей remap содержит map_with_recv_port http+unix://. Include src, на который атакующий может влиять (скомпрометированный origin, сохранённый ESI или $(HTTP_HEADER{...})).
| Метод | Sink | Привилегия |
|---|---|---|
Неаутентифицированный GET /page ESI include http://www.example.com/secret | Порт назначения FetchSM 0 совпадает с map_with_recv_port http+unix://www.example.com/ (RemapProcessor.cc:87-114, PluginVC.h:274-278) | Разведка / SSRF (доказано в лаборатории): тело клиента встроило ATS-ESI-UNIX-RECVPORT-WITNESS из UDS origin. |
| То же | запись первого порядка / shell | Целостность: нет. Нет записи первого порядка. Нет shell. |
CONTROL GET /page без unix recv-port map | TCP origin include | Закрыто (доказано в лаборатории): встраивает TCP-ORIGIN-OK, без свидетеля. |
TCP-клиент GET /secret на poc vhost | TCP map | Закрыто (доказано в лаборатории): TCP-ORIGIN-OK, без свидетеля. |
Доказано в лаборатории vs выведено: control без свидетеля, poc-страница со свидетелем, poc TCP /secret без свидетеля: лаборатория. Влияние на src через сохранённый ESI или раскрытие заголовка — это документированная модель доверия ESI, здесь заново не доказывалась. Include в лаборатории — статический http://www.example.com/secret на /page.
Требуется: плагин ESI плюс map_with_recv_port http+unix. По умолчанию remap_required: 1. number_of_redirections: 0.
| Поверхность | Лаборатория |
|---|---|
| CONTROL без unix recv-port map | control-no-witness=yes, встраивает TCP-ORIGIN-OK |
TCP-клиент GET /secret | poc-tcp-secret-no-witness=yes |
Include-схема http+unix | валидатор BAD_SCHEME |
file://, приватные литералы, вложенные комментарии, ограничение глубины | CVE-2026-58178 закрыт |
| Denylist имён хостов без DNS | задокументировано; не работает при remap_required: 1 |
Промах remap_required: 1 | 404 |
number_of_redirections: 0 | Следование Location отключено |
PluginVCCore обнуляет passive_addr_struct. PluginHttpConnectInternal устанавливает только active_addr (исходный клиент). HttpSM из FetchSM работает на пассивном PluginVC. attach_client_session копирует netvc->get_local_addr() в client_info.dst_addr. Пассивный локальный адрес — это обнулённая структура. host_order_port() равен 0.
Поиск remap (RemapProcessor.cc:87-114): порт 0 означает UDS. Схема переписывается http -> http+unix, так что map_with_recv_port http+unix:// совпадает. Модульный тест test_RemapRules.cc:237-240 это документирует.
Июльский валидатор отклоняет include-схему http+unix. Он не отклоняет include с http://, чей внутренний remap-переход стал unix из-за нулевого порта назначения.
Неверные пути: считать типичный esi.so + один map этим остатком (CONTROL доказывает, что это не так); регистрировать denylist имён хостов без DNS (задокументировано, не работает при remap_required=1); утверждать, что file:// всё ещё работает; ожидать, что TCP /secret будет следовать unix-карте.
Театр: обратная оболочка. Оракул — встроенный свидетель от UDS-источника, при этом TCP /secret остаётся TCP.
python3 ats-esi-unix-recvport-Abraxas-Labs.py
или
cd lab
./run.sh
Loopback poc 127.0.0.1:18750, control 127.0.0.1:18751. Проект Compose ats-esi-unix-recvport. Образ ats-10.2.0-lab:local. Свидетель ATS-ESI-UNIX-RECVPORT-WITNESS. Последняя строка:
SUCCESS ats-esi-unix-recvport control-no-witness=yes poc-page-witness=yes poc-tcp-secret-no-witness=yes ATS-ESI-UNIX-RECVPORT-WITNESS
Не следует рассматривать dest port 0 у FetchSM PluginVC как совпадение с recv-port для UDS. Сохраняйте map_with_recv_port http+unix:// для настоящих UDS-слушателей. ESI-включения http://host/ должны оставаться в TCP-карте, даже если для этого хоста существует правило recv-port http+unix.