【论文分享】被滥用的信任:Windows 代码签名滥用测量研究

一、代码签名沦为恶意软件的“护身符”

当你在运行某个软件时,看到如下所示的弹框,“已验证的发布者:XXX有限公司”,你是否会不假思索地点击“是”?然而,大量安全事件表明这样的信任已经被攻击者滥用,看似安全的软件来源可能来自于精心设计的伪装。

近年来,软件供应链安全事件频发,为了保护软件真实性与完整性,代码签名机制应运而生。代码签名主要依赖公钥基础设施 PKI 技术,旨在确保软件来自真实来源且软件内容未被篡改。当终端用户安装或以管理员权限运行软件时,操作系统会验证代码签名的有效性,帮助用户判断此软件是否值得信任(如上图所示)。然而,攻击者有时会反过来利用代码签名 PKI 信任体系中的安全缺陷,通过某种手段为恶意软件配置代码签名,帮助恶意软件绕过操作系统和杀毒软件的检查,我们称之为“代码签名滥用”

为了应对代码签名滥用带来的安全威胁,奇安信技术研究院星图实验室与清华大学、中关村实验室联合研究团队在 NDSS 2026 会议上发表了论文《Understanding the Status and Strategies of the Code Signing Abuse Ecosystem》。这项工作由清华大学和奇安信联合培养的卓越工程师计划博士研究生赵汉卿主导完成,导师为段海新教授(清华大学)和应凌云博士(奇安信星图实验室)。其他作者分别为张一铭(清华大学)、张明明(中关村实验室)、刘保君(清华大学)、游子权(清华大学)、张书豪(奇安信星图实验室)。

在这项工作中,我们利用从真实世界中收集的 3,216,113 个已签名的恶意 PE 文件,对 Windows 代码签名滥用行为进行了大规模测量。通过细粒度的代码签名滥用检测分类算法,我们检测到了 43,286 张滥用证书,构建了迄今为止最大的滥用标记数据集。分析发现当前代码签名滥用现象普遍存在,影响了 46 家 CA 厂商以及 114 个国家或地区的证书。我们发现了五种滥用者的攻击策略,并根据当前代码签名 PKI 存在的安全缺陷提出了若干缓解措施。

二、代码签名研究的三大挑战

与传统的 Web PKI 不同,代码签名 PKI 测量研究存在三大挑战:

  1. 缺少大规模数据集:在 Web PKI 中,研究者可以通过 TLS 扫描主动收集数据或被动分析 TLS 流量。Censys 和 Rapid7 等公共数据集也能为测量工作提供支持。此外,证书透明度(CT)机制提供了 CA 颁发记录,方便研究者批量获取证书数据。然而,代码签名生态系统相对封闭,无法通过主动扫描或 CT 等手段获取大规模数据集,这是制约代码签名测量研究的最大障碍。
  2. 缺少 Ground Truth:尽管近年来代码签名滥用事件频发,但是学术界尚未找到代码签名滥用检测分类相关的 Ground Truth,以往基于签发行为的分类方法被证实可能会被攻击者绕过。这阻碍了对代码签名证书进行标注和聚类分析。
  3. 问题根源难以溯源:CA 端的操作和实现并不透明,即便定位到代码签名滥用行为,也难以由此溯源到造成滥用的根源所在,导致无法提出有针对性的缓解措施。

我们的工作分别通过综合公共数据集与私有沙箱样本设计基于撤销信息的滥用检测分类算法按照不同滥用类型作细粒度分析等方法解决了以上三大挑战。

三、代码签名滥用测量的创新方法设计

为了解决以上挑战,我们提出了针对代码签名滥用测量的一系列创新方法设计,以实现大规模、细粒度、可溯源的滥用测量分析。

数据收集方面,我们综合了公共数据集与私有沙箱样本。我们收集了公共恶意软件存储库 VirusShare 在 2020 年 10 月至 2024 年 10 月期间发布的所有样本,经过过滤保留了 176,968 个签名 PE 样本。此外,我们还从合作公司沙箱中补充收集了 3,828,744 个签名的 PE 文件。两个数据集通过合并去重后共得到 3,962,788 个签名样本,通过反病毒引擎分析最终筛选出了 3,216,113 个恶意签名样本。此外,我们还从多个维度对样本特征进行了扩充,比如爬取 CRL 撤销信息、收集样本恶意行为分析报告等,以实现更精准的检测与分析。

为了实现细粒度的分析,我们提出了一种代码签名滥用检测分类算法。受益于近年来 CA 撤销透明度的改善,我们得以通过已撤销证书被披露的撤销原因(Revocation Reason)来推知证书滥用背后的原因。我们依据样本对应的 SignTool 输出结果、CRL 撤销信息以及 OpenCorporates 查询结果设计了新的检测分类方法,将滥用分为签名复制、私钥窃取、身份盗用、空壳公司、自签证书等五种滥用类型。不同的滥用类型采取了不同的滥用手段,其产生的安全威胁与影响范围也有所不同。对于私钥窃取、身份盗用以及空壳公司这三类相对高级的滥用类型而言,由于攻击者掌握受信任证书的私钥,他们可以任意为恶意软件进行签名且不会触发操作系统的安全告警,具有隐蔽性强、影响范围大的特点。

