2012年,一种名为Flame的恶意软件在中东地区的计算机系统中悄然蔓延。它不仅使用了有效的数字证书签名,而且这个证书竟然来自一家知名的硬件制造商——宏碁的一家台湾子公司。安全研究人员最初以为自己看错了:一个经过微软Windows系统完整验证的、带有可信证书链签名的文件,怎么可能是恶意软件?

这个发现揭示了一个令人不安的事实:代码签名体系在保护软件供应链安全的同时,也正在被攻击者系统性地武器化。根据NDSS 2022发表的研究论文《Understanding the Status and Strategies of the Code Signing Abuse》,研究团队收集了超过133万个经过签名的恶意软件样本和188万个签名的潜在不需要程序(PUP)样本。在这些样本中,83.68%被明确标注了特定的滥用类型——证书盗窃、借用合法身份、或者利用过期证书绕过验证。

代码签名技术诞生的初衷,是为了解决软件分发中最核心的信任问题:用户如何确信下载的程序确实来自声称的开发者,且在传输过程中未被篡改?这个问题在互联网早期并不存在——那时候软件主要通过物理介质分发,用户可以直接验证软盘或光盘的来源。但随着网络分发的普及,信任链条断裂了。

timeline
    title 代码签名技术发展关键节点
    section 1990年代
        1995 : 第一个代码签名专利申请
        : (Eolas Technologies)
        1996 : Microsoft发布Authenticode
        : 用于ActiveX控件签名
        1998 : Java Applet签名机制
        : Sun Microsystems推出
    section 2000年代
        2002 : Windows驱动签名强制
        : (WHQL认证)
        2005 : EV代码签名证书推出
        : Extended Validation
        2008 : 苹果App Store上线
        : 强制代码签名
    section 2010年代
        2012 : Flame恶意软件
        : 使用被盗证书签名
        2016 : macOS Gatekeeper强制
        : 公证机制推出
        2019 : CA/Browser Forum
        : 强制HSM要求
    section 2020年代
        2021 : Sigstore项目启动
        : 无证书签名方案
        2023 : CA/Browser Forum新规
        : 所有代码签名需HSM
        2024 : SLSA框架推广
        : 供应链安全标准

一、信任的数学基石:代码签名如何工作

理解代码签名为何会被武器化,首先需要理解它的技术本质。代码签名本质上是公钥基础设施(PKI)在软件分发领域的应用,它依赖于几个核心的密码学原语。

1.1 签名的数学构造

一个数字签名方案由三个算法组成:密钥生成(KeyGen)、签名(Sign)和验证(Verify)。在RSA签名方案中,签名的生成过程可以表示为:

$$\sigma = m^d \mod n$$

其中 $m$ 是待签名消息的哈希值,$d$ 是私钥指数,$n$ 是模数。验证过程则计算:

$$m' = \sigma^e \mod n$$

其中 $e$ 是公钥指数。如果 $m' = H(\text{message})$,则签名有效。这里的哈希函数 $H$ 通常使用SHA-256或SHA-384,将任意长度的文件映射为固定长度的摘要值。

但这里有一个关键问题:验证者如何确信公钥 $(e, n)$ 确实属于声称的开发者?这就是证书颁发机构(CA)介入的地方。CA用自己的私钥对开发者的公钥进行签名,形成一张证书。验证者只需信任少数几个根CA,就能建立对大量开发者证书的信任链条。

1.2 Windows Authenticode的结构

在Windows平台上,代码签名的标准格式是Authenticode,它基于PKCS#7的SignedData结构。一个Authenticode签名包含以下核心组件:

