Highlight
Xcode 15 新增依赖签名验证功能,自动检测第三方 XCFramework 的签名状态和身份一致性,在供应链攻击(如 SDK 被篡改或替换)时阻止构建,保护 App 的软件供应链安全。
核心内容
供应链安全风险
你的 App 依赖多少个第三方 SDK?每个 SDK 都可能成为攻击入口。
(01:18)使用第三方 SDK 让开发更高效,但也引入了供应链安全风险。恶意攻击者可能篡改 SDK 分发包,在你的 App 中植入后门。手动验证每个 SDK 每个版本的签名非常耗时,开发者往往跳过这一步。
Xcode 15 的签名验证功能让这件事变得自动且简单。
代码签名原理
(02:59)Apple 的代码签名技术通过以下步骤保护 SDK 完整性:
- 生成编译后二进制文件的 Code Directory Hash(CDHash)
- 用开发者证书的私钥对 CDHash 签名
- 公钥随签名一起分发,任何人都可以验证签名者身份
- 加入安全时间戳,确保签名在特定时间点生成
如果 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 演示了完整的攻击场景:
- 开发者引入了一个名为 BirdFeeder 的已签名 XCFramework
- Xcode Inspector 显示签名信息,构建成功
- 攻击者声称提供了”功能更多、性能更好”的新版本
- 开发者替换为被篡改的版本
- 构建失败,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 会自动将签名身份记录到项目中。后续每次构建都会验证:
- 签名是否有效
- 身份是否与记录的一致
- 证书是否过期或被撤销
- 内容是否被修改
处理签名验证警告
当 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 流程,避免手动操作遗漏
核心启发
-
为所有第三方依赖启用签名验证
- 做什么:检查项目中每个 XCFramework 的签名状态,优先使用已签名的版本
- 为什么值得做:Xcode 15 自动验证签名,零成本获得供应链安全保护
- 怎么开始:在 Xcode Inspector 中查看每个 XCFramework 的 Signature 部分,Unsigned 的联系作者获取签名版本
-
为自研 SDK 添加签名
- 做什么:为团队内部或开源 SDK 配置自动签名流程
- 为什么值得做:让使用你 SDK 的开发者获得 Xcode 的自动保护,建立信任
- 怎么开始:在构建脚本中加入
codesign命令,使用 Apple Distribution 证书
-
建立 SDK 引入审核流程
- 做什么:在引入新 SDK 时记录其签名身份,建立变更审批机制
- 为什么值得做:Xcode 会在签名身份变化时警告,但你需要知道变化是否预期
- 怎么开始:维护一份 SDK 签名身份清单,更新 SDK 时先比对该清单
-
在 CI 中集成签名验证
- 做什么:确保 CI 构建环境使用与本地相同的 Xcode 版本,签名验证在 CI 中同样生效
- 为什么值得做:防止 CI 环境中引入被篡改的依赖
- 怎么开始:CI 脚本中在构建前运行
codesign --verify检查关键依赖
-
向 SDK 作者推广签名
- 做什么:联系你使用的未签名 SDK 的作者,建议他们添加签名
- 为什么值得做:签名验证生态需要上下游共同参与,你推动的每个 SDK 签名都在提升整个供应链安全
- 怎么开始:在 SDK 的 GitHub Issue 或支持渠道中提出签名请求,引用本 Session 和 Apple 文档
关联 Session
- Get started with privacy manifests — 了解隐私清单如何帮助准确声明数据收集行为
- What’s new in privacy — iOS 17 和 macOS Sonoma 中的最新隐私功能
- What’s new in Xcode 15 — Xcode 15 的新功能
评论
GitHub Issues · utterances