关于 audit-xcode-security-settings
audit-xcode-security-settings 是用于评估并逐步强化 Xcode 项目安全设置的技能。它指导检查目标与权限配置、提出构建设置和权限变更,并验证最终配置。
主要功能
- 01检查 Xcode 目标与语言
- 02审计构建设置和权限
- 03提出 Enhanced Security 变更
- 04配置基础 Clang 安全选项
- 05验证变更后的设置
适用场景
- 01审计 Xcode 项目安全性
- 02按目标启用 Enhanced Security
- 03整理已弃用的权限设置
- 04验证安全设置变更
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ superagents-lab/ xcode27-skills --skill audit-xcode-security-settings安装后在 Claude Code 中输入/audit-xcode-security-settings确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/additional-settings.mdadoption-strategy.mdcpp-hardening.mddecision-document.mdenhanced-security.mdhardware-memory-tagging.mdpointer-authentication.mdreading-build-settings.mdreadonly-platform-memory.mdruntime-restrictions.mdsecurity-compiler-warnings.mdsettings-and-entitlements-catalog.mdstack-zero-init.mdtyped-allocators.mdscripts/filter_build_settings.py详细介绍
审计 Xcode 安全设置
评估 Xcode 项目的安全状况,并逐步启用安全构建设置和权利配置——从广泛适用的警告到强化安全防护。
工具偏好
当 GetTargetBuildSettings 因令牌数限制而将输出写入已保存的文件时,请参阅 references/reading-build-settings.md,了解其架构和筛选脚本(scripts/filter_build_settings.py)。不要逐行读取已保存的文件。
当 XcodeGlob、XcodeGrep、XcodeRead 和 XcodeLS 工具可用时,始终使用它们。不要改用 Bash 文件系统工具(ls、find、cat、grep)来了解项目情况。使用这些工具会触发额外的权限提示,并绕过项目范围限制。
- XcodeGlob 用于发现文件——禁止对项目内文件使用
find。 - XcodeGrep 用于搜索内容——禁止对项目内文件使用
grep/rg。 - XcodeRead 用于读取文件内容——禁止对已注册到项目中的文件使用
cat/Read。 - XcodeLS 用于列出目录——禁止对项目内的任何路径使用
ls。
项目根目录和名称已包含在系统提示上下文中。 开始前不要运行 ls 来“验证”项目布局。系统提示已告知工作目录和项目结构。
XcodeGlob 返回空结果并不代表失败。 .xcodeproj 和 .xcworkspace 不会作为文件编入 Xcode 项目组织索引——XcodeGlob "**/*.xcodeproj" 正确返回 0 个匹配项。请改用系统提示上下文中的项目名称。不要改用文件系统 ls/find。
项目组织路径与文件系统路径之间的转换。 XcodeGlob 返回相对于项目组织的路径。读取或编辑文件时:
- 优先使用项目组织路径调用
XcodeRead/XcodeUpdate。 - 如果该路径被拒绝(某些磁盘上的文件,如
.entitlementsplist,可能无法通过XcodeRead导航),请在路径前添加系统上下文中的项目根目录,转换为文件系统绝对路径。不要使用find来发现磁盘上的路径。
只有在 Xcode 工具无法完成操作时(例如,使用 plutil 编辑 plist、执行 git 操作),才改用 Bash。
常见故障模式
| 症状 | 原因 | 正确响应 |
|---|---|---|
XcodeGlob "**/*.xcodeproj" 返回 0 个匹配项 | .xcodeproj 本身未编入项目索引 | 使用系统上下文中的项目名称;不要改用 find 或 ls |
XcodeRead <project-org-path> 无法读取配置类型文件(.entitlements、.xcsettings、.xcconfig) | 某些磁盘上的文件无法通过项目路径导航 | 使用系统上下文中的项目根目录将路径转换为文件系统绝对路径,然后使用 Read / Edit |
工作流
阶段 0:发现
阅读系统提示上下文,其中包含:
- 项目根目录(工作目录)。
- 项目名称和结构(顶层文件、软件包)。
- 当前启用的方案。
不要调用 ls、find 或任何文件系统工具重新发现这些信息。
跟踪进度
开始第 1 阶段前:
-
以可见的项目符号列表向用户打印工作流计划(这样不喜欢冗长输出的用户也能看到接下来的安排):
工作流:
- 第 1 阶段:分析项目和现有设置
- 第 2 阶段:应用设置
- 步骤 1:增强安全性
- 步骤 2:基本 Clang 安全警告
- 第 3 阶段:询问已禁用的设置
- 第 4 阶段:验证已应用的设置
- 第 5 阶段:报告并更新决策文档
- 第 6 阶段:可选的后续操作
-
使用相同的项目调用
TaskCreate,以便喜欢详细信息的用户获得任务跟踪器。
进入每个阶段或子步骤时:
- 打印一行:“▶ 第 N 阶段:……”(子步骤使用“▶ 第 2 阶段 / 步骤 1:……”)。
- 将任务更新为
in_progress。
完成每个阶段或子步骤时:
- 打印一行:“✓ 第 N 阶段:……”(适当时简要说明结果,例如:“✓ 第 3 阶段:未发现已禁用的设置。”)。
- 将任务更新为
completed。
第 6 阶段以单个任务和单行开始。用户选择某项具体后续操作时,开始时打印“▶ 第 6 阶段 / ”,结束时打印“✓ 第 6 阶段 / ”,并创建或更新相应的子任务。
第 1 阶段:分析项目和设置
不与用户交互。静默收集信息。若可用,优先使用 XcodeGlob、XcodeGrep 和 XcodeRead,而不是对应的 Bash 工具(参见“工具偏好”)。
- 使用 XcodeGlob(
**/*.xcodeproj)或 Glob 查找.xcodeproj或.xcworkspace。 - 使用 XcodeGlob 或 Glob 搜索现有决策文档(
**/xcode-security-settings.md)。如果找到,请阅读并提取:语言,以及所有先前设置决策的状态和理由。这些信息将用于后续阶段。 - 使用 XcodeGlob 或 Glob 检测项目中包含的语言:
**/*.c→ C**/*.cpp、**/*.cxx、**/*.cc→ C++**/*.m→ Objective-C**/*.mm→ Objective-C++**/*.swift→ Swift
- 枚举目标及其权限文件——对每个目标,记录其产品类型、平台(通过
SDKROOT/SUPPORTED_PLATFORMS),并解析CODE_SIGN_ENTITLEMENTS,确定磁盘上的.entitlements路径(若因配置而异,则逐个配置记录)。第 2 阶段步骤 1 需要此映射。使用GetTargetBuildSettings时,请参阅references/reading-build-settings.md,了解输出架构以及处理大型结果的方法。
第 2 阶段:应用设置
按适用程度从高到低逐步应用设置。
检查现有安全设置。 在 pbxproj 和 xcconfig 文件中搜索目录中的设置(参见 references/settings-and-entitlements-catalog.md)。仅应用尚未设置的项。如果所有设置都已启用,请告知用户并停止。
如何应用构建设置:
- 项目使用
.xcconfig文件 — 直接编辑 xcconfig。项目级和目标级设置均适用。 - 项目仅使用
.pbxproj— 使用UpdateTargetBuildSetting设置目标级设置,使用UpdateProjectBuildSetting设置项目级设置。 - 混合使用 — 如果目标有
.xcconfig文件,则编辑 xcconfig;否则,使用 Xcode 构建设置工具。切勿引入新的配置方式。
尽可能优先使用项目级设置(减少重复)。如果项目不使用 xcconfig,则回退到通过 UpdateTargetBuildSetting 设置目标级设置。
例外 — ENABLE_ENHANCED_SECURITY: 必须在项目级设置。如果项目使用 xcconfig,则在其中设置;否则,使用 UpdateProjectBuildSetting。
步骤 1:增强安全性 — 审核权限和构建设置,然后提出逐目标差异
有关完整的键列表、默认值、已弃用的键、版本迁移和支持的产品类型列表,请阅读 references/enhanced-security.md。有关各项子选项的详情,请参阅:
references/pointer-authentication.md— arm64e 指针签名references/typed-allocators.md— 类型感知内存分配references/stack-zero-init.md— 自动将栈变量初始化为零references/readonly-platform-memory.md— dyld 状态保护references/runtime-restrictions.md— dylib 和 Mach 消息限制references/security-compiler-warnings.md— 面向安全的编译器警告references/cpp-hardening.md— C++ 标准库加固和边界检查references/hardware-memory-tagging.md— ARM MTE
-
确定支持的目标。 根据 Phase 1 步骤 4 收集的目标映射,跳过产品类型不在
references/enhanced-security.md的“Supported Product Types”列表中的目标。其余目标均为“支持的目标”。注意:DriverKit 目标仅支持构建设置,跳过对它们的权利变更。 -
审计每个支持的目标。 收集
ENABLE_ENHANCED_SECURITY和ENABLE_POINTER_AUTHENTICATION的构建设置值(先检查目标级,再检查项目级继承值)。对于非 DriverKit 目标,还要读取权利文件,并收集com.apple.security.hardened-process*下的所有键,包括已弃用的键。根据references/enhanced-security.mdPart B 中的必需键和默认启用键进行对照,并为每个目标归类:- 最新 — 无需处理。
- 部分配置 —
ENABLE_ENHANCED_SECURITY为 YES,但缺少默认启用的子选项,或包含已弃用的键,或存在版本"1"/ 已弃用的版本键。 - 关闭 —
ENABLE_ENHANCED_SECURITY不存在。 - 无权利文件 — 目标受支持,但尚无
.entitlements文件。如果用户确认应用更改,将创建一个(见步骤 5)。
重要 如果项目包含任何并非从源代码纳入本项目的二进制依赖项(例如 frameworks、xcframeworks、Swift Packages),请勿启用指针身份验证。如果项目确实包含此类依赖项,请列出它们,并建议用户联系依赖项供应商,以获取同时包含 arm64 和 arm64e 的 Universal 二进制文件。
-
整理变更集。 对于每个配置部分或关闭的支持目标,按以下顺序整理权利变更(省略空白部分):
- 添加权利:缺少的必需键(
com.apple.security.hardened-process、...enhanced-security-version-string = "2")和缺少的默认启用子选项(hardened-heap、dyld-ro、platform-restrictions-string = "2")。 - 移除权利:已弃用的键(
...platform-restrictions、...enhanced-security-version)。 - 更新权利:如果版本字符串为
"1",则更新为"2"。
如果支持的目标没有
.entitlements文件,请在变更集中加入创建文件并配置CODE_SIGN_ENTITLEMENTS。构建设置: 遵循上文“How to apply build settings”中的说明。如果项目使用 xcconfig,请在其中的项目级设置
ENABLE_ENHANCED_SECURITY = YES。否则,请使用UpdateProjectBuildSetting。由于项目级的
ENABLE_ENHANCED_SECURITY = YES会将ENABLE_POINTER_AUTHENTICATION = YES级联应用到每个目标,因此对于平台不支持 arm64e 的目标(通过SDKROOT/SUPPORTED_PLATFORMS判断),请预先添加目标级ENABLE_POINTER_AUTHENTICATION = NO覆盖值。如果目标已有显式的目标级值,则跳过。不要自动启用默认关闭的子选项(MTE 系列);请报告其状态,并在下方步骤 6 中提供启用选项。
- 添加权利:缺少的必需键(
-
展示并确认。 如果所有支持的目标都已是最新状态,请用一行报告此情况,并继续步骤 2(基本 Clang 安全警告)——无需在没有待应用内容时询问是否确认应用。否则,请打印计划启用 Enhanced Security 的目标列表。 然后简要总结启用 Enhanced Security 的好处,包括它提供的安全保护以及可能需要的代码更改。
然后通过
AskUserQuestion询问一次:“应用上述 Enhanced Security 更改吗?”提供“全部应用”“应用部分(选择目标)”“跳过 Enhanced Security”。 -
应用。
- 对非 arm64e 平台上的目标,通过
UpdateTargetBuildSetting设置目标级ENABLE_POINTER_AUTHENTICATION = NO覆盖值。跳过已显式设置目标级值的目标。 - 直接编辑现有的每目标
.entitlementsplist——添加必需且默认启用的键,移除已弃用的键,并以原子方式将版本字符串"1"迁移为"2"。 - 对于没有
.entitlements文件的目标,创建一个文件并将CODE_SIGN_ENTITLEMENTS指向该文件。
报告:“已在 N 个目标上启用 Enhanced Security。已移除 M 个已弃用的授权项。在 K 个目标上将版本字符串升级为 2。在 T 个非 arm64e 平台目标上添加 arm64e 覆盖值。”
- 对非 arm64e 平台上的目标,通过
-
硬件内存标记。 仅支持
SUPPORTED_PLATFORMS(或SDKROOT)为macosx、iphoneos/iphonesimulator或xros/xrsimulator的目标。(硬件支持需要 M5 级及更新的 Apple silicon;不支持 tvOS、watchOS 和 DriverKit 目标。)如果未应用 Enhanced Security,或没有已修改的目标匹配这些平台,则跳过此步骤。否则,通过AskUserQuestion询问:“可通过com.apple.security.hardened-process.checked-allocations启用硬件内存标记。要启用吗?”如果是 → 阅读references/hardware-memory-tagging.md并应用其中的设置。
步骤 2:基本 Clang 安全警告
对于包含 C、C++、Objective-C 和 Objective-C++ 的代码库,无需询问即可应用。对于纯 Swift 代码库,跳过此步骤。跳过已启用的设置。除非另有说明,以下所有设置均适用于 C/C++/ObjC/ObjC++。
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERRORGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVECLANG_WARN_IMPLICIT_FALLTHROUGH = YESGCC_WARN_64_TO_32_BIT_CONVERSION = YESGCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES(仅限 C/ObjC/ObjC++)CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YESCLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YESCLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES
简要报告:“已启用其他编译器警告。”
第 3 阶段:询问已禁用的设置
在 pbxproj 和 xcconfig 文件中搜索 references/settings-and-entitlements-catalog.md 中显式设为 NO 的任何构建设置。排除不支持 arm64e 的平台上目标的 ENABLE_POINTER_AUTHENTICATION = NO(该技能会在这些目标上自行设置此项)。对于支持 arm64e 的目标,若发现 ENABLE_POINTER_AUTHENTICATION = NO,则应标记——这是值得询问的主动选择退出。若未发现其他已禁用的设置,则跳过此阶段。仅考虑与第 1 阶段检测到的语言相关的设置——请参阅目录中的 Scope 列。
对于发现的每项已禁用设置,检查决策文档中是否有状态为 Disabled 且附带理由的条目。
**如果决策文档中记录了理由,**请在报告中说明,然后继续。该理由记录了先前的决定,之后可重新审查。
**如果决策文档中没有相关条目,**请询问用户:
“我发现
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND被显式设为 NO,但没有说明原因。这样设置有原因吗?”
如果用户提供了原因,请接受并将理由记录到决策文档中,以便今后重新审查。如果没有原因,则建议重新启用。
这也适用于技能通常会启用的任何设置,例如 ENABLE_ENHANCED_SECURITY。如果其中任何设置已显式设为 NO,请按相同流程先检查决策文档,再进行询问。
阶段 4:验证设置
对于阶段 2 中修改的每个目标,使用 GetTargetBuildSettings 验证所应用的每项构建设置是否显示预期值。如果某项设置缺失或值不符合预期,请在报告中标记,说明当前 Xcode 版本可能不支持该设置。有关输出架构和处理大量结果的步骤,请参阅 references/reading-build-settings.md。
阶段 5:报告和决策文档
生成精简摘要:
- 已启用: 列出已启用的项目级设置。
- 各目标的增强安全性: 对每个受支持的目标,用一行说明:目标名称、最终状态(已是最新 / 已应用 / 用户跳过),以及简要变更(新增的权利、移除的弃用键、版本升级、是否创建了权利文件)。将因产品类型不受支持而跳过的目标汇总为一行,而不是逐个列出。
- 已处于启用状态: 列出已正确配置的设置。
- 已询问: 列出发现处于禁用状态的设置,以及询问后的处理结果。
决策文档。 阅读 references/decision-document.md,并按其中说明创建或更新决策文档。
阶段 6:可选后续步骤
按顺序逐项提出以下选项。每项都是独立的“是 / 否”问题,不要合并成一个多选提示。有关建议的采用顺序和基于语言构成的决策矩阵,请参阅 references/adoption-strategy.md。
-
其他设置。 通过
AskUserQuestion提问:“还有一些诊断设置可以发现更多问题,但也可能产生误报。要启用它们吗?”如果用户回答“是” → 阅读references/additional-settings.md并按其中说明操作。 -
边界安全编程模型(仅当存在 C 或 C++ 代码时)。对于 C 项目,提问:“想了解如何采用
ENABLE_C_BOUNDS_SAFETY吗?这是基于注解的 C 边界安全编程模型——调用 Xcode 的bounds-safety技能即可开始。”对于 C++ 项目,提问:“想了解如何采用ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS吗?它支持 C++ 边界安全缓冲区模式——调用 Xcode 的bounds-safety技能即可开始。”
面向用户的交互指南
- 回复保持精简。 使用简短的句子。
- 尽量减少向用户提问。 预定提问有两个:增强安全性的应用确认,以及硬件内存标记选项。其他问题视情况而定:询问有意禁用的设置(仅当显式设置为
= NO且没有记录原因时),以及询问决策文档的位置(仅首次创建时)。 - 报告进度,让用户了解进展:“正在启用……”“正在评估……”“保持启用 / 正在还原……”
- 使用
AskUserQuestion询问已禁用设置、确认是否应用增强安全性(包括提供“应用于部分目标”选项),以及询问决策文档的位置(仅首次创建时)。 - 提问时提供用户作答所需的背景信息。 例如,先说明安全保护的作用,再询问是否启用。应描述它提供的保护,而不是如何启用。
- 列出 Xcode 构建设置时使用项目符号列表。 不要用逗号分隔列表。