IPBUF安全漏洞报告
English
CVE-2026-44309 CVSS 5.3 中危

CVE-2026-44309 Gitsign签名验证绕过漏洞

披露日期: 2026-05-15

漏洞信息

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

相关标签

签名验证绕过GitsignGitCVE-2026-44309供应链安全

漏洞概述

Gitsign是一款利用GitHub/OIDC身份对Git提交进行无密钥Sigstore签名的工具。在0.16.0版本之前,gitsign verify和gitsign verify-tag在验证签名前,会使用go-git的EncodeWithoutSignature重新编码提交或标记对象,而不是直接验证原始Git对象字节。对于包含重复树头部的畸形对象,git-core和go-git的解析逻辑不同:git-core使用第一个树,而go-git使用第二个。攻击者可以针对go-git规范化形式(即第二个树)制作恶意签名,该签名能通过gitsign verify的验证,但git-core会将提交解析为完全不同的第一个树。这破坏了已验证签名、git-core呈现给用户的提交语义以及Rekor中记录的对象哈希值均指向相同内容的不变量,导致签名验证机制失效。

技术细节

该漏洞的根本原因在于Gitsign使用的go-git库与标准Git(git-core)在处理畸形Git对象时的解析逻辑不一致。漏洞利用了Git对象解析中的差异:当Git提交对象中包含重复的“tree”头部行时,git-core默认采纳第一个出现的tree哈希值,而go-git库则采纳最后一个。Gitsign在验证流程中,为了提取和校验签名,对对象进行了规范化处理(重新编码)。攻击者通过构造一个包含两个不同tree哈希的提交对象(第一个为恶意代码树,第二个为正常代码树),并针对go-git解析出的第二个tree进行签名。当Gitsign验证时,它读取的是第二个tree并验证通过;然而,当开发者或CI/CD系统使用标准git命令检出代码时,实际执行的是第一个tree对应的恶意代码。这种差异使得攻击者能够在维持有效签名外观的情况下,植入并执行未经授权的代码,严重破坏了软件供应链的完整性。

攻击链分析

STEP 1
侦察
攻击者识别出目标项目使用了存在漏洞的Gitsign版本(<0.16.0)进行代码签名验证。
STEP 2
武器化
攻击者构造一个特制的Git提交对象,该对象包含两个tree头部。第一个tree指向恶意代码,第二个tree指向看似正常的代码。攻击者针对第二个tree生成有效的签名。
STEP 3
传递
攻击者将这个特制的提交对象推送到目标Git仓库。
STEP 4
利用
当Gitsign验证该提交时,它解析第二个tree并验证签名成功,认为这是合法提交。然而,当用户或构建系统使用标准git检出代码时,实际执行的是第一个tree指向的恶意代码。
STEP 5
影响
攻击者成功绕过签名验证机制,在目标系统中执行未授权的代码,破坏系统完整性。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2026-44309 # This script demonstrates the creation of a malformed Git commit object # containing duplicate tree headers to exploit the parsing difference. import zlib def create_malformed_git_object(tree_hash_1, tree_hash_2, parent_hash, author_info, commit_msg): """ Creates a raw git commit object with two 'tree' lines. git-core will use tree_hash_1. go-git (used by vulnerable gitsign) will use tree_hash_2. """ # Construct the commit content with duplicate tree headers # The signature must be generated based on the second tree (tree_hash_2) # to pass verification in the vulnerable version. content = f"tree {tree_hash_1}\n" content += f"tree {tree_hash_2}\n" # Duplicate header content += f"parent {parent_hash}\n" content += f"author {author_info}\n" content += f"committer {author_info}\n" content += f"\n{commit_msg}\n" # Git object format: header + content header = f"commit {len(content)}\x00" full_object = header + content # Compress to simulate stored git object return zlib.compress(full_object.encode()) # Example usage: # tree_benign = "abc123..." # The tree go-git sees and signs # tree_malicious = "def456..." # The tree git-core sees and executes # blob = create_malformed_git_object(tree_malicious, tree_benign, ...) # print(f"Malformed object generated. Length: {len(blob)}")

影响范围

Gitsign < 0.16.0

防御指南

临时缓解措施
建议立即将Gitsign升级至0.16.0或更高版本,该版本修复了验证逻辑,确保直接对原始Git对象字节进行签名验证,避免了重新编码导致的解析差异。如果暂时无法升级,应手动审查代码变更,并警惕来源不明的提交,即使其显示拥有有效的Sigstore签名。

参考链接

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