
Apache Traffic Server 10.2.0 - Alta - Local - Privilegio residual - JSON-RPC unix socket modo sin restricciones 0777
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
Clase: Privilegio residual (recon) Alcance: Local
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
El socket unix JSON-RPC tiene por defecto restricted_api en false. El jsonrpc.yaml distribuido contiene solo comentarios, por lo que prevalece el inicializador en C++. El modo de enlace SO_PEERCRED en Linux es 0777. Cualquier uid local que pueda alcanzar el inodo del rundir se conecta sin token y vuelca registros en vivo (incluidas las rutas de claves SSL) además de las 5-tuplas del rastreador de conexiones. Las escrituras permanecen protegidas por SO_PEERCRED (euid == 0 o el euid de ATS). La tabla de la documentación indica true / 0700; el código y el ejemplo comentado indican false / 0777.
Esto no es CVE-2026-58159 (ACL del listener HTTP UDS). No existe JSON-RPC por TCP/HTTP. La carga de plugins y la escritura de configuración siguen denegadas para un uid ajeno.
| ID | aún sin CVE |
| Clase | Privilegio residual (recon) |
| Alcance | Local (uid sin privilegios en el host de ATS) |
| CWE | CWE-276, CWE-284 |
| CVSS | Alta: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Producto | Apache Traffic Server |
| Afectado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) unix JSON-RPC por defecto |
| Autenticación | ninguna en los métodos sin restricción. Alcance local del sistema de archivos al rundir. |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18720. Imagen ats-10.2.0-lab:local. |
Fijé la etiqueta 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Imagen compilada desde el código fuente.
Uid local en el host de ATS (no root, no el euid de ATS). RPC habilitado. JSON-RPC unix activado. Rundir típico 0755 propiedad de ATS. Socket $RUNTIMEDIR/jsonrpc20.sock.
| Método | Destino | Privilegio |
|---|---|---|
admin_lookup_records como uid 10000 sobre jsonrpc20.sock con 0777 | JSON-RPC sin restricción (RpcAdminPubHandlers.cc) | Recon (probado en laboratorio): proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS en vivo, rutas de claves SSL etc/trafficserver, proxy.config.admin.user_id=nobody. Los bytes de las claves no están en los registros. |
get_connection_tracker_info | mismo socket | Recon (probado en laboratorio): tablas del rastreador de entrada/salida (vacías sin carga). |
get_server_status, admin_host_get_status, admin_storage_get_device_status, filemanager.get_files_registry | mismo bit sin restricción | Recon (inferido): estado de drenaje, markdown del host, rutas de disco de caché, rutas de configuración absolutas. |
admin_config_set_records como uid 10000 | restringido por SO_PEERCRED | Integridad: cerrado (probado en laboratorio). Error 10 Unauthorized de JSON-RPC, Denied privileged API access for uid=10000. Registro testigo sin cambios. |
| drenaje / limpieza de caché / almacenamiento offline | métodos restringidos | Disponibilidad: cerrado para un uid ajeno (código fuente). |
Probado en laboratorio vs inferido: socket 0777, consulta por uid 10000 de proxy_name / rutas de claves SSL, tablas del rastreador, escritura denegada, ausencia de JSON-RPC por TCP: laboratorio. Otros métodos de lectura sin restricción: inferidos a partir de la misma puerta.
Requiere: uid local en el host de ATS. JSON-RPC unix activado (por defecto). SO_PEERCRED en Linux para que el enlace sin restricción sea 0777. Rundir accesible (típicamente 0755).
| Superficie | Laboratorio |
|---|---|
admin_config_set_records como uid 10000 | No autorizado; registro testigo sin cambios |
| TCP / HTTP JSON-RPC | ausente; solo HTTP 8080 / 18080 |
Carga de plugin .so vía RPC | SO_PEERCRED |
traffic_ctl con el mismo uid | admin previsto |
umask+bind atómico cuando restricted_api es true | 0700, corrección de CHANGELOG mantenida |
| ACL del listener HTTP UDS de CVE-2026-58159 | no es este socket |
RPC está activado a menos que rpc.enabled: false. Solo existe CommType::UNIX. El jsonrpc.yaml.default incluido contiene únicamente comentarios. La decodificación YAML solo escribe restrictedAccessApi cuando la clave está presente. En caso contrario:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API es false (IPCSocketServer.h:128-129). El comentario dice que 0700 es el valor predeterminado. El inicializador es la constante sin restricciones.
Bind (IPCSocketServer.cc:310-342): restricted_api false más SO_PEERCRED -> modo 0777. La última frase de la tabla de la documentación dice true por defecto. El código y el ejemplo comentado siguen false.
Caminos equivocados: tratar el true de la documentación como el valor predeterminado; llamar a esto RCE (escrituras denegadas); tratar CVE-2026-58159 como si cubriera el JSON-RPC de mgmt; buscar un remanente TCP del antiguo XMLRPC de traffic_manager.
Teatro: una escritura como uid 10000. El oráculo es un proxy_name plantado más cadenas de ruta de clave SSL, luego un conjunto denegado.
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
o
cd lab
./run.sh
Loopback 127.0.0.1:18720. Proyecto de Compose ats-jsonrpc-unrestricted. Imagen ats-10.2.0-lab:local. Uid del laboratorio 10000. Modo del socket 0777. Testigo ATS-JSONRPC-UNRESTRICTED-WITNESS. Última línea:
SUCCESS ats-jsonrpc-unrestricted how=uds-0777-unrestricted-jsonrpc uid=10000 sock-mode=0777 lookup-proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS ssl-key-path=etc/trafficserver tracker=ok write=unauthorized tcp-jsonrpc=absent ATS-JSONRPC-UNRESTRICTED-WITNESS
Establecer restricted_api en true por defecto y enlazar con 0700, coincidiendo con la tabla de la documentación. Alinear el ejemplo comentado de jsonrpc.yaml. Mantener las lecturas sin restricciones detrás de una habilitación explícita. Las escrituras ya requieren SO_PEERCRED; no abrirlas.