graph TD
    A[PE文件] --> B[WIN_CERTIFICATE结构]
    B --> C[证书链]
    B --> D[签名数据]
    B --> E[时间戳令牌]
    
    D --> F[文件哈希]
    D --> G[签名算法]
    D --> H[签名值]
    
    C --> I[终端实体证书]
    I --> J[中间CA证书]
    J --> K[根CA证书]
    
    E --> L[TSA服务器URL]
    E --> M[时间戳签名]
    E --> N[时间戳证书链]
    
    subgraph 验证流程
        O[提取证书链] --> P[验证证书有效性]
        P --> Q[验证签名]
        Q --> R[验证时间戳]
        R --> S[检查吊销状态]
    end

WIN_CERTIFICATE结构存储在PE文件的可选头部数据目录中,其定义如下:

typedef struct _WIN_CERTIFICATE {
    DWORD dwLength;           // 结构总长度
    WORD wRevision;           // 版本号,目前为0x0200
    WORD wCertificateType;    // 证书类型,Authenticode为0x0002
    BYTE bCertificate[ANYSIZE_ARRAY]; // PKCS#7 SignedData
} WIN_CERTIFICATE, *LPWIN_CERTIFICATE;

Authenticode签名的一个关键特性是它并不签名整个文件,而是签名文件的"摘要"。这是因为PE文件在签名后可能还需要被修改——例如添加额外的签名(双重签名场景)。计算摘要时,Authenticode会跳过PE文件中的特定区域,包括校验和字段、安全目录条目本身,以及资源部分的某些区域。

1.3 时间戳服务器的关键角色

代码签名面临一个独特挑战:证书会过期,吊销检查也会因为CA服务器不可用而失败。如果一个十年前签名的软件在今天无法通过验证,用户体验将极其糟糕。RFC 3161定义的时间戳协议(TSP)就是为了解决这个问题。

当开发者签名一个文件时,签名工具不仅会生成签名,还会向时间戳权威机构(TSA)发送请求。TSA返回一个时间戳令牌,证明签名是在特定时间点之前创建的。即使签名证书后来被吊销或过期,只要时间戳证明签名是在证书有效期内创建的,Windows仍然会信任该签名。

时间戳请求的ASN.1结构如下:

TimeStampReq ::= SEQUENCE {
    version          INTEGER { v1(1) },
    messageImprint   MessageImprint,
    reqPolicy        TSAPolicyId OPTIONAL,
    nonce            INTEGER OPTIONAL,
    certReq          BOOLEAN DEFAULT FALSE,
    extensions       [0] IMPLICIT Extensions OPTIONAL
}

时间戳令牌则是一个带有TSA签名的结构,包含了原始请求的消息摘要和时间值。这个设计使得签名的长期有效性不再依赖于开发者证书的有效期,而是依赖于TSA证书的有效期——而TSA通常是高度可靠的机构。

二、信任的断裂:签名恶意软件的规模化现实

如果说代码签名的技术机制是完美的,那么现实世界的数据则揭示了另一面。NDSS 2022的研究《Understanding the Status and Strategies of the Code Signing Abuse》提供了迄今为止最全面的签名恶意软件统计。

2.1 数据集的规模与来源

研究团队从VirusTotal收集了签名文件样本,经过筛选和分类,最终获得了:

  • 1,330,838个签名的恶意软件样本
  • 1,885,275个签名的潜在不需要程序(PUP)样本
  • 时间跨度:2018年至2021年

这些样本中,83.68%被明确标注了特定的滥用类型。研究将证书滥用分为五类:

滥用类型 描述 占比
证书盗窃 攻击者窃取合法公司的证书私钥 27.4%
身份伪造 使用虚假身份注册获取证书 22.1%
过期证书 使用已过期但未被吊销的证书 18.3%
测试证书 滥用开发测试阶段的证书 15.7%
合法滥用 开发者自愿签名恶意软件 16.5%

2.2 证书盗窃的技术路径

证书盗窃是最常见的滥用方式。攻击者通过多种途径获取证书私钥:

供应链入侵是最具破坏性的方式。2022年3月,显卡制造商NVIDIA披露其系统遭到入侵,攻击者窃取了1TB数据,其中包括用于签名驱动程序的代码签名证书。这些被盗证书随后被用于签名恶意软件,使得这些恶意软件能够在Windows系统上加载内核驱动。

