
Apache Traffic Server 10.2.0 - Alta - Remoto - Privilégio residual - falha de ACL fail-open no PLUGIN realip
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-realip-plugin-acl
Classe: Privilégio remanescente Alcance: Remoto
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
realip experimental mais o acl.subjects: PLUGIN documentado falha-aberto no remap @src_ip. Se o realip não chamar TSHttpTxnVerifiedAddrSet, _verified_addr permanece AF_UNSPEC. O sujeito PLUGIN nunca é nullptr, então o fallback PEER nunca é executado. ats_is_ip é falso, @src_ip é ignorado, ip_matches permanece verdadeiro. Uma lista de permissões de remap corresponde ao cliente não confiável.
O acl.subjects padrão é PEER. O realip não está no plugin.config padrão. O ip_allow.yaml da sessão nunca lê PLUGIN. O clássico X-Forwarded-For-de-qualquer-um está fechado (trustedAddress obrigatório; o cabeçalho deve ser um único endereço inet_pton).
| ID | ainda sem CVE |
| Classe | Privilégio remanescente (falha-aberto da ACL de remap) |
| Alcance | Remoto (HTTP não autenticado de fora de trustedAddress) |
| CWE | CWE-863 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Produto | Apache Traffic Server |
| Afetado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) realip experimental + sujeitos PLUGIN |
| Autenticação | nenhuma. O cliente não está em trustedAddress. |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1:18770 |
Fixe a tag pública 10.2.0 e extraia b1df7334. O laboratório é um proxy reverso ats-10.2.0-lab:local compilado a partir do código-fonte em loopback. CONTROL PEER 403. PLUGIN 200. PURGE de sessão ainda 403.
Alcance o ATS com o realip.so experimental carregado e proxy.config.acl.subjects: PLUGIN (ou PLUGIN,PEER). Remapeie @src_ip=10.0.0.0/8 para permitir. Conecte-se de um endereço fora de trustedAddress.
| Método | Destino | Privilégio |
|---|---|---|
HTTP de 172.x fora de trustedAddress para remap @src_ip=10.0.0.0/8 | realip ignora TSHttpTxnVerifiedAddrSet (address_setter.cc:29-38); sujeito PLUGIN sempre presente (UrlRewrite.cc:462-473); ignora @src_ip quando !ats_is_ip (:495-514) | Integridade (comprovada em laboratório): a ACL de remap corresponde. Origem 200 ATS-REALIP-PLUGIN-ACL-WITNESS. CONTROL acl.subjects=PEER é 403. |
O mesmo mais Client-IP: 10.1.2.3 do par não confiável | simple.cc verify falso; cabeçalho ignorado | Integridade (comprovada em laboratório): ainda falha-aberto 200. Não é uma falsificação do endereço verificado. |
Mesmo cliente PURGE | sessão ip_allow.yaml PEER | Fechado (comprovado em laboratório): 403. PLUGIN nunca reescreve a ACL de conexão. |
Host sem @src_ip | mapa padrão | Fechado (comprovado em laboratório): corpo DENIED, sem testemunha. |
Comprovado em laboratório vs inferido: PLUGIN 200, PEER 403, PURGE 403, mapa negado, falha-aberto de cabeçalho não confiável são de laboratório. O que a origem então concede é inferido a partir do remap que deveria ser apenas 10/8.
Requer: realip.so experimental mais acl.subjects=PLUGIN (ou PLUGIN,PEER). Remapeia a lista de permissões @src_ip. Não é padrão.
| Superfície | Lab |
|---|---|
CONTROL acl.subjects=PEER | 403 no mesmo mapa @src_ip |
Sessão ip_allow.yaml | PURGE do atacante 403 |
Mapa sem @src_ip | DENIED |
trustedAddress vazio | nunca verifica; ainda fail-open apenas quando subjects é PLUGIN |
| XFF clássico de qualquer origem | fechado. O cabeçalho deve ser um único endereço inet_pton de um peer confiável |
SNI ip_allow | apenas PEER/PROXY; o handshake ocorre antes dos cabeçalhos HTTP |
Subjects padrão PEER | o resquício não se aplica |
Não é o resquício clássico de "confiar em X-Forwarded-For de qualquer origem". O resquício é o caminho documentado de ACL de remapeamento PLUGIN.
python3 ats-realip-plugin-acl-Abraxas-Labs.py
ou
cd lab
./run.sh
Loopback 127.0.0.1:18770 (origem 18771). Projeto Compose ats-realip-plugin-acl. Imagem ats-10.2.0-lab:local. Sidecar do atacante 172.x. Testemunha ATS-REALIP-PLUGIN-ACL-WITNESS. Última linha:
SUCCESS ats-realip-plugin-acl control-http=403 poc-http=200 purge-http=403 denied-http=200 spoof-http=200 trusted-http=200 ATS-REALIP-PLUGIN-ACL-WITNESS
Trate PLUGIN como indisponível quando get_verified_client_addr for AF_UNSPEC (ou faça o getter retornar nullptr, correspondendo a TSHttpTxnVerifiedAddrGet). Então o fallback para PEER é executado. Não ignore @src_ip quando o ponteiro do sujeito for não nulo mas não for um IP. Falhe de forma segura (fail closed) em uma lista de permissões.
Até então, deixe acl.subjects em PEER se você carrega o realip apenas para logging. Não defina PLUGIN a menos que todo cliente que possa atingir o remap já seja um proxy confiável.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/realip/address_setter.ccsrc/proxy/http/remap/UrlRewrite.cc PerformACLFilteringinclude/proxy/ProxyTransaction.h get_verified_client_addr