abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
类别: 权限残留(侦察) 可达范围: 本地
Apache Traffic Server 10.2.0(b1df7334) - Apache Software Foundation
JSON-RPC unix socket 默认将 restricted_api 设为 false。随附的 jsonrpc.yaml 仅含注释,因此 C++ 初始化器生效。Linux SO_PEERCRED 绑定模式为 0777。任何能访问 rundir inode 的本地 uid 无需令牌即可连接,并导出实时记录(包括 SSL 密钥路径)以及连接跟踪器 5 元组。写入仍受 SO_PEERCRED 限制(euid == 0 或 ATS euid)。文档表格写的是 true / 0700;代码和注释示例则是 false / 0777。
这不是 CVE-2026-58159(HTTP UDS 监听器 ACL)。不存在 TCP/HTTP JSON-RPC。插件加载和配置写入对外部 uid 仍被拒绝。
| ID | 暂无 CVE |
| 类别 | 权限残留(侦察) |
| 可达范围 | 本地(ATS 主机上的非特权 uid) |
| CWE | CWE-276、CWE-284 |
| CVSS | 高危:7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| 产品 | Apache Traffic Server |
| 受影响版本 | 10.2.0(b1df7334b39a878971c376da849e8da4984918b6)默认 JSON-RPC unix |
| 认证 | 无限制方法无需认证。需本地文件系统可达 rundir。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18720。镜像 ats-10.2.0-lab:local。 |
我固定了标签 10.2.0,提交 b1df7334b39a878971c376da849e8da4984918b6。源码构建镜像。
ATS 主机上的本地 uid(非 root,非 ATS euid)。RPC 已启用。JSON-RPC unix 已开启。典型 rundir 为 0755,属主为 ATS。Socket 为 $RUNTIMEDIR/jsonrpc20.sock。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
以 uid 10000 在 0777 的 jsonrpc20.sock 上调用 admin_lookup_records | 无限制 JSON-RPC(RpcAdminPubHandlers.cc) | 侦察(实验验证): 实时 proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS、SSL 密钥路径 etc/trafficserver、proxy.config.admin.user_id=nobody。记录中不含密钥字节。 |
get_connection_tracker_info | 同一 socket | 侦察(实验验证): 入站/出站跟踪器表(无负载时为空)。 |
get_server_status、admin_host_get_status、admin_storage_get_device_status、filemanager.get_files_registry | 同一无限制位 | 侦察(推断): 排空状态、主机标记、缓存磁盘路径、绝对配置路径。 |
以 uid 10000 调用 admin_config_set_records | SO_PEERCRED 受限 | 完整性:已关闭(实验验证)。 JSON-RPC 错误 10 Unauthorized,Denied privileged API access for uid=10000。见证记录未变。 |
| 排空 / 清除缓存 / 存储离线 | 受限方法 | 可用性:已关闭,对外部 uid(源码)。 |
实验验证 vs 推断: 0777 socket、uid 10000 查询 proxy_name / SSL 密钥路径、跟踪器表、写入被拒、TCP JSON-RPC 不存在:实验验证。其他无限制读取方法:基于同一门控推断。
前提条件: ATS 主机上的本地 uid。JSON-RPC unix 已开启(默认)。Linux SO_PEERCRED,因此无限制绑定为 0777。rundir 可达(典型 0755)。
| 攻击面 | 实验环境 |
|---|---|
以 uid 10000 调用 admin_config_set_records | 未授权;见证记录未改变 |
| TCP / HTTP JSON-RPC | 不存在;仅有 HTTP 8080 / 18080 |
通过 RPC 加载插件 .so | SO_PEERCRED |
同 uid 的 traffic_ctl | 预期管理员 |
当 restricted_api 为 true 时的原子 umask+bind | 0700,CHANGELOG 修复保留 |
| CVE-2026-58159 HTTP UDS 监听器 ACL | 不是此套接字 |
除非设置 rpc.enabled: false,否则 RPC 处于开启状态。只存在 CommType::UNIX。随附的 jsonrpc.yaml.default 仅包含注释。YAML 解码仅在键存在时才写入 restrictedAccessApi。否则:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API 为 false(IPCSocketServer.h:128-129)。注释称 0700 为默认值。初始化器使用的是不受限常量。
绑定(IPCSocketServer.cc:310-342):restricted_api 为 false 且启用 SO_PEERCRED -> 模式为 0777。文档表格最后一句称默认值为 true。代码和注释中的示例都遵循 false。
错误方向:将文档中的 true 当作默认值;将其称为 RCE(写入被拒绝);认为 CVE-2026-58159 涵盖 mgmt JSON-RPC;寻找旧 traffic_manager XMLRPC 遗留的 TCP 端口。
验证实验:以 uid 10000 执行一次写入。判定依据是植入的 proxy_name 加上 SSL 密钥路径字符串,然后是一个被拒绝的集合。
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
或
cd lab
./run.sh
Loopback 127.0.0.1:18720。Compose 项目 ats-jsonrpc-unrestricted。镜像 ats-10.2.0-lab:local。实验 uid 10000。套接字模式 0777。见证 ATS-JSONRPC-UNRESTRICTED-WITNESS。最后一行:
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 默认设为 true 并绑定 0700,与文档表格保持一致。对齐注释中的 jsonrpc.yaml 示例。将不受限制的读取保留在显式选择加入之后。写入操作已要求 SO_PEERCRED;不要开放它们。
b1df7334b39a878971c376da849e8da4984918b6)IPCSocketServer.h restrictedAccessApiIPCSocketServer.cc 绑定模式 0777RpcAdminPubHandlers.ccjsonrpc.yaml.default