abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-realip-plugin-acl
类别: 权限残留 可达性: 远程
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
实验性 realip 加上文档所述的 acl.subjects: PLUGIN 会使重映射 @src_ip 失效开放(fail-open)。如果 realip 不调用 TSHttpTxnVerifiedAddrSet,_verified_addr 会保持为 AF_UNSPEC。PLUGIN 主体永远不会是 nullptr,因此 PEER 回退永远不会执行。ats_is_ip 为 false,@src_ip 被跳过,ip_matches 保持为 true。重映射允许列表会匹配不受信任的客户端。
默认的 acl.subjects 是 PEER。realip 不在默认的 plugin.config 中。会话 ip_allow.yaml 从不读取 PLUGIN。经典的“任何人都能发 X-Forwarded-For”问题已被关闭(需要 trustedAddress;头部必须是单个 inet_pton 地址)。
| ID | 暂无 CVE |
| 类别 | 权限残留(重映射 ACL 失效开放) |
| 可达性 | 远程(来自 trustedAddress 之外的未认证 HTTP) |
| CWE | CWE-863 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 产品 | Apache Traffic Server |
| 受影响 | 10.2.0(b1df7334b39a878971c376da849e8da4984918b6)实验性 realip + PLUGIN 主体 |
| 认证 | 无。客户端不在 trustedAddress 中。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18770 |
我固定了公开标签 10.2.0,剥离出 b1df7334。实验环境是回环上源码构建的 ats-10.2.0-lab:local 反向代理。CONTROL PEER 403。PLUGIN 200。会话 PURGE 仍为 403。
在加载实验性 realip.so 且 proxy.config.acl.subjects: PLUGIN(或 PLUGIN,PEER)的情况下访问 ATS。重映射 @src_ip=10.0.0.0/8 允许。从 trustedAddress 之外的地址连接。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
从 trustedAddress 之外的 172.x 发起 HTTP 到重映射 @src_ip=10.0.0.0/8 | realip 跳过 TSHttpTxnVerifiedAddrSet(address_setter.cc:29-38);PLUGIN 主体始终存在(UrlRewrite.cc:462-473);当 !ats_is_ip 时跳过 @src_ip(:495-514) | 完整性(实验环境已证实): 重映射 ACL 匹配。源站 200 ATS-REALIP-PLUGIN-ACL-WITNESS。CONTROL acl.subjects=PEER 为 403。 |
同上,外加来自不受信任对端的 Client-IP: 10.1.2.3 | simple.cc 的 verify 为 false;头部被忽略 | 完整性(实验环境已证实): 仍失效开放 200。并非伪造已验证地址。 |
同一客户端 PURGE | 会话 ip_allow.yaml PEER | 已关闭(实验环境已证实): 403。PLUGIN 从不重写连接 ACL。 |
不带 @src_ip 的主机 | 默认映射 | 已关闭(实验环境已证实): 响应体 DENIED,无见证。 |
实验环境已证实 vs 推断: PLUGIN 200、PEER 403、PURGE 403、拒绝映射、不受信任头部失效开放均为实验环境结果。源站随后授予什么,是根据本应仅限 10/8 的重映射推断的。
**需要:**实验性 realip.so 以及 acl.subjects=PLUGIN(或 PLUGIN,PEER)。重映射 @src_ip 允许列表。非默认。
| 攻击面 | 实验 |
|---|---|
CONTROL acl.subjects=PEER | 对同一个 @src_ip 映射返回 403 |
会话 ip_allow.yaml | 攻击者 PURGE 返回 403 |
不含 @src_ip 的映射 | DENIED |
空的 trustedAddress | 永不验证;仅当 subjects 为 PLUGIN 时仍保持 fail-open |
| 经典的任意来源 XFF | 已关闭。头部必须是来自受信对等方的单个 inet_pton 地址 |
SNI ip_allow | 仅限 PEER/PROXY;握手发生在 HTTP 头部之前 |
默认 subjects PEER | 遗留配置不适用 |
这不是经典的“信任来自任意来源的 X-Forwarded-For”遗留问题。该遗留问题是文档中记载的 PLUGIN 重映射 ACL 路径。
python3 ats-realip-plugin-acl-Abraxas-Labs.py
或
cd lab
./run.sh
回环 127.0.0.1:18770(源 18771)。Compose 项目 ats-realip-plugin-acl。镜像 ats-10.2.0-lab:local。攻击者 sidecar 172.x。见证 ATS-REALIP-PLUGIN-ACL-WITNESS。最后一行:
SUCCESS ats-realip-plugin-acl control-http=403 poc-http=200 purge-http=403 denied-http=200 spoof-http=200 trusted-http=200 ATS-REALIP-PLUGIN-ACL-WITNESS
当 get_verified_client_addr 为 AF_UNSPEC 时,将 PLUGIN 视为不可用(或让 getter 返回 nullptr,与 TSHttpTxnVerifiedAddrGet 保持一致)。这样 PEER 回退就会生效。当 subject 指针非空但不是 IP 时,不要跳过 @src_ip。在允许列表上采用失败关闭(fail closed)策略。
在此之前,如果你仅为日志记录而加载 realip,请将 acl.subjects 保持为 PEER。除非所有可能命中该重映射的客户端都已是受信任代理,否则不要设置 PLUGIN。
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/realip/address_setter.ccsrc/proxy/http/remap/UrlRewrite.cc PerformACLFilteringinclude/proxy/ProxyTransaction.h get_verified_client_addr