
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 Portata: Remota
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Il PluginVC FetchSM di ESI riporta la porta di destinazione 0. Il remap tratta la porta 0 come UDS e riscrive lo schema dell'include in http+unix, così che corrisponda alle regole map_with_recv_port http+unix:// pensate solo per i listener UDS. Un esi:include dall'aspetto pubblico di http://www.example.com/secret colpisce quindi l'origine unix-socket. Il GET /secret TCP resta sulla mappa TCP. Il CONTROL senza la mappa unix recv-port inlina l'origine TCP (nessuna prova). Lo schema di include http+unix stesso è BAD_SCHEME nel validatore di luglio 2026.
Il tipico esi.so più una sola map non attiva questo comportamento. Serve ESI più almeno una riga map_with_recv_port http+unix://. Valori predefiniti remap_required: 1 e number_of_redirections: 0.
Non è CVE-2026-58178 (letterali privati, file://, commenti annidati, limite di profondità chiuso).
| ID | nessun CVE al momento |
| Classe | SSRF |
| Portata | Remota (HTTP non autenticato verso un 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 |
| Prodotto | Apache Traffic Server |
| Affetto | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) ESI più map_with_recv_port http+unix |
| Auth | nessuna. Plugin ESI. Mappa unix recv-port. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18750 / 18751. Immagine ats-10.2.0-lab:local. |
Ho fissato il tag 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Immagine compilata dai sorgenti.
HTTP non autenticato verso un vhost ESI il cui remap ha map_with_recv_port http+unix://. Include src che l'attaccante può influenzare (origine compromessa, ESI memorizzato o $(HTTP_HEADER{...})).
| Metodo | Sink | Privilegio |
|---|---|---|
GET /page non autenticato con include ESI http://www.example.com/secret | La porta di destinazione 0 di FetchSM corrisponde a map_with_recv_port http+unix://www.example.com/ (RemapProcessor.cc:87-114, PluginVC.h:274-278) | Ricognizione / SSRF (dimostrato in lab): il corpo del client ha inlinato ATS-ESI-UNIX-RECVPORT-WITNESS dall'origine UDS. |
| Idem | scrittura di primo ordine / shell | Integrità: nessuna. Nessuna scrittura di primo ordine. Nessuna shell. |
CONTROL GET /page senza mappa unix recv-port | Include dell'origine TCP | Chiuso (dimostrato in lab): inlina TCP-ORIGIN-OK, nessuna prova. |
Client TCP GET /secret sul vhost poc | Mappa TCP | Chiuso (dimostrato in lab): TCP-ORIGIN-OK, nessuna prova. |
Dimostrato in lab vs dedotto: control senza prova, pagina poc con prova, /secret TCP poc senza prova: lab. Influenzare src tramite ESI memorizzato o espansione di header è il modello di fiducia ESI documentato, non ri-dimostrato qui. L'include del lab è un http://www.example.com/secret statico su /page.
Richiede: plugin ESI più map_with_recv_port http+unix. Predefiniti remap_required: 1. number_of_redirections: 0.
| Superficie | Lab |
|---|---|
| CONTROL senza mappa recv-port unix | control-no-witness=yes, inline TCP-ORIGIN-OK |
Client TCP GET /secret | poc-tcp-secret-no-witness=yes |
Includi schema http+unix | validatore BAD_SCHEME |
file://, letterali privati, commenti annidati, limite di profondità | CVE-2026-58178 chiusa |
| Denylist hostname senza DNS | documentato; inattivo con remap_required: 1 |
Mancata corrispondenza remap_required: 1 | 404 |
number_of_redirections: 0 | Segui Location disattivato |
PluginVCCore azzera passive_addr_struct. PluginHttpConnectInternal imposta solo active_addr (il client originale). L'HttpSM di FetchSM viene eseguito sul PluginVC passivo. attach_client_session copia netvc->get_local_addr() in client_info.dst_addr. L'indirizzo locale passivo è la struct azzerata. host_order_port() è 0.
Ricerca remap (RemapProcessor.cc:87-114): la porta 0 indica UDS. Lo schema viene riscritto da http a http+unix così che map_with_recv_port http+unix:// corrisponda. Il test unitario test_RemapRules.cc:237-240 lo documenta.
Il validatore di luglio rifiuta lo schema di inclusione http+unix. Non rifiuta un'inclusione http:// il cui hop di remap interno è diventato unix perché la porta di destinazione era 0.
Vicoli ciechi: trattare il tipico esi.so + una map come questo residuo (il CONTROL dimostra che non lo è); segnalare la denylist hostname senza DNS (documentato, inattivo con remap_required=1); sostenere che file:// funzioni ancora; aspettarsi che il TCP /secret segua la mappa unix.
Teatro: una reverse shell. L'oracolo è un witness inline dall'origine UDS, con il TCP /secret che resta TCP.
python3 ats-esi-unix-recvport-Abraxas-Labs.py
o
cd lab
./run.sh
Loopback poc 127.0.0.1:18750, control 127.0.0.1:18751. Progetto Compose ats-esi-unix-recvport. Immagine ats-10.2.0-lab:local. Witness ATS-ESI-UNIX-RECVPORT-WITNESS. Ultima riga:
SUCCESS ats-esi-unix-recvport control-no-witness=yes poc-page-witness=yes poc-tcp-secret-no-witness=yes ATS-ESI-UNIX-RECVPORT-WITNESS
Non trattare la porta di destinazione 0 di FetchSM PluginVC come una corrispondenza della porta di ricezione UDS. Mantieni map_with_recv_port http+unix:// per i veri listener UDS. Le inclusioni ESI di http://host/ devono rimanere sulla mappa TCP anche quando esiste una regola di porta di ricezione http+unix per quell'host.