报告摘要
libcurl的Alt-Svc头部解析器中存在一个结构性逻辑缺陷,导致攻击属性(特别是持久性persist和有效期max-age)可以从一个服务定义“泄漏”到另一个。
通过将此逻辑漏洞与cURL的HTTP/3 (QUIC)支持链式结合,我们成功演示了持久性UDP放大攻击。攻击者可以强制受害者的客户端缓存恶意UDP路由长达30天(persist=1),使客户端在不知情的情况下参与针对任意目标的分布式拒绝服务(DDoS)攻击。
受影响版本 复现于: curl 8.17.0 (以及libcurl master分支) 平台: Linux/通用 (此问题跨平台)
复现步骤
- 搭建恶意服务器: 托管一个返回以下头部的HTTP/HTTPS服务器:
1Alt-Svc: h3="<VICTIM_IP>:12345", h2=":443"; ma=2592000; persist=1 - 触发(客户端侧): 运行
curl --alt-svc cache.txt https://<ATTACKER_HOST> - 逻辑缺陷: curl能正确地为
h2解析persist=1,但由于lib/altsvc.c中的作用域泄漏,错误地将其也应用到了h3。 - 验证持久性:
- 检查
cache.txt。你将看到指向<VICTIM_IP>的h3条目已设置持久性标志,并且具有30天有效期。
- 检查
- 验证攻击:
- 关闭服务器/客户端。
- 再次运行
curl https://<ATTACKER_HOST>(模拟未来的访问)。 - curl将立即向
<VICTIM_IP>:12345发送一个1200字节的UDP QUIC初始数据包。
影响
概要 此漏洞将libcurl客户端转变为用于UDP放大攻击的持久性僵尸网络。
- DDoS放大: 通过注入恶意QUIC路由,攻击者可以指定任意IP地址作为目标。每位访问攻击者网站一次的受害者都会成为永久的放大器,在之后的每次访问中向目标发送大量UDP流量。
- 隐私侵犯: 该逻辑漏洞允许攻击者强制对原本应是临时的路由设置
persist=1,从而实现跨网络变化的长期用户追踪(绕过了标准的匿名保护机制)。
技术分析
问题根源
根据RFC 7838第3节,ma或persist等参数的作用域仅限于它们所附加的alt-value。逗号,用于分隔不同的值。
在lib/altsvc.c中,解析器采用了一种简化方法。它在第491行使用strchr(p, ';')在整个字符串中查找一次标志位,然后在后续的do..while循环中为创建的每个备选服务重用相同的maxage和persist变量。这导致了一个alt-value的参数泄漏到同一头部中的所有其他alt-value中。
安全风险场景
- WAF/安全过滤器绕过: 高安全环境或WAF会检查Alt-Svc头部。如果它们看到
h3="victim:443"; persist=1,可能会将其标记为持久的UDP放大风险。然而,利用此漏洞,攻击者可以将persist标志隐藏在良性的h2条目之后。过滤器看到的是h3="victim:443"(临时性,低风险),而curl由于泄漏将其视为持久性。这是通过语法模糊性进行的属性注入。 - 隐蔽的SSRF侦察: 攻击者可以利用此漏洞探测内部网络(例如
127.0.0.1:9001)。通过将持久性标志隐藏在另一个条目之后,“探测”条目看起来像指向安全代理的标准会话重定向,但curl会将其“锚定”在alt-svc缓存中长达30天。 - CDN/中间件的“困惑代理”问题: 如果CDN或网关正在聚合或重写头部,它可能假设参数是正确限定作用域的(就像
Set-Cookie等其他头部一样)。如果它保留了h2条目的persist参数,但出于安全原因从其他条目中剥离,curl仍会将其应用到所有条目,从而绕过中间件的安全策略。
争议与结论
报告提交者huntsd与cURL维护者bagder和jimfuller2024就此问题是否是安全漏洞进行了讨论。
bagder最初认为这更多是一个解析错误(bug),而非安全漏洞(vulnerability),因为攻击需要恶意或受控的源服务器(而非中间人),并且主要影响的是备选服务被尝试的时长(从默认24小时变为其他值),这在HTTPS通信模型中风险有限。huntsd则认为,该漏洞破坏了作用域预期,允许攻击者在客户端进行未授权的状态修改,即使有TLS保护,其潜在影响(如作为“超级Cookie”进行跨网络跟踪、在特定环境下可能导致凭证盗窃等)使其具备安全意义。jimfuller2024承认解析器存在bug,并且从整体(超级Cookie等)考虑,这可以被视为低危(LOW) 漏洞,尤其在内部网络证书管理不善的情况下可能引发问题,但也理解根据项目准则将其标记为bug的合理性。
最终,cURL维护者bagder承认这是一个真实的Alt-Svc解析器bug,并提交了修复PR,但将该报告状态定为信息性(Informative),认为其不属于安全问题。报告随后被公开披露。