
Apache Traffic Server 10.2.0 – Hoch – Remote – SSRF – ESI unix recvport
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-esi-unix-recvport
Klasse: SSRF Reichweite: Remote
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Das ESI-FetchSM-PluginVC meldet Zielport 0. Remap behandelt Port 0 als UDS und schreibt das Include-Schema auf http+unix um, sodass es zu map_with_recv_port http+unix://-Regeln passt, die nur für UDS-Listener gedacht sind. Ein öffentlich wirkendes esi:include von http://www.example.com/secret trifft dann den Unix-Socket-Ursprung. TCP GET /secret bleibt auf der TCP-Map. CONTROL ohne die Unix-Recv-Port-Map bettet den TCP-Ursprung inline ein (kein Witness). Das Include-Schema http+unix selbst ist BAD_SCHEME im Validator von Juli 2026.
Typisches esi.so plus eine map trifft dies nicht. Benötigt ESI plus mindestens eine map_with_recv_port http+unix://-Zeile. Standard remap_required: 1 und number_of_redirections: 0.
Dies ist nicht CVE-2026-58178 (private Literale, file://, verschachtelte Kommentare, Tiefenbegrenzung geschlossen).
| ID | noch keine CVE |
| Klasse | SSRF |
| Reichweite | Remote (unauthentifiziertes HTTP an einen ESI-Vhost) |
| CWE | CWE-918 |
| CVSS | Hoch: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Produkt | Apache Traffic Server |
| Betroffen | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) ESI plus map_with_recv_port http+unix |
| Auth | keine. ESI-Plugin. Recv-Port-Unix-Map. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18750 / 18751. Image ats-10.2.0-lab:local. |
Ich habe den Tag 10.2.0 gepinnt, Commit b1df7334b39a878971c376da849e8da4984918b6. Aus dem Quellcode gebautes Image.
Unauth-HTTP an einen ESI-Vhost, dessen Remap map_with_recv_port http+unix:// enthält. Include-src, das der Angreifer beeinflussen kann (kompromittierter Ursprung, gespeichertes ESI oder $(HTTP_HEADER{...})).
| Methode | Sink | Privileg |
|---|---|---|
Unauth GET /page ESI-Include http://www.example.com/secret | FetchSM-Zielport 0 passt zu map_with_recv_port http+unix://www.example.com/ (RemapProcessor.cc:87-114, PluginVC.h:274-278) | Recon / SSRF (im Lab nachgewiesen): Client-Body bettete ATS-ESI-UNIX-RECVPORT-WITNESS vom UDS-Ursprung inline ein. |
| Dasselbe | Write erster Ordnung / Shell | Integrität: keine. Kein Write erster Ordnung. Keine Shell. |
CONTROL GET /page ohne Unix-Recv-Port-Map | TCP-Ursprung-Include | Geschlossen (im Lab nachgewiesen): bettet TCP-ORIGIN-OK inline ein, kein Witness. |
TCP-Client GET /secret auf dem poc-Vhost | TCP-Map | Geschlossen (im Lab nachgewiesen): TCP-ORIGIN-OK, kein Witness. |
Im Lab nachgewiesen vs. abgeleitet: Control ohne Witness, poc-Seite mit Witness, poc-TCP /secret ohne Witness: Lab. Das Beeinflussen von src über gespeichertes ESI oder Header-Expansion ist das dokumentierte ESI-Vertrauensmodell und wird hier nicht erneut nachgewiesen. Das Lab-Include ist ein statisches http://www.example.com/secret auf /page.
Erfordert: ESI-Plugin plus map_with_recv_port http+unix. Standard remap_required: 1. number_of_redirections: 0.
| Oberfläche | Lab |
|---|---|
| CONTROL ohne Unix-recv-port-Map | control-no-witness=yes, inlined TCP-ORIGIN-OK |
TCP-Client GET /secret | poc-tcp-secret-no-witness=yes |
Include-Schema http+unix | Validator BAD_SCHEME |
file://, private Literale, verschachtelte Kommentare, Tiefenbegrenzung | CVE-2026-58178 geschlossen |
| Hostname-Denylist ohne DNS | dokumentiert; wirkungslos bei remap_required: 1 |
remap_required: 1-Fehltreffer | 404 |
number_of_redirections: 0 | Location-Follow aus |
PluginVCCore setzt passive_addr_struct auf Null. PluginHttpConnectInternal setzt nur active_addr (den ursprünglichen Client). FetchSMs HttpSM läuft auf dem passiven PluginVC. attach_client_session kopiert netvc->get_local_addr() nach client_info.dst_addr. Die passive lokale Adresse ist die genullte Struktur. host_order_port() ist 0.
Remap-Lookup (RemapProcessor.cc:87-114): Port 0 bedeutet UDS. Das Schema wird von http zu http+unix umgeschrieben, sodass map_with_recv_port http+unix:// passt. Der Unit-Test test_RemapRules.cc:237-240 dokumentiert das.
Der Juli-Validator lehnt das Include-Schema http+unix ab. Er lehnt jedoch kein http://-Include ab, dessen interner Remap-Hop zu Unix wurde, weil der Zielport 0 war.
Irrwege: typisches esi.so + eine map als diesen Überrest zu behandeln (CONTROL beweist, dass es das nicht ist); eine Hostname-Denylist ohne DNS zu melden (dokumentiert, wirkungslos bei remap_required=1); zu behaupten, file:// funktioniere noch; zu erwarten, dass TCP /secret der Unix-Map folgt.
Theater: eine Reverse Shell. Das Orakel ist ein inlined Witness vom UDS-Origin, wobei TCP /secret weiterhin TCP bleibt.
python3 ats-esi-unix-recvport-Abraxas-Labs.py
oder
cd lab
./run.sh
Loopback-PoC 127.0.0.1:18750, Steuerung 127.0.0.1:18751. Compose-Projekt ats-esi-unix-recvport. Image ats-10.2.0-lab:local. Witness ATS-ESI-UNIX-RECVPORT-WITNESS. Letzte Zeile:
SUCCESS ats-esi-unix-recvport control-no-witness=yes poc-page-witness=yes poc-tcp-secret-no-witness=yes ATS-ESI-UNIX-RECVPORT-WITNESS
Behandle den FetchSM PluginVC-Zielport 0 nicht als UDS-Empfangsport-Übereinstimmung. Behalte map_with_recv_port http+unix:// für echte UDS-Listener bei. ESI-Includes von http://host/ sollten auf der TCP-Zuordnung bleiben, auch wenn eine http+unix-Empfangsport-Regel für diesen Host existiert.