
Apache Traffic Server 10.2.0 - Alta - Remoto - Privilegi residui - Maiuscole/minuscole nel metodo ip_allow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-ipallow-method-case
Classe: Privilegio residuo Portata: Remota
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
I metodi HTTP/1 con maiuscole/minuscole miste aggirano il blocco predefinito di ip_allow.yaml per PURGE/PUSH/DELETE/TRACE e il TUNNEL verso l'origine rimappata con l'uid di ATS. Il parsing YAML e quello di @method nel remap non distinguono maiuscole e minuscole. H1 tokenizza e poi esegue strncmp sui byte della richiesta, restituendo -1 in caso di mancata corrispondenza di maiuscole/minuscole. L'inversione del deny tratta quel token sconosciuto come consentito. Il :method di HTTP/2 non distingue maiuscole e minuscole e resta bloccato. PURGE/PUSH della cache richiedono comunque un wksidx ben noto, quindi le maiuscole/minuscole miste non svuotano né inseriscono nella cache.
Questo è un residuo dell'ACL predefinita sui metodi in ingresso, non è CVE-2026-33267 (hop-by-hop) e non è l'ACL remap invertita per metodi vuoti non standard (chiusa su questo pin).
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo |
| Portata | Remota (HTTP/1 non autenticato da un client non loopback) |
| CWE | CWE-178, CWE-863 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Prodotto | Apache Traffic Server |
| Affetto | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) reverse proxy predefinito |
| Auth | nessuna. ip_allow.yaml predefinito. remap_required: 1 più una map. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18710. Immagine ats-10.2.0-lab:local. |
Ho fissato il tag 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Ultima Stable 17 ago 2026. Immagine compilata dai sorgenti, non un gadget.
Raggiungere un tipico reverse proxy (remap_required: 1 più una map) su HTTP/1 da un indirizzo non loopback. 127.0.0.1 è allow ALL. plugin.config vuoto. ip_allow.yaml predefinito.
| Metodo | Sink | Privilegio |
|---|---|---|
HTTP/1 delete / DeLeTe dopo remap da un sidecar 172.x | hdrtoken_method_tokenize poi process_quick_http_filter poi TUNNEL METHOD_NOT_SUPPORTED (HdrToken.cc:512-528, HttpTransact.cc:6855-6858) | Integrità (dimostrata in lab): origine 200 DELETED ATS-IPALLOW-METHOD-CASE-WITNESS. DELETE maiuscolo è 403. Metodo sull'origine con l'uid di ATS. |
HTTP/1 trace | stesso TUNNEL | Ricognizione (dimostrata in lab): origine 200 TRACE-OK. ATS non costruisce l'eco TRACE (wksidx non è TRACE). TRACE maiuscolo è 403. |
HTTP/1 purge / push | TUNNEL per metodo sconosciuto, non operazione di cache | Integrità (cache ATS): chiusa (dimostrata in lab). L'origine ha visto PURGE-ORIGIN / PUSH-ORIGIN. Le operazioni di cache richiedono un wksidx ben noto. push_method_enabled predefinito 0. |
| Stessa richiesta con maiuscole/minuscole miste | un hop extra verso l'origine | Disponibilità (dimostrata in lab): non è morte del processo. |
Dimostrato in lab vs dedotto: deny maiuscolo, tunnel DELETE/TRACE con maiuscole/minuscole miste, PURGE/PUSH della cache chiusi: lab. DELETE/TRACE sull'origine solo se quell'origine normalizza le maiuscole/minuscole del metodo (IIS / alcuni Java). Le origini RFC 9110 sensibili alle maiuscole/minuscole (nginx, httpd, Go) rispondono 501. L'origine del lab normalizza le maiuscole/minuscole.
Richiede: HTTP/1 da un client non-loopback. remap_required: 1 più una map. Deny inbound predefinito di PURGE/PUSH/DELETE/TRACE. Anche :method HTTP/2 nocase resta negato.
| Superficie | Lab |
|---|---|
DELETE / TRACE con case esatto da 172.x | 403, origin non raggiunto |
:method HTTP/2 con case misto | tokenizzazione nocase, comunque negato |
purge / push con case misto come operazioni cache ATS | l'origin ha visto il verbo; il percorso cache è rimasto chiuso |
Deny destinazione CONNECT (0.0.0.0/8, RFC1918, link-local, ::ffff:0:0/96) | ip_allow.yaml outbound predefinito |
Miss di remap_required: 1 | 404, non un open relay |
| ACL remap invertita vuota-nonstandard | correzione del CHANGELOG mantenuta |
CVE-2026-33267 hop-by-hop / rimozione @ | chiuso su questo pin |
Il file predefinito ip_allow.yaml è l'ACL standard dei metodi remoti. Il caricamento YAML usa hdrtoken_tokenize (nocase). L'inversione DENY imposta poi _method_mask = ALL & ~listed e _deny_nonstandard_methods = true con una lista nonstandard vuota (IPAllow.cc:545-548).
Il parsing HTTP/1 tokenizza con hdrtoken_method_tokenize. Il DFA è case-insensitive; l'helper esegue poi strncmp sui byte della richiesta rispetto alla stringa well-known e restituisce -1 in caso di mancata corrispondenza del case:
retval = hdrtoken_tokenize(string, string_len, &string_out);
if (retval >= 0) {
if (strncmp(string, string_out, string_len) != 0) {
// Not a case match
retval = -1;
}
}
EndRemapRequest chiama isNonstandardMethodAllowed per method == -1 (IPAllow.h:365-376). L'insieme nonstandard vuoto più deny-nonstandard equivale a !method_in_set, quindi il mixed-case è consentito. is_this_http_method_supported(-1) è false. METHOD_NOT_SUPPORTED imposta ProxyMode_t::TUNNELLING e restituisce true. La documentazione afferma che ATS inoltra i metodi sconosciuti all'origine. La ricerca nella cache viene saltata in TUNNELLING.
Il :method di HTTP/2 passa attraverso HTTPHdr::method_set -> hdrtoken_tokenize senza alcun controllo di maiuscole/minuscole. Il delete H2 diventa DELETE e viene negato. Questo residuo è HTTP/1.
Vicoli ciechi: considerare le origini case-sensitive di RFC 9110 come motivo per rendere la deny list un no-op (PURGE/PUSH nella cache ATS restano chiusi; DELETE/TRACE verso l'origine è il residuo); fare curl da 127.0.0.1 (allow ALL); sostenere un cache purge; ri-segnalare hop-by-hop.
Teatro: una reverse shell. L'oracolo è una stringa testimone sull'origine dopo il 403 in maiuscolo.
python3 ats-ipallow-method-case-Abraxas-Labs.py
o
cd lab
./run.sh