
Apache Traffic Server 10.2.0 - Alta - Locale - Privilegi residui - Socket unix JSON-RPC in modalità non limitata 0777
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
Classe: Privilegio residuo (ricognizione) Portata: Locale
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Il socket unix JSON-RPC ha come valore predefinito restricted_api false. Il file jsonrpc.yaml distribuito contiene solo commenti, quindi vince l'inizializzatore C++. La modalità di bind SO_PEERCRED su Linux è 0777. Qualsiasi uid locale in grado di raggiungere l'inode della rundir si connette senza token ed estrae i record attivi (inclusi i percorsi delle chiavi SSL) oltre alle 5-tuple del connection-tracker. Le scritture restano protette da SO_PEERCRED (euid == 0 o euid di ATS). La tabella della documentazione indica true / 0700; il codice e l'esempio commentato indicano false / 0777.
Questa non è la CVE-2026-58159 (ACL del listener UDS HTTP). Non esiste JSON-RPC su TCP/HTTP. Il caricamento di plugin e la scrittura della configurazione restano negati per un uid estraneo.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (ricognizione) |
| Portata | Locale (uid non privilegiato sull'host ATS) |
| CWE | CWE-276, CWE-284 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Prodotto | Apache Traffic Server |
| Affetto | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) unix JSON-RPC predefinito |
| Autenticazione | nessuna sui metodi non limitati. Raggiungibilità della rundir tramite filesystem locale. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18720. Immagine ats-10.2.0-lab:local. |
Ho fissato il tag 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Immagine compilata dai sorgenti.
Uid locale sull'host ATS (non root, non l'euid di ATS). RPC abilitato. JSON-RPC unix attivo. Rundir tipica 0755 di proprietà di ATS. Socket $RUNTIMEDIR/jsonrpc20.sock.
| Metodo | Sink | Privilegio |
|---|---|---|
admin_lookup_records come uid 10000 su jsonrpc20.sock con permessi 0777 | JSON-RPC non limitato (RpcAdminPubHandlers.cc) | Ricognizione (dimostrata in lab): proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS attivo, percorsi delle chiavi SSL etc/trafficserver, proxy.config.admin.user_id=nobody. I byte delle chiavi non sono nei record. |
get_connection_tracker_info | stesso socket | Ricognizione (dimostrata in lab): tabelle del tracker in ingresso/uscita (vuote in assenza di carico). |
get_server_status, admin_host_get_status, admin_storage_get_device_status, filemanager.get_files_registry | stesso bit non limitato | Ricognizione (dedotta): stato di drain, markdown dell'host, percorsi dei dischi cache, percorsi assoluti della configurazione. |
admin_config_set_records come uid 10000 | SO_PEERCRED limitato | Integrità: chiusa (dimostrata in lab). Errore JSON-RPC 10 Unauthorized, Denied privileged API access for uid=10000. Record di controllo invariato. |
| drain / svuotamento cache / storage offline | metodi limitati | Disponibilità: chiusa per un uid estraneo (sorgente). |
Dimostrato in lab vs dedotto: socket 0777, lookup di proxy_name / percorsi delle chiavi SSL da parte dell'uid 10000, tabelle del tracker, scrittura negata, assenza di JSON-RPC su TCP: lab. Altri metodi di lettura non limitati: dedotti dallo stesso gate.
Requisiti: uid locale sull'host ATS. JSON-RPC unix attivo (predefinito). SO_PEERCRED su Linux affinché il bind non limitato sia 0777. Rundir raggiungibile (tipicamente 0755).
| Superficie | Lab |
|---|---|
admin_config_set_records come uid 10000 | Non autorizzato; record testimone invariato |
| TCP / HTTP JSON-RPC | assente; solo HTTP 8080 / 18080 |
Caricamento plugin .so via RPC | SO_PEERCRED |
traffic_ctl con stesso uid | admin previsto |
umask+bind atomico quando restricted_api è true | 0700, correzione CHANGELOG mantenuta |
| ACL del listener HTTP UDS CVE-2026-58159 | non questo socket |
RPC è attivo a meno che rpc.enabled: false. Esiste solo CommType::UNIX. Il file jsonrpc.yaml.default fornito contiene solo commenti. La decodifica YAML scrive restrictedAccessApi solo quando la chiave è presente. Altrimenti:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API è false (IPCSocketServer.h:128-129). Il commento dice che 0700 è il valore predefinito. L'inizializzatore è la costante unrestricted.
Bind (IPCSocketServer.cc:310-342): restricted_api false più SO_PEERCRED -> modalità 0777. L'ultima frase della tabella della documentazione dice true per impostazione predefinita. Il codice e l'esempio commentato seguono false.
Vicoli ciechi: considerare true della documentazione come valore predefinito; definire questo RCE (scritture negate); ritenere che CVE-2026-58159 copra il JSON-RPC di mgmt; cercare un residuo TCP del vecchio XMLRPC di traffic_manager.
Scenario: una scrittura come uid 10000. L'oracolo è un proxy_name inserito più stringhe di percorso della chiave SSL, poi un set negato.
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
o
cd lab
./run.sh
Loopback 127.0.0.1:18720. Progetto Compose ats-jsonrpc-unrestricted. Immagine ats-10.2.0-lab:local. UID del lab 10000. Modalità socket 0777. Witness ATS-JSONRPC-UNRESTRICTED-WITNESS. Ultima riga:
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
Impostare restricted_api su true per impostazione predefinita e associare 0700, in linea con la tabella della documentazione. Allineare l'esempio commentato di jsonrpc.yaml. Mantenere le letture non limitate dietro un opt-in esplicito. Le scritture richiedono già SO_PEERCRED; non aprirle.