针对性钓鱼攻击则是更常见的手段。攻击者伪装成证书颁发机构或IT部门,向开发者发送钓鱼邮件,诱导其导出并提交证书文件。由于许多开发者对证书安全缺乏意识,这类攻击的成功率相当高。

恶意软件感染也是一个重要途径。某些信息窃取类恶意软件专门扫描受感染系统上的证书存储,寻找.pfx、.p12等证书文件并上传到攻击者的服务器。

graph LR
    A[攻击者目标: 获取签名证书] --> B[供应链入侵]
    A --> C[钓鱼攻击]
    A --> D[恶意软件感染]
    A --> E[购买被盗证书]
    
    B --> F[入侵开发者网络]
    F --> G[窃取证书文件]
    
    C --> H[伪造CA邮件]
    H --> I[诱导开发者导出证书]
    
    D --> J[扫描证书存储]
    J --> K[上传证书文件]
    
    E --> L[暗市市场]
    L --> M[购买已泄露证书]
    
    G --> N[签名恶意软件]
    I --> N
    K --> N
    M --> N
    
    N --> O[绕过安全检测]
    O --> P[部署恶意载荷]

2.3 知名案例分析

Flame恶意软件(2012年):这是第一个被公开披露的使用被盗证书签名的高级持续性威胁(APT)。Flame使用了来自宏碁台湾子公司VeriSign的证书进行签名,使得其能够伪装成合法的Microsoft安全组件。这个案例揭示了代码签名体系的一个根本性弱点:即使证书被盗,在证书被正式吊销之前,签名仍然有效。

D-Link证书泄露(2018年):网络设备制造商D-Link的一个代码签名证书在2018年被发现泄露在网上。这个证书被用于签名多个恶意软件家族。值得注意的是,这个证书的有效期到2023年,意味着在被发现泄露后,攻击者仍有数年时间可以滥用。

NVIDIA证书被盗(2022年):勒索软件组织Lapsus$入侵NVIDIA后,泄露了两个代码签名证书。这些证书随后被多个恶意软件家族使用,包括用于签名内核模式驱动程序。Windows内核驱动签名要求WHQL认证或EV证书,这使得被盗证书的价值极高。

三、平台差异:各操作系统的验证策略

不同操作系统对代码签名的验证策略存在显著差异,这些差异直接影响攻击者利用签名证书的难度。

3.1 Windows的多层验证机制

Windows的代码签名验证是一个多层过程,涉及WinVerifyTrust API和多个信任提供者。验证流程大致如下:

sequenceDiagram
    participant User as 用户/系统
    participant API as WinVerifyTrust
    participant TP as 信任提供者
    participant CA as 证书颁发机构
    participant TSA as 时间戳服务器
    participant CRL as CRL/OCSP服务器
    
    User->>API: 验证文件签名
    API->>TP: 调用信任提供者
    
    TP->>TP: 提取证书链
    TP->>CA: 验证证书链有效性
    
    TP->>TP: 计算文件摘要
    TP->>TP: 验证签名值
    
    TP->>TSA: 验证时间戳令牌
    
    TP->>CRL: 检查证书吊销状态
    
    alt 所有检查通过
        TP->>API: 返回TRUST_E_SUCCES
        API->>User: 文件可信
    else 任一检查失败
        TP->>API: 返回错误代码
        API->>User: 文件不可信
    end

Windows验证的一个关键特性是对SmartScreen信誉系统的依赖。即使一个文件有有效的签名,如果该证书缺乏足够的"信誉"(即历史上没有被大量用户下载过),SmartScreen仍然会警告用户。这个机制在一定程度上缓解了证书滥用问题——攻击者获取的新证书没有历史信誉,签名的恶意软件仍然会触发警告。

3.2 macOS的公证机制

