WWDC Quick Look 💓 By SwiftGGTeam
Verify app dependencies with digital signatures

Verify app dependencies with digital signatures

观看原视频

Highlight

Xcode 15 新增依赖签名验证功能,自动检测第三方 XCFramework 的签名状态和身份一致性,在供应链攻击(如 SDK 被篡改或替换)时阻止构建,保护 App 的软件供应链安全。

核心内容

供应链安全风险

你的 App 依赖多少个第三方 SDK?每个 SDK 都可能成为攻击入口。

01:18)使用第三方 SDK 让开发更高效,但也引入了供应链安全风险。恶意攻击者可能篡改 SDK 分发包,在你的 App 中植入后门。手动验证每个 SDK 每个版本的签名非常耗时,开发者往往跳过这一步。

Xcode 15 的签名验证功能让这件事变得自动且简单。

代码签名原理

02:59)Apple 的代码签名技术通过以下步骤保护 SDK 完整性:

  1. 生成编译后二进制文件的 Code Directory Hash(CDHash)
  2. 用开发者证书的私钥对 CDHash 签名
  3. 公钥随签名一起分发,任何人都可以验证签名者身份
  4. 加入安全时间戳,确保签名在特定时间点生成

如果 SDK 被篡改,签名就会失效。XCFramework 的签名存放在 _CodeSignature 目录中,保护框架内所有文件,包括隐私清单文件。

Xcode 15 自动验证

05:27)Xcode 15 在 Inspector 中新增 “Signature” 视图,显示每个 XCFramework 的签名状态:

  • 由 Apple Developer Program 身份签名
  • 由自签名证书签名
  • 未签名

Xcode 会在首次引入 XCFramework 时记录签名身份,后续构建中自动验证身份是否改变。

对于 Apple Developer Program 身份,Xcode 会验证证书是否有效、是否被撤销、是否过期,并在发现问题时自动阻止构建。对于自签名证书,Xcode 会比较证书的 SHA-256 指纹,指纹变化时发出警告。

供应链攻击模拟演示

09:06)Session 用 Backyard Birds 示例 App 演示了完整的攻击场景:

  1. 开发者引入了一个名为 BirdFeeder 的已签名 XCFramework
  2. Xcode Inspector 显示签名信息,构建成功
  3. 攻击者声称提供了”功能更多、性能更好”的新版本
  4. 开发者替换为被篡改的版本
  5. 构建失败,Xcode 提示签名身份不匹配:预期是 Apple Developer Program 证书,实际是自签名证书

Xcode 提供了移除或接受变更的选项。如果你不确定,选择取消并联系 SDK 作者确认。

SDK 作者如何签名

12:17)SDK 作者应该使用 Apple Developer Program 的 Apple Distribution 证书为 XCFramework 签名。Apple 作为可信机构会验证开发者身份,证书过期后 Xcode 也能自动验证新证书是否来自同一开发者。

使用 codesign 命令签名:

codesign --timestamp -v --sign "Apple Distribution: Truck to Table (UA527FUGW7)" BirdFeeder.xcframework

关键点:

  • --timestamp:包含 Apple 认证的安全时间戳
  • --sign:指定签名身份(Apple Developer Program 证书)
  • 签名保护 XCFramework 内所有文件,包括隐私清单

如果没有 Apple Developer Program 会员资格,可以使用自签名证书,但需要向 SDK 使用者公布证书指纹以便验证。

详细内容

在 Xcode 中查看签名状态

09:41)在 Xcode 15 的项目导航器中选择 XCFramework 文件,Inspector 面板会显示 Signature 部分:

  • Signed by:签名者身份和团队信息
  • Certificate type:Apple Developer Program / Self-signed / Unsigned
  • Status:Valid / Invalid / Changed

首次添加已签名的 XCFramework 时,Xcode 会自动将签名身份记录到项目中。后续每次构建都会验证:

  1. 签名是否有效
  2. 身份是否与记录的一致
  3. 证书是否过期或被撤销
  4. 内容是否被修改

