Fugue框架反序列化漏洞导致远程代码执行风险分析
漏洞详情
包管理器: pip
受影响版本: <= 0.9.2
已修复版本: 无
严重程度: 高危 (CVSS评分8.8)
漏洞描述
概述
Fugue框架实现了一个用于分布式计算操作的RPC服务器系统。在RPC服务器实现的核心功能中,发现fugue/rpc/flask.py中的_decode()函数直接使用cloudpickle.loads()反序列化数据,未进行任何清理操作。当RPC服务器处理恶意的pickle数据时,这将创建远程代码执行漏洞。
该漏洞存在于RPC通信机制中,客户端可以发送将在服务器端反序列化的任意序列化Python对象,允许攻击者在受害者机器上执行任意代码。
技术细节
fugue/rpc/flask.py中的_decode()函数直接使用cloudpickle.loads()反序列化数据,未进行任何清理操作。
漏洞复现步骤
步骤1: 受害者用户使用Fugue框架启动绑定到开放网络的RPC服务器。此处使用官方RPC服务器代码初始化服务器。
步骤2:
攻击者修改fugue/rpc/flask.py中的_encode()函数以注入恶意pickle数据:
在此示例中,攻击者修改_encode让受害者执行命令"ls -l"
步骤3: 攻击者然后使用RPC客户端发送恶意请求
Fugue在附件中提供了演示视频和PoC,以及修改后的flask.py。用户复现此问题时,在服务器端(作为受害者),用户可以运行python rpc_server.py。在客户端(作为攻击者),用户可以首先用附件中提供的flask.py替换pip site-packages中的fugue/rpc/flask.py,然后运行rpc_client.py。
影响范围
受害者机器上的远程代码执行。一旦受害者启动具有网络绑定(特别是0.0.0.0)的RPCServer,网络上的攻击者可以通过连接到RPCServer并发送精心构造的pickle载荷来获得任意代码执行。此漏洞允许:
- 完全系统妥协
- 数据窃取
- 网络内横向移动
- 拒绝服务攻击
- 安装持久后门
缓解措施
替换不安全的反序列化:用更安全的替代方案替换pickle.loads():
- 用于简单数据结构的JSON序列化
- 用于复杂数据的Protocol Buffers或MessagePack
- 如果必须使用pickle,实现具有受限find_class()方法的自定义Unpickler,仅允许白名单类
网络安全:
- 如果服务仅用于内部使用,绑定到localhost(127.0.0.1)而不是0.0.0.0
- 实现身份验证和授权机制
安全警告:在公共接口上启动服务时,显示清晰的安全警告以告知用户风险。
参考信息
- GHSA-xv5p-fjw5-vrj6
- fugue-project/fugue@6f25326
- 附件链接:https://drive.google.com/file/d/1y8bBBp7dnWoT_WHBtdB0Fts4NRUIfdWi/view?usp=sharing
CVSS v3基础指标
- 攻击向量:相邻网络
- 攻击复杂度:低
- 所需权限:无
- 用户交互:无
- 范围:未改变
- 机密性:高
- 完整性:高
- 可用性:高
弱点分类
CWE-78: 操作系统命令中使用的特殊元素的不当中和(‘操作系统命令注入’)