CVE-2026-33487goxmlsig是Go语言实现的XML数字签名库。在1.6.0版本之前,其validate.go文件中的validateSignature函数存在严重的逻辑缺陷。由于Go语言旧版本中的循环变量捕获问题,代码错误地获取了循环变量_ref的地址而非其值。这导致当SignedInfo块中存在多个引用时,验证指针最终会指向切片的最后一个元素,从而可能绕过签名验证,破坏数据的完整性。攻击者可利用此漏洞伪造签名数据。
该漏洞的核心原因在于Go语言1.22版本之前的循环变量语义。在goxmlsig的validate.go中,代码遍历SignedInfo.References切片以匹配签名元素的ID。代码逻辑使用了`ref := &_ref`,在旧版Go中,循环变量`_ref`在每次迭代中复用同一个内存地址。因此,所有`ref`指针实际上都指向同一个地址,该地址最终保存的是切片中最后一个元素的值。
这种指针错位意味着验证逻辑可能检查错误的XML元素。如果攻击者构造一个特制的XML文档,其中SignedInfo包含多个引用,且有效的签名位于最后一个引用,但实际需要验证的ID位于中间,程序将错误地认为中间的元素已被最后一个元素的签名验证通过。这导致了XML签名验证机制的完全失效,攻击者可利用此漏洞在保持签名有效的情况下篡改XML内容,达成完整性攻击。