
Apache Traffic Server 10.2.0 - Alta - Remota - Privilegios residuales - Caso de método ip_allow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-ipallow-method-case
Clase: Privilegio residual Alcance: Remoto
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Los métodos HTTP/1 con mayúsculas y minúsculas mezcladas omiten la denegación por defecto de ip_allow.yaml de PURGE/PUSH/DELETE/TRACE y el TUNNEL hacia el origen remapeado con el uid de ATS. El análisis de YAML y de @method en el remap no distingue mayúsculas de minúsculas. H1 tokeniza y luego aplica strncmp a los bytes de la solicitud y devuelve -1 cuando hay discrepancia de mayúsculas/minúsculas. La inversión de la denegación trata ese token desconocido como permitido. El :method de HTTP/2 no distingue mayúsculas de minúsculas y permanece denegado. PURGE/PUSH de caché siguen necesitando un wksidx conocido, por lo que las mayúsculas y minúsculas mezcladas no purgan ni insertan en la caché.
Esto es un residuo de la ACL de métodos entrantes por defecto, no es CVE-2026-33267 (hop-by-hop) ni la ACL de remap invertida de vacío-no-estándar (cerrada en este pin).
| ID | aún sin CVE |
| Clase | Privilegio residual |
| Alcance | Remoto (HTTP/1 no autenticado desde un cliente no 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 |
| Producto | Apache Traffic Server |
| Afectado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) proxy inverso por defecto |
| Autenticación | ninguna. ip_allow.yaml por defecto. remap_required: 1 más un map. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18710. Imagen ats-10.2.0-lab:local. |
Fijé la etiqueta 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Última estable 17 ago 2026. Imagen compilada desde el código fuente, no es un gadget.
Alcanzar un proxy inverso típico (remap_required: 1 más un map) por HTTP/1 desde una dirección no loopback. 127.0.0.1 permite TODO. plugin.config vacío. ip_allow.yaml por defecto.
| Método | Destino | Privilegio |
|---|---|---|
HTTP/1 delete / DeLeTe tras el remap desde un sidecar 172.x | hdrtoken_method_tokenize y luego process_quick_http_filter y luego TUNNEL METHOD_NOT_SUPPORTED (HdrToken.cc:512-528, HttpTransact.cc:6855-6858) | Integridad (probado en laboratorio): origen 200 DELETED ATS-IPALLOW-METHOD-CASE-WITNESS. DELETE en mayúsculas es 403. Método en el origen como uid de ATS. |
HTTP/1 trace | mismo TUNNEL | Reconocimiento (probado en laboratorio): origen 200 TRACE-OK. ATS no construye el eco de TRACE (wksidx no es TRACE). TRACE en mayúsculas es 403. |
HTTP/1 purge / push | TUNNEL de método desconocido, no operación de caché | Integridad (caché de ATS): cerrado (probado en laboratorio). El origen vio PURGE-ORIGIN / PUSH-ORIGIN. Las operaciones de caché necesitan un wksidx conocido. push_method_enabled por defecto 0. |
| La misma solicitud con mayúsculas y minúsculas mezcladas | un salto extra al origen | Disponibilidad (probado en laboratorio): no es la muerte del proceso. |
Probado en laboratorio vs inferido: denegación en mayúsculas, túnel DELETE/TRACE con mayúsculas y minúsculas mezcladas, PURGE/PUSH de caché cerrado: laboratorio. DELETE/TRACE en el origen solo si ese origen normaliza las mayúsculas y minúsculas del método (IIS / algunos Java). Los orígenes sensibles a mayúsculas y minúsculas según RFC 9110 (nginx, httpd, Go) responden 501. El origen del laboratorio normaliza las mayúsculas y minúsculas.
Requiere: HTTP/1 de un cliente no loopback. remap_required: 1 más un map. Denegación entrante por defecto de PURGE/PUSH/DELETE/TRACE. El :method de HTTP/2 sin distinción de mayúsculas sigue denegado.
| Superficie | Laboratorio |
|---|---|
DELETE / TRACE con mayúsculas exactas desde 172.x | 403, origen no alcanzado |
:method de HTTP/2 con mayúsculas mixtas | tokenización sin distinción de mayúsculas, sigue denegado |
purge / push con mayúsculas mixtas como operaciones de caché de ATS | el origen vio el verbo; la ruta de caché permaneció cerrada |
Denegación de destino CONNECT (0.0.0.0/8, RFC1918, link-local, ::ffff:0:0/96) | ip_allow.yaml saliente por defecto |
Fallo de remap_required: 1 | 404, no un relay abierto |
| ACL de remap invertida de vacío-no-estándar | la corrección del CHANGELOG se mantuvo |
CVE-2026-33267 hop-by-hop / eliminación de @ | cerrado en este pin |
El ip_allow.yaml por defecto es la ACL de métodos remotos estándar. La carga de YAML usa hdrtoken_tokenize (sin distinción de mayúsculas). La inversión de DENY luego establece _method_mask = ALL & ~listed y _deny_nonstandard_methods = true con una lista no estándar vacía (IPAllow.cc:545-548).
El análisis de HTTP/1 tokeniza con hdrtoken_method_tokenize. El DFA no distingue mayúsculas de minúsculas; el helper luego hace strncmp de los bytes de la solicitud contra la cadena conocida y devuelve -1 en caso de discrepancia de mayúsculas:
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 solicita isNonstandardMethodAllowed para method == -1 (IPAllow.h:365-376). Conjunto no estándar vacío más denegar-no-estándar es !method_in_set, por lo que las mayúsculas y minúsculas mixtas están permitidas. is_this_http_method_supported(-1) es falso. METHOD_NOT_SUPPORTED establece ProxyMode_t::TUNNELLING y devuelve verdadero. La documentación indica que ATS reenvía los métodos desconocidos al origen. La búsqueda en caché se omite en TUNNELLING.
El :method de HTTP/2 pasa por HTTPHdr::method_set -> hdrtoken_tokenize sin comprobación de mayúsculas y minúsculas. El delete de H2 se convierte en DELETE y se deniega. Este residuo es HTTP/1.
Falsos caminos: tratar los orígenes sensibles a mayúsculas y minúsculas de RFC 9110 como algo que convierte la lista de denegación en un no-op (PURGE/PUSH de la caché de ATS permanecen cerrados; DELETE/TRACE del origen es el residuo); hacer curl desde 127.0.0.1 (permitir TODO); afirmar purga de caché; volver a presentar hop-by-hop.