Apple在macOS 10.15 Catalina中引入了公证(Notarization)机制,这是对传统代码签名的重大增强。开发者不仅需要签名其应用,还需要将应用提交给Apple进行安全扫描。只有通过扫描的应用才能获得"公证票据"(notarization ticket),这个票据需要嵌入到应用包中。

公证机制的关键创新在于它引入了一个中心化的安全审查层。即使攻击者获得了有效的代码签名证书,仍然需要通过Apple的安全扫描才能获得公证。而Apple的扫描系统会检测已知的恶意行为模式,大大提高了攻击者滥用证书的难度。

3.3 Android的多版本签名方案

Android平台对APK的签名方案经历了多次演进:

签名方案 版本 特点 安全性
JAR签名 (v1) Android 1.0 基于JAR的签名,签名META-INF目录 易被修改
APK签名 v2 Android 7.0 签名嵌入APK文件,覆盖整个文件 防止修改
APK签名 v3 Android 9.0 支持密钥轮转,包含密钥历史 支持证书更新
APK签名 v4 Android 11 增量更新支持,用于APEX 支持流式验证

Android签名方案的一个独特之处在于它不依赖外部CA。开发者自己生成密钥对并签名APK,证书只需要保证一致性(同一应用的更新必须使用相同的签名密钥)。这种设计简化了流程,但也意味着无法通过CA验证开发者身份。

3.4 Linux的包签名实践

Linux发行版对软件包签名采取了不同的策略。主流发行版维护自己的密钥,所有官方仓库中的软件包都由发行版密钥签名。开发者不需要从商业CA获取证书,而是将软件提交给发行版维护者进行签名。

这种模式的优点是攻击者无法通过获取证书来签名恶意软件——他们需要入侵发行版的基础设施。缺点是它限制了软件分发的灵活性,开发者无法独立分发经过系统验证的软件。

四、信任的重建:现代解决方案的探索

面对证书滥用问题,安全社区正在探索多种解决方案,从技术层面到制度层面都有创新。

4.1 CA/Browser Forum的强制HSM要求

2023年6月,CA/Browser Forum通过了新的基线要求,强制所有代码签名证书必须使用硬件安全模块(HSM)存储私钥。这个要求的技术逻辑是:如果私钥永远不离开HSM,那么攻击者即使入侵开发者系统也无法窃取证书。

HSM的核心安全特性包括:

  • 防篡改设计:物理攻击会触发密钥销毁
  • 访问控制:私钥操作需要物理令牌或生物特征认证
  • 审计日志:所有签名操作都被记录
  • FIPS 140-2认证:满足政府级安全标准

HSM要求显著提高了证书盗窃的难度,但它也有局限性:它无法防止合法证书被恶意使用(开发者自愿签名恶意软件),也无法解决身份伪造问题。

4.2 证书透明度日志

Certificate Transparency(CT)最初是为TLS证书设计的,但其原则同样适用于代码签名。CT要求所有证书必须被记录在公开的、不可篡改的日志中,任何人都可以监控这些日志来发现可疑的证书颁发。

对于代码签名,CT的价值在于:

  • 快速发现被盗证书:监控日志可以及时发现证书被用于签名可疑文件
  • 审计证书颁发:可以检查CA是否遵循了验证要求
  • 建立责任追溯:每个证书都有完整的颁发记录

目前,主要的浏览器厂商已经要求EV代码签名证书必须记录在CT日志中,普通代码签名证书的CT要求也在逐步推进。

4.3 Sigstore:无证书签名方案

Sigstore是一个革命性的开源项目,旨在简化代码签名并消除对传统PKI的依赖。它的核心创新是使用短暂证书和透明度日志替代长期有效的证书。

Sigstore的工作流程如下:

