abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-authproxy-prefix
类别: 权限残留 可达性: 远程
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
authproxy 的 --forward-header-prefix 会将 2xx 认证辅助程序返回的身份字段复制到客户端请求上。HttpSetMimeHeader 只会查找并覆盖该名称的第一个字段。客户端额外复制的字段会保留下来。若源站对同一头部采用后者覆盖前者的策略,就会把客户端提供的值当作身份。
默认的 plugin.config 为空。此残留问题需要插件在带有该前缀选项的 remap 上加载。客户端仍须通过认证(2xx)。认证 403 永远不会到达源站。
| ID | 暂无 CVE |
| 类别 | 权限残留(身份头部植入) |
| 可达性 | 远程(通过带 --forward-header-prefix 的 authproxy 发起 HTTP 请求) |
| CWE | CWE-444、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)authproxy 前缀覆盖层 |
| 认证 | 已从认证辅助程序获得 2xx 的客户端。插件已启用。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1:18760 |
我固定了公开标签 10.2.0 对应的提交 b1df7334。实验环境是在回环地址上源码构建的 ats-10.2.0-lab:local 反向代理。认证辅助程序返回 2xx 与 403。源站对 X-Auth-User 采用后者覆盖前者的策略。
访问一个加载了 authproxy.so 且带有 --forward-header-prefix=X-Auth- 的 ATS remap。在辅助程序判定为 2xx 的请求上发送两行 X-Auth-User。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
在 2xx 认证辅助程序之后重复 X-Auth-User | StateAuthorized 覆盖层,随后 HttpSetMimeHeader(authproxy.cc:660-690、utils.cc:87-102) | 完整性(实验已证实): 源站采用后者覆盖前者。实验:X-Auth-User-0: realuser 加上 X-Auth-User-1: ATS-AUTHPROXY-PREFIX-WITNESS。对照组无/单值保持 REALUSER-ONLY。 |
| 同样的植入 | 源站基于该头部的 ACL / 用户查询 | 侦察(推断): 被植入的身份在源站能读取的任何内容。不是堆转储。不是 ATS 配置。 |
| 认证辅助程序返回 403 且带有相同的重复头部 | StateUnauthorized;源站未被重新启用 | 已封闭(实验已证实): 源站命中不变。客户端收到 403。见证值不在响应体中。 |
实验已证实与推断: 重复后者覆盖前者、单值覆盖、无值,以及 403 未到达,均为实验证实。植入后的源站权限是根据后者覆盖前者身份推断的。
前提条件: authproxy.so 带有 --forward-header-prefix。客户端必须通过认证(2xx)。源站必须将这些前缀头部视为身份(这正是该选项存在的原因)。默认 plugin.config 中未加载。
| 表面 | 实验 |
|---|---|
| 无客户端前缀头 | CONTROL none:来源 REALUSER-ONLY |
| 单一客户端前缀 | CONTROL single:第一个字段被覆盖;见证不会保留 |
| 认证辅助程序 403 | 未到达来源(control-403=yes) |
| 插件未加载 | 残留内容不适用 |
逐跳 / @ 头 | 在插件钩子之前被剥离(CVE-2026-33267) |
| 空认证响应头列表 | 不再断言(变更日志) |
认证器 SNI / url_sig C= | 在此固定版本上已关闭(CVE-2026-58162 / 58181) |
不是 CVE-2026-58162。uri_signing 仅支持 SHA-256/SHA-512。url_sig C= 缺少分隔符仍会拒绝。
python3 ats-authproxy-prefix-Abraxas-Labs.py
或
cd lab
./run.sh
回环地址 127.0.0.1:18760(源 18761,认证辅助程序 18762)。Compose 项目 ats-authproxy-prefix。镜像 ats-10.2.0-lab:local。见证 ATS-AUTHPROXY-PREFIX-WITNESS。最后一行:
SUCCESS ats-authproxy-prefix pin=10.2.0 control-none=REALUSER-ONLY control-single=REALUSER-ONLY control-403=yes dup-last-wins=yes ATS-AUTHPROXY-PREFIX-WITNESS
在覆盖之前,剥离所有名称以 --forward-header-prefix 开头的客户端字段。HttpRemoveMimeHeader 已经会遍历 TSMimeHdrFieldFind 直到不再有剩余字段(utils.cc:104-114)。对客户端请求使用它处理配置的前缀,然后再进行设置。让 HttpSetMimeHeader 像 origin_server_auth 的 set_header 和 access_control 的 setHeader 那样销毁 TSMimeHdrFieldNextDup 多余字段。
在此之前,除非源站采用先到先得策略,或在源站拒绝重复的前缀名称,否则不要将源站 ACL 指向 authproxy 前缀头。
b1df7334b39a878971c376da849e8da4984918b6)plugins/authproxy/authproxy.cc StateAuthorizedplugins/authproxy/utils.cc HttpSetMimeHeader / HttpRemoveMimeHeaderorigin_server_auth.cc 中的 set_header 会遍历 NextDup