
Apache Traffic Server 10.2.0 - Alta - Local - Privilégio remanescente - Socket unix JSON-RPC em modo irrestrito 0777
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
Classe: Privilégio remanescente (recon) Alcance: Local
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
O socket unix JSON-RPC tem como padrão restricted_api false. O jsonrpc.yaml distribuído contém apenas comentários, então o inicializador em C++ prevalece. O modo de bind SO_PEERCRED no Linux é 0777. Qualquer uid local que consiga alcançar o inode do rundir conecta-se sem token e extrai registros ativos (incluindo caminhos de chaves SSL) além das 5-tuplas do rastreador de conexões. As escritas permanecem protegidas por SO_PEERCRED (euid == 0 ou euid do ATS). A tabela da documentação diz true / 0700; o código e o exemplo comentado são false / 0777.
Isto não é o CVE-2026-58159 (ACL do listener HTTP UDS). Não há JSON-RPC via TCP/HTTP. O carregamento de plugins e a escrita de configuração permanecem negados para um uid externo.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente (recon) |
| Alcance | Local (uid sem privilégios no host do 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 |
| Produto | Apache Traffic Server |
| Afetado | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) unix JSON-RPC padrão |
| Autenticação | nenhuma em métodos irrestritos. Alcance local do sistema de arquivos ao rundir. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18720. Imagem ats-10.2.0-lab:local. |
Fixe a tag 10.2.0, commit b1df7334b39a878971c376da849e8da4984918b6. Imagem compilada a partir do código-fonte.
Uid local no host do ATS (não root, não o euid do ATS). RPC habilitado. JSON-RPC unix ativado. Rundir típico 0755 pertencente ao ATS. Socket $RUNTIMEDIR/jsonrpc20.sock.
| Método | Destino | Privilégio |
|---|---|---|
admin_lookup_records como uid 10000 em jsonrpc20.sock 0777 | JSON-RPC irrestrito (RpcAdminPubHandlers.cc) | Recon (comprovado em lab): proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS ativo, caminhos de chaves SSL etc/trafficserver, proxy.config.admin.user_id=nobody. Os bytes das chaves não estão nos registros. |
get_connection_tracker_info | mesmo socket | Recon (comprovado em lab): tabelas de rastreamento de entrada/saída (vazias sem carga). |
get_server_status, admin_host_get_status, admin_storage_get_device_status, filemanager.get_files_registry | mesmo bit irrestrito | Recon (inferido): estado de drain, markdown de host, caminhos de disco de cache, caminhos absolutos de configuração. |
admin_config_set_records como uid 10000 | SO_PEERCRED restrito | Integridade: fechada (comprovado em lab). Erro JSON-RPC 10 Unauthorized, Denied privileged API access for uid=10000. Registro testemunha inalterado. |
| drain / limpeza de cache / storage offline | métodos restritos | Disponibilidade: fechada para um uid externo (código-fonte). |
Comprovado em lab vs inferido: socket 0777, consulta de proxy_name / caminhos de chaves SSL pelo uid 10000, tabelas do rastreador, escrita negada, ausência de JSON-RPC via TCP: lab. Outros métodos de leitura irrestritos: inferidos a partir do mesmo gate.
Requer: uid local no host do ATS. JSON-RPC unix ativado (padrão). SO_PEERCRED no Linux para que o bind irrestrito seja 0777. Rundir acessível (tipicamente 0755).
| Superfície | Laboratório |
|---|---|
admin_config_set_records como uid 10000 | Não autorizado; registro testemunha inalterado |
| TCP / HTTP JSON-RPC | ausente; apenas HTTP 8080 / 18080 |
Carregamento de plugin .so via RPC | SO_PEERCRED |
traffic_ctl com mesmo uid | admin pretendido |
umask+bind atômico quando restricted_api é true | 0700, correção do CHANGELOG mantida |
| ACL do listener HTTP UDS CVE-2026-58159 | não este socket |
O RPC fica ativo a menos que rpc.enabled: false. Apenas CommType::UNIX existe. O jsonrpc.yaml.default fornecido contém apenas comentários. A decodificação YAML só grava restrictedAccessApi quando a chave está presente. Caso contrário:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API é false (IPCSocketServer.h:128-129). O comentário diz que 0700 é o padrão. O inicializador é a constante irrestrita.
Bind (IPCSocketServer.cc:310-342): restricted_api false mais SO_PEERCRED -> modo 0777. A última frase da tabela da documentação diz true por padrão. O código e o exemplo comentado seguem false.
Caminhos errados: tratar o true da documentação como o padrão; chamar isto de RCE (escritas negadas); tratar CVE-2026-58159 como cobrindo o mgmt JSON-RPC; procurar um resquício TCP do antigo traffic_manager XMLRPC.
Teatro: uma escrita como uid 10000. O oráculo é um proxy_name plantado mais strings de caminho de chave SSL, depois um conjunto negado.
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
ou
cd lab
./run.sh
Loopback 127.0.0.1:18720. Projeto Compose ats-jsonrpc-unrestricted. Imagem ats-10.2.0-lab:local. uid do laboratório 10000. Modo do socket 0777. Testemunha ATS-JSONRPC-UNRESTRICTED-WITNESS. Última linha:
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
Definir restricted_api como true por padrão e vincular com 0700, correspondendo à tabela da documentação. Alinhar o exemplo comentado de jsonrpc.yaml. Manter as leituras irrestritas atrás de uma adesão explícita. As escritas já exigem SO_PEERCRED; não as abrir.