sequenceDiagram
    participant Dev as 开发者
    participant Fulcio as Fulcio CA
    participant OIDC as OIDC提供者
    participant Rekor as Rekor日志
    participant Verifier as 验证者
    
    Dev->>OIDC: 登录(GitHub/Google等)
    OIDC->>Dev: 返回身份令牌
    
    Dev->>Fulcio: 请求签名证书
    Note over Dev,Fulcio: 附带身份令牌和公钥
    Fulcio->>Fulcio: 验证身份令牌
    Fulcio->>Dev: 返回短暂证书
    
    Dev->>Dev: 用私钥签名工件
    
    Dev->>Rekor: 提交签名和证书
    Rekor->>Rekor: 记录到透明度日志
    Rekor->>Dev: 返回包含证明
    
    Note over Verifier: 验证阶段
    Verifier->>Rekor: 查询日志条目
    Verifier->>Fulcio: 验证证书链
    Verifier->>Verifier: 验证签名
    
    alt 验证通过
        Verifier->>Verifier: 确认工件可信
    else 验证失败
        Verifier->>Verifier: 拒绝工件
    end

Sigstore的关键优势在于:

  • 短暂证书:证书有效期通常只有几分钟到几小时,即使被窃取也几乎没有利用价值
  • 身份绑定:证书与开发者的OIDC身份(如GitHub账户)绑定,而非与公司实体绑定
  • 透明度日志:所有签名操作都被记录在Rekor日志中,支持审计和监控
  • 免费使用:开发者无需购买商业证书

4.4 SLSA框架与供应链安全

Supply-chain Levels for Software Artifacts(SLSA)是一个安全框架,旨在为软件供应链提供可验证的安全保证。SLSA定义了从Level 1到Level 4的四个安全级别:

级别 描述 要求
L1 文档化构建 构建过程有记录
L2 托管构建 在隔离环境中构建
L3 硬化构建 构建环境有强隔离
L4 可重现构建 两人独立验证可重现

SLSA与代码签名的关系在于,它通过确保构建过程的完整性来增强签名的可信度。如果一个工件满足SLSA L3要求并通过Sigstore签名,那么验证者可以确信:该工件确实由声称的开发者在隔离环境中构建,且构建过程没有被篡改。

五、工程实践:如何正确使用代码签名

对于软件开发者而言,正确使用代码签名需要理解其安全边界并采取相应的保护措施。

5.1 证书保护的最佳实践

首先,私钥保护是重中之重。如果使用传统证书,应该:

  • 将证书存储在HSM或智能卡中,永远不要导出私钥
  • 对签名操作实施多因素认证
  • 限制能够访问签名环境的人员
  • 建立签名操作的审计日志

其次,应该考虑迁移到Sigstore等现代签名方案。Sigstore的短暂证书模型消除了证书盗窃的风险,同时其透明度日志提供了额外的安全保障。

5.2 验证签名时的注意事项

对于验证代码签名的系统,需要注意以下几点:

不要只验证签名有效性。一个有效的签名只证明文件未被篡改,不证明文件是安全的。应该结合其他信号进行判断:

  • 证书的颁发时间和历史信誉
  • 签名者身份的验证
  • 文件来源的可信度
  • 静态和动态安全扫描结果

正确处理时间戳。时间戳令牌可以证明签名是在证书有效期内创建的,但它不能证明文件本身是安全的。即使时间戳有效,如果证书后来因安全原因被吊销,仍然应该进一步调查。

实施证书白名单机制。对于关键系统,可以维护一个允许的证书白名单,只有白名单中的证书签名的文件才能执行。这虽然增加了管理负担,但可以显著降低风险。

5.3 双重签名与迁移策略

Windows支持对同一文件进行多次签名(双重签名),这对于证书迁移非常有用。例如,当从SHA-1迁移到SHA-256签名算法时,可以同时添加两种签名,确保新旧系统都能验证:

SignTool sign /fd SHA256 /sha1 <SHA1证书指纹> /as <文件>
SignTool sign /fd SHA256 /sha1 <SHA256证书指纹> <文件>

/as参数表示添加附加签名而非替换现有签名。双重签名的另一个用途是同时使用EV证书和普通证书签名,以获得更强的安全保证同时保持向后兼容。

