
Apache Traffic Server 10.2.0 – Hoch – Lokal – Verbleibende Berechtigungen – JSON-RPC-Unix-Socket im uneingeschränkten Modus 0777
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
Klasse: Privilegien-Rest (Recon) Reichweite: Lokal
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Der JSON-RPC-Unix-Socket verwendet standardmäßig restricted_api false. Die mitgelieferte jsonrpc.yaml enthält nur Kommentare, sodass der C++-Initialisierer gewinnt. Der Linux-SO_PEERCRED-Bind-Modus ist 0777. Jede lokale UID, die das Rundir-Inode erreichen kann, verbindet sich ohne Token und gibt Live-Datensätze aus (einschließlich SSL-Schlüsselpfaden) sowie Connection-Tracker-5-Tupel. Schreibzugriffe bleiben hinter SO_PEERCRED geschützt (euid == 0 oder ATS-euid). Die Dokumentationstabelle gibt true / 0700 an; der Code und das kommentierte Beispiel sind false / 0777.
Dies ist nicht CVE-2026-58159 (HTTP-UDS-Listener-ACL). Es gibt kein TCP/HTTP-JSON-RPC. Plugin-Laden und Konfigurationsschreiben bleiben für eine fremde UID verweigert.
| ID | noch keine CVE |
| Klasse | Privilegien-Rest (Recon) |
| Reichweite | Lokal (unprivilegierte UID auf dem ATS-Host) |
| CWE | CWE-276, CWE-284 |
| CVSS | Hoch: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Produkt | Apache Traffic Server |
| Betroffen | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) Standard-JSON-RPC-Unix |
| Auth | keine bei uneingeschränkten Methoden. Lokaler Dateisystemzugriff auf das Rundir. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18720. Image ats-10.2.0-lab:local. |
Ich habe den Tag 10.2.0 gepinnt, Commit b1df7334b39a878971c376da849e8da4984918b6. Aus dem Quellcode gebautes Image.
Lokale UID auf dem ATS-Host (nicht root, nicht ATS-euid). RPC aktiviert. JSON-RPC-Unix aktiviert. Typisches Rundir 0755, im Besitz von ATS. Socket $RUNTIMEDIR/jsonrpc20.sock.
| Methode | Sink | Privileg |
|---|---|---|
admin_lookup_records als UID 10000 auf 0777 jsonrpc20.sock | uneingeschränktes JSON-RPC (RpcAdminPubHandlers.cc) | Recon (im Lab nachgewiesen): Live-proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS, SSL-Schlüsselpfade etc/trafficserver, proxy.config.admin.user_id=nobody. Schlüsselbytes sind nicht in den Datensätzen enthalten. |
get_connection_tracker_info | gleicher Socket | Recon (im Lab nachgewiesen): eingehende/ausgehende Tracker-Tabellen (leer ohne Last). |
get_server_status, admin_host_get_status, admin_storage_get_device_status, filemanager.get_files_registry | gleiches uneingeschränktes Bit | Recon (abgeleitet): Drain-Status, Host-Markdown, Cache-Disk-Pfade, absolute Konfigurationspfade. |
admin_config_set_records als UID 10000 | SO_PEERCRED eingeschränkt | Integrität: geschlossen (im Lab nachgewiesen). JSON-RPC-Fehler 10 Unauthorized, Denied privileged API access for uid=10000. Witness-Datensatz unverändert. |
| Drain / Cache-Leeren / Storage-Offline | eingeschränkte Methoden | Verfügbarkeit: geschlossen für eine fremde UID (Quellcode). |
Im Lab nachgewiesen vs. abgeleitet: 0777-Socket, UID-10000-Lookup von proxy_name / SSL-Schlüsselpfaden, Tracker-Tabellen, Schreiben verweigert, kein TCP-JSON-RPC: Lab. Andere uneingeschränkte Lesemethoden: abgeleitet aus demselben Gate.
Voraussetzungen: lokale UID auf dem ATS-Host. JSON-RPC-Unix aktiviert (Standard). Linux SO_PEERCRED, sodass der uneingeschränkte Bind 0777 ist. Rundir erreichbar (typisch 0755).
| Oberfläche | Labor |
|---|---|
admin_config_set_records als uid 10000 | Unauthorized; Witness-Datensatz unverändert |
| TCP / HTTP JSON-RPC | nicht vorhanden; nur HTTP 8080 / 18080 |
Plugin-.so-Laden via RPC | SO_PEERCRED |
traffic_ctl mit gleicher uid | vorgesehener Admin |
Atomares umask+bind, wenn restricted_api true ist | 0700, CHANGELOG-Fix zurückgehalten |
| CVE-2026-58159 HTTP-UDS-Listener-ACL | nicht dieser Socket |
RPC ist aktiv, sofern nicht rpc.enabled: false. Es existiert nur CommType::UNIX. Das mitgelieferte jsonrpc.yaml.default enthält nur Kommentare. Die YAML-Dekodierung schreibt restrictedAccessApi nur, wenn der Schlüssel vorhanden ist. Andernfalls:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API ist false (IPCSocketServer.h:128-129). Der Kommentar besagt, dass 0700 der Standard ist. Der Initialisierer ist die uneingeschränkte Konstante.
Bind (IPCSocketServer.cc:310-342): restricted_api false plus SO_PEERCRED -> Modus 0777. Der letzte Satz der Dokumentationstabelle besagt true als Standard. Der Code und das auskommentierte Beispiel folgen false.
Fehlannahmen: die Dokumentation true als Standard zu behandeln; dies als RCE zu bezeichnen (Schreibvorgänge werden verweigert); anzunehmen, dass CVE-2026-58159 das mgmt JSON-RPC abdeckt; nach einem TCP-Überbleibsel des alten traffic_manager XMLRPC zu suchen.
Theater: ein Schreibvorgang als uid 10000. Das Orakel ist ein eingeschleuster proxy_name plus SSL-Key-Pfad-Strings, dann eine verweigerte Menge.
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
oder
cd lab
./run.sh
Loopback 127.0.0.1:18720. Compose-Projekt ats-jsonrpc-unrestricted. Image ats-10.2.0-lab:local. Lab-uid 10000. Socket-Modus 0777. Witness ATS-JSONRPC-UNRESTRICTED-WITNESS. Letzte Zeile:
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
restricted_api standardmäßig auf true setzen und an 0700 binden, entsprechend der Dokumentationstabelle. Das auskommentierte jsonrpc.yaml-Beispiel angleichen. Uneingeschränkte Lesezugriffe hinter ein ausdrückliches Opt-in stellen. Schreibzugriffe erfordern bereits SO_PEERCRED; diese nicht öffnen.