
Apache Traffic Server 10.2.0 - Alta - Remota - SSRF - ESI unix recvport
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-esi-unix-recvport
Clase: SSRF Alcance: Remoto
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
El PluginVC de FetchSM de ESI informa el puerto de destino 0. El remapeo trata el puerto 0 como UDS y reescribe el esquema del include a http+unix para que coincida con las reglas map_with_recv_port http+unix:// destinadas únicamente a los listeners UDS. Un esi:include de aspecto público de http://www.example.com/secret pasa entonces a acceder al origen del socket unix. El GET /secret por TCP permanece en el mapa TCP. El CONTROL sin el mapa de puerto de recepción unix inserta en línea el origen TCP (sin testigo). El esquema de include http+unix en sí mismo es BAD_SCHEME en el validador de julio de 2026.
El típico esi.so más un map no alcanza esto. Requiere ESI más al menos una línea map_with_recv_port http+unix://. Por defecto remap_required: 1 y number_of_redirections: 0.
Esto no es CVE-2026-58178 (literales privados, file://, comentarios anidados, límite de profundidad cerrado).
| ID | aún sin CVE |
| Clase | SSRF |
| Alcance | Remoto (HTTP no autenticado a 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 |
| Producto | Apache Traffic Server |
| Afectado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) ESI más map_with_recv_port http+unix |
| Autenticación | ninguna. Plugin ESI. Mapa unix de puerto de recepción. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18750 / 18751. Imagen ats-10.2.0-lab:local. |
Fijé la etiqueta 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Imagen compilada desde el código fuente.
HTTP no autenticado a un vhost ESI cuyo remapeo tenga map_with_recv_port http+unix://. Incluir un src que el atacante pueda influir (origen comprometido, ESI almacenado o $(HTTP_HEADER{...})).
| Método | Sumidero | Privilegio |
|---|---|---|
GET /page no autenticado con include ESI http://www.example.com/secret | El puerto de destino 0 de FetchSM coincide con map_with_recv_port http+unix://www.example.com/ (RemapProcessor.cc:87-114, PluginVC.h:274-278) | Reconocimiento / SSRF (probado en laboratorio): el cuerpo del cliente insertó en línea ATS-ESI-UNIX-RECVPORT-WITNESS desde el origen UDS. |
| Igual | escritura de primer orden / shell | Integridad: ninguna. Sin escritura de primer orden. Sin shell. |
CONTROL GET /page sin mapa de puerto de recepción unix | Include del origen TCP | Cerrado (probado en laboratorio): inserta en línea TCP-ORIGIN-OK, sin testigo. |
Cliente TCP GET /secret en el vhost poc | Mapa TCP | Cerrado (probado en laboratorio): TCP-ORIGIN-OK, sin testigo. |
Probado en laboratorio vs inferido: control sin testigo, página poc con testigo, /secret por TCP de poc sin testigo: laboratorio. Influir en src mediante ESI almacenado o expansión de encabezados es el modelo de confianza documentado de ESI, no se vuelve a probar aquí. El include del laboratorio es un http://www.example.com/secret estático en /page.
Requiere: plugin ESI más map_with_recv_port http+unix. Por defecto remap_required: 1. number_of_redirections: 0.
| Superficie | Laboratorio |
|---|---|
| CONTROL sin mapa de puerto de recepción unix | control-no-witness=yes, inserta en línea TCP-ORIGIN-OK |
Cliente TCP GET /secret | poc-tcp-secret-no-witness=yes |
Esquema de inclusión http+unix | validador BAD_SCHEME |
file://, literales privados, comentarios anidados, límite de profundidad | CVE-2026-58178 cerrado |
| Lista de denegación de nombres de host sin DNS | documentado; inoperante con remap_required: 1 |
Fallo de remap_required: 1 | 404 |
number_of_redirections: 0 | Seguimiento de Location desactivado |
PluginVCCore pone a cero passive_addr_struct. PluginHttpConnectInternal establece solo active_addr (el cliente original). El HttpSM de FetchSM se ejecuta sobre el PluginVC pasivo. attach_client_session copia netvc->get_local_addr() en client_info.dst_addr. La dirección local pasiva es la estructura puesta a cero. host_order_port() es 0.
Búsqueda de remap (RemapProcessor.cc:87-114): el puerto 0 significa UDS. El esquema se reescribe de http a http+unix para que coincida map_with_recv_port http+unix://. La prueba unitaria test_RemapRules.cc:237-240 lo documenta.
El validador de julio rechaza el esquema de inclusión http+unix. No rechaza una inclusión http:// cuyo salto de remap interno se convirtió en unix porque el puerto de destino era 0.
Falsos caminos: tratar el típico esi.so + un map como este remanente (CONTROL demuestra que no lo es); registrar la lista de denegación de nombres de host sin DNS (documentado, inoperante con remap_required=1); afirmar que file:// sigue funcionando; esperar que el TCP /secret siga el mapa unix.
Teatro: una reverse shell. El oráculo es un testigo insertado en línea desde el origen UDS, con el TCP /secret todavía en 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. Proyecto de Compose ats-esi-unix-recvport. Imagen ats-10.2.0-lab:local. Testigo ATS-ESI-UNIX-RECVPORT-WITNESS. Última línea:
SUCCESS ats-esi-unix-recvport control-no-witness=yes poc-page-witness=yes poc-tcp-secret-no-witness=yes ATS-ESI-UNIX-RECVPORT-WITNESS
No tratar el puerto de destino 0 de FetchSM PluginVC como una coincidencia de puerto de recepción UDS. Mantener map_with_recv_port http+unix:// para los verdaderos listeners UDS. Las inclusiones ESI de http://host/ deben permanecer en el mapa TCP incluso cuando exista una regla de puerto de recepción http+unix para ese host.