用数字签名验证应用依赖的完整性
Verify app dependencies with digital signatures
2023年6月5日
一句话判断
Xcode 15 内置了依赖签名自动验证功能——当你引入的第三方 xcframework 被篡改或签名身份变更时,构建会直接报错拦截,供应链安全从此不需要手动检查了。
这场 Session 讲了什么
Privacy Engineering 团队的 Kay 介绍了 Xcode 15 中全新的依赖签名验证功能。这个功能解决的核心问题是:你引入项目的第三方 SDK 到底是不是原作者发布的那个版本,中间有没有被人动过手脚。
应用开发离不开 SDK,有 Apple 提供的系统 SDK,有团队内部共享的 SDK,也有从第三方获取的 SDK。这些依赖构成了应用的供应链。使用第三方 SDK 能显著提升开发效率,但同时也引入了供应链安全风险——恶意篡改的 SDK 可能会在你的应用中植入后门。
Session 从代码签名的基本原理讲起,解释了 CDHash、开发者证书、安全时间戳等概念如何协同工作来保证 xcframework 的完整性。然后详细演示了 Xcode 15 中的 Inspector 面板如何展示签名状态,以及在检测到签名异常时如何自动拦截构建。
Session 用 Backyard Birds 示例应用做了一次完整的供应链攻击模拟演示:当作者将一个被篡改的 BirdFeeder xcframework 替换到项目中时,Xcode 立刻识别出签名身份不匹配并阻止了构建。
值得深挖的点
两种信任级别的差异:Xcode 根据签名证书类型提供不同级别的保护。Apple Developer Program 身份的证书,Apple 可以验证其有效性(包括是否被吊销),且保证开发者名称不重复。自签名证书则没有第三方背书,需要开发者直接联系 SDK 作者确认指纹是否合法。这个差异意味着——作为 SDK 使用者,优先选择使用 Apple Developer Program 证书签名的依赖。
首次记录机制:Xcode 在首次使用 xcframework 时会记录其签名身份。后续构建会自动验证当前签名与记录是否一致。这个设计很巧妙——不需要你手动维护一个”受信任签名列表”,系统自动帮你做了。
证书过期和续签处理:当 SDK 作者的签名证书过期后需要续签。对于 Apple Developer Program 身份,Xcode 能自动验证新证书是否来自同一开发者。对于自签名证书,需要手动确认变更是否合法——因为没有 Apple 作为可信第三方来担保。
隐私清单文件也在保护范围内:代码签名不仅保护编译后的二进制文件,也保护 xcframework 中的隐私清单(Privacy Manifest)文件。这确保了第三方 SDK 声明的隐私实践不会被篡改。
代码片段
这场 Session 不涉及应用代码编写,主要展示 Xcode IDE 的功能。以下是相关的工作流程命令:
# 手动验证 xcframework 的代码签名(不依赖 Xcode 自动验证时)
codesign --verify --deep --strict ./PathTo/MyFramework.xcframework
# 查看 xcframework 的签名详情
codesign -dvvv ./PathTo/MyFramework.xcframework
# 获取证书的 SHA-256 指纹(用于与 SDK 作者确认)
codesign -dvvv ./PathTo/MyFramework.xcframework 2>&1 | grep "SHA-256"
# SDK 作者:用 Apple Developer Program 证书签名 xcframework
# 在 Xcode 的 Build Settings 中设置:
# CODE_SIGN_IDENTITY = "Apple Development"
# 或者使用命令行:
codesign --sign "Apple Development" --timestamp ./MyFramework.xcframework
最佳实践
- SDK 使用者:引入新的 xcframework 后立即检查 Inspector 中的签名状态,确认签名身份可信。如果显示”unsigned”,联系 SDK 作者获取签名版本。
- SDK 使用者:不要忽略 Xcode 的签名验证警告。它出现的频率很低,一旦出现几乎意味着真的有问题。
- SDK 使用者:对于使用自签名证书的 SDK,务必通过可靠渠道(如官方文档、作者直接沟通)确认证书指纹。
- SDK 作者:务必使用 Apple Developer Program 证书对你的 xcframework 进行签名,不要使用自签名证书。这样你的用户能获得最高级别的自动保护。
- SDK 作者:包含隐私清单文件并确保它在 xcframework 内部被代码签名保护。这不仅符合 Apple 的隐私要求,也能防止清单被篡改。
- SDK 作者:在发布说明中附上签名证书的指纹信息,方便用户验证。
还有什么值得关注
- 这个功能目前主要针对 xcframework 格式的依赖。Swift Package Manager 的依赖验证机制可能有所不同。
- Session 提到 Apple 可以吊销被认定为恶意的开发者证书——这意味着 Apple 在供应链安全中扮演了 CA(证书颁发机构)的角色。
- 如果你的项目中有大量未签名的 xcframework,迁移策略应该是优先推动上游 SDK 作者签名,而不是自己手动签名别人的 SDK。
- Xcode 在检测到签名问题时会提供直接从项目中移除可疑 xcframework 的选项,这是一键止损的好设计。
- 供应链安全正在从”最佳实践”变为”开发工具的默认行为”,这个趋势值得关注。