
Apache Traffic Server 10.2.0 - Alta - Remoto - SSRF - ESI unix recvport
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-esi-unix-recvport
Classe: SSRF Alcance: Remoto
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
O PluginVC FetchSM do ESI reporta a porta de destino 0. O remap trata a porta 0 como UDS e reescreve o esquema do include para http+unix, de modo que ele corresponda às regras map_with_recv_port http+unix:// destinadas apenas a listeners UDS. Um esi:include de aparência pública para http://www.example.com/secret então atinge a origem do unix-socket. O GET /secret via TCP permanece no mapa TCP. O CONTROL sem o mapa unix recv-port faz inline da origem TCP (sem testemunha). O esquema de include http+unix em si é BAD_SCHEME no validador de julho de 2026.
O típico esi.so mais um map não atinge isso. Requer ESI mais pelo menos uma linha map_with_recv_port http+unix://. Padrões remap_required: 1 e number_of_redirections: 0.
Isto não é o CVE-2026-58178 (literais privados, file://, comentários aninhados, limite de profundidade fechado).
| ID | ainda sem CVE |
| Classe | SSRF |
| Alcance | Remoto (HTTP não autenticado para um vhost ESI) |
| CWE | CWE-918 |
| CVSS | Alto: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Produto | Apache Traffic Server |
| Afetado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) ESI mais map_with_recv_port http+unix |
| Autenticação | nenhuma. Plugin ESI. Mapa unix recv-port. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18750 / 18751. Imagem ats-10.2.0-lab:local. |
Fixe a tag 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Imagem compilada a partir do código-fonte.
HTTP não autenticado para um vhost ESI cujo remap tenha map_with_recv_port http+unix://. Inclua um src que o atacante possa influenciar (origem comprometida, ESI armazenado ou $(HTTP_HEADER{...})).
| Método | Sink | Privilégio |
|---|---|---|
GET /page não autenticado com ESI include http://www.example.com/secret | A porta de destino 0 do FetchSM corresponde a map_with_recv_port http+unix://www.example.com/ (RemapProcessor.cc:87-114, PluginVC.h:274-278) | Recon / SSRF (comprovado em lab): o corpo do cliente fez inline de ATS-ESI-UNIX-RECVPORT-WITNESS a partir da origem UDS. |
| O mesmo | escrita de primeira ordem / shell | Integridade: nenhuma. Nenhuma escrita de primeira ordem. Nenhum shell. |
CONTROL GET /page sem mapa unix recv-port | include da origem TCP | Fechado (comprovado em lab): faz inline de TCP-ORIGIN-OK, sem testemunha. |
Cliente TCP GET /secret no vhost poc | mapa TCP | Fechado (comprovado em lab): TCP-ORIGIN-OK, sem testemunha. |
Comprovado em lab vs inferido: controle sem testemunha, página poc com testemunha, /secret TCP poc sem testemunha: lab. Influenciar src via ESI armazenado ou expansão de cabeçalho é o modelo de confiança ESI documentado, não re-comprovado aqui. O include do lab é um http://www.example.com/secret estático em /page.
Requer: plugin ESI mais map_with_recv_port http+unix. Padrões remap_required: 1. number_of_redirections: 0.
| Superfície | Lab |
|---|---|
| CONTROL sem mapa de recv-port unix | control-no-witness=yes, inline TCP-ORIGIN-OK |
Cliente TCP GET /secret | poc-tcp-secret-no-witness=yes |
Esquema de include http+unix | validador BAD_SCHEME |
file://, literais privados, comentários aninhados, limite de profundidade | CVE-2026-58178 fechado |
| Denylist de hostname sem DNS | documentado; inoperante em remap_required: 1 |
Falha em remap_required: 1 | 404 |
number_of_redirections: 0 | Seguimento de Location desativado |
PluginVCCore zera passive_addr_struct. PluginHttpConnectInternal define apenas active_addr (o cliente original). O HttpSM do FetchSM é executado no PluginVC passivo. attach_client_session copia netvc->get_local_addr() para client_info.dst_addr. O endereço local passivo é a struct zerada. host_order_port() é 0.
Consulta de remap (RemapProcessor.cc:87-114): porta 0 significa UDS. O esquema é reescrito de http para http+unix, de modo que map_with_recv_port http+unix:// corresponde. O teste unitário test_RemapRules.cc:237-240 documenta isso.
O validador de julho rejeita o esquema de include http+unix. Ele não rejeita um include http:// cujo salto de remap interno se tornou unix porque a porta de destino era 0.
Caminhos errados: tratar o típico esi.so + um map como este resíduo (o CONTROL prova que não é); registrar a denylist de hostname sem DNS (documentado, inoperante em remap_required=1); afirmar que file:// ainda funciona; esperar que o TCP /secret siga o mapa unix.
Teatro: um reverse shell. O oráculo é uma testemunha inline da origem UDS, com o TCP /secret ainda em TCP.
python3 ats-esi-unix-recvport-Abraxas-Labs.py
ou
cd lab
./run.sh
Loopback poc 127.0.0.1:18750, controle 127.0.0.1:18751. Projeto Compose ats-esi-unix-recvport. Imagem ats-10.2.0-lab:local. Testemunha ATS-ESI-UNIX-RECVPORT-WITNESS. Última linha:
SUCCESS ats-esi-unix-recvport control-no-witness=yes poc-page-witness=yes poc-tcp-secret-no-witness=yes ATS-ESI-UNIX-RECVPORT-WITNESS
Não trate a porta de destino 0 do FetchSM PluginVC como uma correspondência de porta de recepção UDS. Mantenha map_with_recv_port http+unix:// para listeners UDS reais. Inclusões ESI de http://host/ devem permanecer no mapa TCP mesmo quando existir uma regra de porta de recepção http+unix para esse host.