此外,我们还设计了一种基于 LLM 的证书关联方法,通过输入证书主题字段以及公钥信息来推断滥用证书是否来自同一攻击者。这一方法不仅帮助我们扩展标记了 287 张未标记滥用证书,还以此聚类得到了 3,484 个证书多态类簇,为后续滥用策略分析提供支撑。

四、核心贡献与关键发现

构建迄今最大的滥用标记数据集

利用代码签名滥用检测分类算法,我们最终收集到了 3,216,113 个来自真实世界的已签名的恶意 PE 文件,从中提取得到了 43,286 张滥用证书,构建了迄今为止最大的代码签名滥用标记数据集。值得注意的是,其中有 23,252 张滥用证书由公共可信 CA 颁发,我们的工作重点关注这些具有高威胁的证书样本。

对滥用生态开展全面测量

我们利用上述代码签名滥用标记数据集对滥用生态开展了全面而深入的测量分析工作。分析发现当前代码签名滥用现象普遍存在,影响了 46 家 CA 厂商以及 114 个国家或地区的证书。我们发现部分 CA 明显更受攻击者青睐,且与市场份额与证书价格无关,这可能反映出某些 CA 对于证书申请者的身份审核存在漏洞。

良性样本与恶意样本代码签名中的 CA 分布对比

首次发现“幽灵证书”

阻止滥用证书的唯一有效手段是证书撤销,测量发现为恶意软件签名的滥用证书撤销率仅为 17.56%。我们首次发现了制约撤销率提高的关键因素——“幽灵证书”,即已被确定为滥用却无法被撤销的证书。这些证书由于其颁发者证书过期、撤销或停止运营导致撤销设施(CRL/OCSP)失效,即使识别到滥用行为也无法发布撤销信息,而它们的代码签名即使在签名证书过期后由于时间戳(TSA)的存在依然有效。我们发现已确认被滥用但仍未被撤销的证书中至少有 38.96% 符合“幽灵证书”的条件。

“幽灵证书”示意图

发现五种滥用策略

为了找到当前代码签名 PKI 的安全缺陷并提出有针对性的缓解措施,我们深入分析了攻击者的行为和策略。我们通过分析标记数据集总结出了五种滥用策略,旨在逃避检查、降低成本和扩大攻击影响。例如,在证书申请阶段,攻击者可能会利用不同国家之间 CA 身份审查宽松程度的差异有选择性地申请证书(比如假以越南、亚美尼亚等国公司的身份进行申请)。在证书签名阶段,攻击者可能会为恶意软件精心配置“双签名”,通过附加兼容旧密码算法的签名来扩大攻击影响范围。

深入挖掘证书多态现象

证书多态也是攻击者常用的滥用策略之一。证书多态是指同一实体使用相同(或稍有修改)身份向相同或不同的 CA 申请多张证书的现象。借助证书多态,攻击者可以以相对较低的成本批量获得多个证书(避免注册多个空壳公司带来的巨额开销),同时逃避 CA 撤销的检查(一张证书被撤销不影响其他证书)。我们通过证书关联方法识别了 3,484 个证书多态类簇,发现了 315 个利用多态绕过撤销检查的真实案例。此外,我们还首次发现了利用特殊字符实施证书多态的实例(如下图所示)。

利用特殊字符实施证书多态的示意图

五、总结

代码签名是验证发布者身份并确保软件完整性的重要机制。然而,我们的研究发现代码签名滥用已经成为了软件生态的重大安全威胁之一。我们对现实世界的代码签名滥用生态系统进行了大规模测量研究,开发了一种针对证书滥用类型的细粒度检测分类方法,获得了迄今为止最大的滥用证书标记数据集(43,286 个证书)。利用该数据集,我们对代码签名生态系统与攻击者行为进行了全面而深入的分析,揭示了攻击者一系列的代码签名滥用策略。

我们认为造成代码签名滥用持续泛滥的安全缺陷主要来自于 CA 端,包括颁发过程缺乏标准化、消极的滥用治理等。我们建议 CA 增强证书颁发与撤销的透明度(比如建立 CT)、主动监测野外滥用行为、为证书主题字段建立统一标准。同时,我们也希望 Windows 做出相应调整以缓解“幽灵证书”的影响。

最后,本文构建的代码签名滥用数据集已开源发布,期待能为后续研究工作提供参考。我们希望安全社区能够给予代码签名领域更多关注,以更好地维护健康的软件生态。感谢您的阅读!

论文&项目开源地址:https://github.com/XingTuLab/Code_Signing_Abuse_Dataset