jose-swift 存在通过“none”算法绕过JWT签名验证的漏洞
摘要: 这是一个高风险的认证绕过漏洞。当JWT的头部包含"alg": "none"时,jose-swift库的签名验证函数会立即返回true,而不执行任何密码学验证。这使得任何未经身份验证的攻击者都可以伪造任意令牌,从而完全冒充任何用户并提升权限。
漏洞详情
该漏洞存在于 Sources/JSONWebSignature/JWS+Verify.swift 文件的第34-37行:
|
|
当JWT头部包含"alg": "none"时,verify()方法会立即返回true,且不执行以下关键检查:
- 检查签名是否为空或存在
- 根据任何密钥验证令牌
- 要求调用者明确选择加入(explicit opt-in)
SigningAlgorithm枚举(位于Sources/JSONWebAlgorithms/Signatures/SigningAlgorithm.swift:72)明确将case none = "none"包含为有效算法。
所有验证方法均受影响:
JWS.verify(key:)- 实例方法JWS.verify(jwsString:payload:key:)- 静态方法JWT.verify(jwtString:senderKey:)- 高级API
漏洞复现(PoC)
-
创建一个带有修改后声明的伪造JWT:
1 2 3 4 5 6 7// 带有 alg:none 的伪造头部 let header = #"{"alg":"none","typ":"JWT"}"# // 攻击者包含提升权限的负载 let payload = #"{"sub":"user123","admin":true}"# // Base64URL编码并与空签名连接 let forgedToken = base64url(header) + "." + base64url(payload) + "." // 结果: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJ1c2VyMTIzIiwiYWRtaW4iOnRydWV9. -
验证伪造的令牌能通过验证:
1 2let jws = try JWS(jwsString: forgedToken) let isValid = try jws.verify(key: legitimateSecretKey) // 返回 TRUE
影响范围
受影响版本:<= 6.0.1 已修复版本:无
这是一个身份验证绕过漏洞。 受影响对象:任何使用jose-swift进行JWT验证的应用程序都容易受到攻击。攻击者可以:
- 伪造身份:创建声称是任何用户的令牌
- 提升权限:添加管理员/超级用户声明以获得未经授权的访问权限
- 完全绕过身份验证:无需有效凭据即可访问受保护资源
- 修改任何声明:更改过期时间、受众、发行者或任何自定义声明
此攻击无需了解签名密钥,并且对所有签名算法(HS256、RS256、ES256等)都有效,因为攻击者完全绕过了签名验证。
参考资料
- 漏洞报告人:Louis Nyffenegger - https://pentesterlab.com/
- GHSA ID: GHSA-88q6-jcjg-hvmw
- CWE: CWE-327 - 使用损坏或有风险的加密算法
CVSS 评分
该漏洞的CVSS总体评分为 8.8(高危)。
CVSS v4.0 基本指标:
- 攻击途径: 网络
- 攻击复杂性: 低
- 所需权限: 无
- 用户交互: 无
- 受影响系统的机密性影响: 高
- 受影响系统的完整性影响: 高
- 受影响系统的可用性影响: 无
向量字符串: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:P