六、未来展望:代码签名的演进方向

代码签名技术正在经历深刻的变革,几个趋势值得关注。

6.1 零信任架构中的代码签名

传统的代码签名假设存在一个可信的"根"——根CA。但在零信任架构中,信任需要被持续验证,而不是一次性授予。这意味着代码签名需要与其他身份和访问控制机制更紧密地集成:

  • 将签名身份与开发者的企业身份绑定
  • 实施持续监控,在证书被滥用时快速响应
  • 支持动态吊销,而不仅仅依赖CRL和OCSP

6.2 机器学习增强的异常检测

现代安全系统正在使用机器学习来检测证书滥用:

  • 分析签名行为模式,发现异常的签名活动
  • 将签名文件与已知恶意软件家族进行关联
  • 监控证书的使用地理位置和频率

这些技术可以补充传统的签名验证,帮助发现那些使用有效但被盗证书签名的恶意软件。

6.3 去中心化身份的潜力

去中心化身份(DID)技术为代码签名提供了另一种可能性。开发者可以拥有一个自己控制的去中心化身份,而非依赖CA颁发的证书。签名验证将检查身份的控制权证明,而非证书链。这种模式可以消除对中心化CA的依赖,但也带来了新的技术挑战。

graph TB
    subgraph 传统PKI模式
        A1[根CA] --> A2[中间CA]
        A2 --> A3[开发者证书]
        A3 --> A4[签名文件]
    end
    
    subgraph Sigstore模式
        B1[OIDC身份<br/>GitHub/Google] --> B2[Fulcio CA]
        B2 --> B3[短暂证书<br/>有效期: 分钟]
        B3 --> B4[签名文件]
        B4 --> B5[Rekor日志<br/>透明度记录]
    end
    
    subgraph 去中心化身份模式
        C1[DID标识符<br/>区块链注册] --> C2[开发者控制<br/>私钥]
        C2 --> C3[签名文件]
        C3 --> C4[智能合约验证<br/>无需中心CA]
    end
    
    A4 --> D[验证者]
    B5 --> D
    C4 --> D

结语

代码签名技术诞生于1995年,三十年来它一直是软件供应链安全的基石。然而,随着超过133万个签名恶意软件样本的出现,这个基石正在被侵蚀。

技术社区正在通过多种方式应对这一挑战:强制HSM提高了证书盗窃的难度,CT日志提供了证书滥用的可见性,Sigstore用短暂证书模型消除了长期证书的风险,SLSA框架从更宏观的层面保障软件供应链的完整性。

代码签名的本质是建立信任,而信任是安全领域永恒的主题。在可预见的未来,这场围绕代码签名的攻防博弈仍将继续——攻击者在寻找新的滥用方式,防御者在构建新的信任机制。对于开发者而言,理解这些技术原理并正确使用代码签名,是保护用户和软件供应链安全的基本责任。


