CVE-2026-9546CVE-2026-9546是libcurl库中的一个高危信息泄露漏洞,CVSS评分为7.5。该漏洞涉及libcurl的CURLOPT_REFERER选项在处理NULL参数时的逻辑缺陷。根据libcurl的官方文档,当开发者将CURLOPT_REFERER选项设置为NULL时,应当完全抑制HTTP请求中的Referer头部。然而,在实际实现中,该选项未能正确清除libcurl内部的Referer状态,导致先前设置的Referer字符串在后续请求中被错误地重复使用和发送。
此漏洞的危害在于Referer头部通常包含用户先前访问的URL信息,其中可能包含会话令牌、敏感路径、用户身份信息或其他机密数据。当libcurl在用户明确请求清除Referer后仍然发送该头部时,这些敏感信息可能被泄露给非预期的服务器。攻击者可以通过控制用户后续请求的目标服务器来收集这些泄露的信息。
该漏洞的CVSS向量为CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N,表明该漏洞可通过网络远程利用,无需任何认证或用户交互,且对机密性有高影响,但不影响完整性和可用性。这使得该漏洞特别适合大规模自动化利用,攻击者可以在用户不知情的情况下被动收集泄露的Referer信息。
libcurl中的CURLOPT_REFERER选项用于设置HTTP请求中的Referer头部。按照设计,当开发者调用curl_easy_setopt(handle, CURLOPT_REFERER, NULL)时,libcurl应当清除之前设置的Referer值,并在后续请求中不发送Referer头部。
然而,在存在漏洞的版本中,当CURLOPT_REFERER被设置为NULL时,libcurl未能正确处理这一情况。具体而言,内部的Referer状态变量(如`data->set.str[STRING_COPYPOSTFIELDS]`或专门用于Referer的字符串缓冲区)没有被重置为NULL或空字符串。这意味着即使开发者明确请求清除Referer,libcurl仍然保留了先前设置的Referer值。
在后续的curl_easy_perform()调用中,当libcurl构造HTTP请求头时,它会检查Referer状态。由于内部状态未被清除,libcurl会使用之前缓存的Referer字符串并将其添加到新的HTTP请求中。这导致即使在跨域请求或重定向场景下,开发者认为已被清除的敏感Referer信息仍然被发送到非预期的服务器。
利用方式:
1. 攻击者控制一个目标服务器或拦截网络流量
2. 受害者应用程序使用libcurl进行多个HTTP请求
3. 第一个请求设置了Referer(例如访问包含敏感信息的页面)
4. 应用程序在第二个请求前调用curl_easy_setopt(handle, CURLOPT_REFERER, NULL)尝试清除Referer
5. 由于漏洞,第二个请求仍然包含第一个请求的Referer值
6. 攻击者通过接收到的Referer头部获取敏感信息