处理签名验证警告

当 Xcode 检测到签名问题时,会显示构建错误。常见的警告场景:

场景Xcode 行为建议操作
身份从 Apple Developer 变为 Self-signed构建失败,显示身份对比取消构建,联系 SDK 作者确认
同一 Apple Developer 的新证书自动验证通过无需操作
自签名证书指纹变化构建失败通过可靠渠道确认变更合法性
证书被 Apple 撤销构建失败移除该 XCFramework,联系作者获取新版本

11:08)遇到警告时,Xcode 提供两个选项:移除到废纸篓,或接受变更。只有在通过官方渠道确认变更合法后,才应选择接受。

为现有 SDK 补签名

15:38)你可以为已经发布的 SDK 版本补签名,不需要重新构建。这对 SDK 作者来说是一个快速启用安全保护的途径:

# 为已发布的 XCFramework 补签名
codesign --timestamp -v --sign "Apple Distribution: Your Team (TEAM_ID)" YourSDK.xcframework

# 验证签名
codesign -vv --verify YourSDK.xcframework

将签名命令集成到构建脚本中,确保每次发布的新版本都自动签名:

#!/bin/bash
# build_and_sign.sh

FRAMEWORK_NAME="YourSDK.xcframework"
IDENTITY="Apple Distribution: Your Team (TEAM_ID)"

# 构建 XCFramework
xcodebuild -create-xcframework \
    -framework build/ios/YourSDK.framework \
    -framework build/ios_simulator/YourSDK.framework \
    -output $FRAMEWORK_NAME

# 签名
codesign --timestamp -v --sign "$IDENTITY" $FRAMEWORK_NAME

echo "Signed $FRAMEWORK_NAME successfully"

关键点:

  • 构建完成后立即签名,确保签名覆盖最终产物
  • --timestamp 确保签名包含时间戳,证书过期后仍能验证签名时的有效性
  • 将脚本加入 CI/CD 流程,避免手动操作遗漏

核心启发

  1. 为所有第三方依赖启用签名验证

    • 做什么:检查项目中每个 XCFramework 的签名状态,优先使用已签名的版本
    • 为什么值得做:Xcode 15 自动验证签名,零成本获得供应链安全保护
    • 怎么开始:在 Xcode Inspector 中查看每个 XCFramework 的 Signature 部分,Unsigned 的联系作者获取签名版本
  2. 为自研 SDK 添加签名

    • 做什么:为团队内部或开源 SDK 配置自动签名流程
    • 为什么值得做:让使用你 SDK 的开发者获得 Xcode 的自动保护,建立信任
    • 怎么开始:在构建脚本中加入 codesign 命令,使用 Apple Distribution 证书
  3. 建立 SDK 引入审核流程

    • 做什么:在引入新 SDK 时记录其签名身份,建立变更审批机制
    • 为什么值得做:Xcode 会在签名身份变化时警告,但你需要知道变化是否预期
    • 怎么开始:维护一份 SDK 签名身份清单,更新 SDK 时先比对该清单
  4. 在 CI 中集成签名验证

    • 做什么:确保 CI 构建环境使用与本地相同的 Xcode 版本,签名验证在 CI 中同样生效
    • 为什么值得做:防止 CI 环境中引入被篡改的依赖
    • 怎么开始:CI 脚本中在构建前运行 codesign --verify 检查关键依赖
  5. 向 SDK 作者推广签名

    • 做什么:联系你使用的未签名 SDK 的作者,建议他们添加签名
    • 为什么值得做:签名验证生态需要上下游共同参与,你推动的每个 SDK 签名都在提升整个供应链安全
    • 怎么开始:在 SDK 的 GitHub Issue 或支持渠道中提出签名请求,引用本 Session 和 Apple 文档

关联 Session

评论

GitHub Issues · utterances