参考文献

  1. Microsoft Learn. “WinVerifyTrust function (wintrust.h) - Win32 apps.” https://learn.microsoft.com/en-us/windows/win32/api/wintrust/nf-wintrust-winverifytrust

  2. NDSS 2022. “Understanding the Status and Strategies of the Code Signing Abuse.” https://www.ndss-symposium.org/wp-content/uploads/2026-f2857-paper.pdf

  3. CA/Browser Forum. “Baseline Requirements for the Issuance and Management of Publicly-Trusted Code Signing Certificates.” https://cabforum.org/working-groups/code-signing/

  4. RFC 3161. “Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP).” https://datatracker.ietf.org/doc/html/rfc3161

  5. SpecterOps. “Subverting Trust in Windows.” https://specterops.io/wp-content/uploads/sites/3/2022/06/SpecterOps_Subverting_Trust_in_Windows.pdf

  6. Trail of Bits. “Verifying Windows binaries, without Windows.” https://blog.trailofbits.com/2020/05/27/verifying-windows-binaries-without-windows/

  7. Sigstore. “Software Supply Chain Security.” https://www.sigstore.dev/

  8. SLSA. “Supply-chain Levels for Software Artifacts.” https://slsa.dev/

  9. NVD. “CVE-2013-3900 Detail.” https://nvd.nist.gov/vuln/detail/CVE-2013-3900

  10. Google Security Blog. “Software Supply Chain Security.” https://security.googleblog.com/

  11. Krebs on Security. “NVIDIA Code-Signing Certificates Stolen.” https://krebsonsecurity.com/2022/03/nvidia-code-signing-certificates-stolen/

  12. F-Secure. “Flame Malware Analysis.” https://www.f-secure.com/

  13. Apple Developer Documentation. “Notarizing macOS software before distribution.” https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution

  14. Android Developers. “APK Signature Scheme v4.” https://source.android.com/docs/security/features/apksigning/v4

  15. Certificate Transparency. “What is Certificate Transparency?” https://certificate.transparency.dev/

  16. NIST. “FIPS 140-2 Security Requirements for Cryptographic Modules.” https://csrc.nist.gov/publications/detail/fips/140/2/final

  17. Krebs on Security. “D-Link Code Signing Certificate Leaked.” https://krebsonsecurity.com/2018/04/d-link-code-signing-certificate-leaked-online/

  18. Microsoft Security Blog. “SmartScreen reputation-based protection.” https://www.microsoft.com/en-us/wdsi/defender

  19. Google Open Source Blog. “Introducing Sigstore.” https://opensource.googleblog.com/2021/08/introducing-sigstore.html

  20. The Update Framework (TUF). “Securing Software Updates.” https://theupdateframework.io/

  21. in-toto. “A framework for cryptologically ensuring the integrity of software supply chains.” https://in-toto.io/

  22. CycloneDX. “OWASP CycloneDX Software Bill of Materials Standard.” https://cyclonedx.org/

  23. SPDX. “Software Package Data Exchange (SPDX) specification.” https://spdx.dev/

  24. OpenSSF. “Open Source Security Foundation.” https://openssf.org/

  25. GCP Blog. “Binary Authorization for GKE.” https://cloud.google.com/binary-authorization

  26. AWS. “Code Signing for AWS Lambda.” https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html

  27. GitHub Blog. “Securing software supply chains.” https://github.blog/category/security/

  28. Linux Foundation. “The Linux Foundation Security Initiatives.” https://www.linuxfoundation.org/security/

  29. Mozilla. “Mozilla Root Store Policy.” https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/policy/

  30. Chromium. “Chromium Certificate Transparency Policy.” https://www.chromium.org/Home/chromium-security/certificate-transparency/

  31. Cloudflare. “Certificate Transparency and the Battle for Trusted HTTPS.” https://blog.cloudflare.com/certificate-transparency-and-the-battle-for-trusted-https/

  32. DigiCert. “Code Signing Best Practices.” https://www.digicert.com/signing/code-signing-best-practices

  33. Sectigo. “EV Code Signing Requirements.” https://www.sectigo.com/ev-code-signing-certificates

  34. GlobalSign. “Code Signing Certificate Guide.” https://www.globalsign.com/en/code-signing-certificate

  35. Venafi. “Machine Identity Management.” https://www.venafi.com/learning-center/what-is-machine-identity-management

  36. Keyfactor. “Code Signing Security.” https://www.keyfactor.com/resources/code-signing-security/

  37. Thales. “Hardware Security Modules for Code Signing.” https://cpl.thalesgroup.com/encryption/hardware-security-modules

  38. Entrust. “Code Signing Security Considerations.” https://www.entrust.com/digital-security/certificate-solutions/products/digital-certificates/code-signing

  39. RSA Conference. “Software Supply Chain Security Talks.” https://www.rsaconference.com/

  40. USENIX Security. “Software Supply Chain Security Research Papers.” https://www.usenix.org/conference/byname/108