用途
该技能用于评估 Xcode 项目的安全态势,并逐步启用面向安全的构建设置与 entitlements。其目标是从广泛适用的编译器警告,推进到 Enhanced Security 层面的加固。
主要能力与工作流
技能按阶段推进,并在开始前向用户打印工作流计划,同时用 TaskCreate 建立任务跟踪。
Phase 0:发现
从系统提示上下文中读取项目根目录、项目名称与结构、当前 scheme。明确要求不要调用 ls、find 等文件系统工具来重复发现这些信息。
Phase 1:分析项目与设置
无用户交互,静默收集事实。优先使用 XcodeGlob、XcodeGrep、XcodeRead 而非 Bash 等价命令。具体包括:查找 .xcodeproj 或 .xcworkspace;查找已有决策文档(**/xcode-security-settings.md)并读取;通过文件扩展名检测语言(.c、.cpp/.cxx/.cc、.m、.mm、.swift);枚举 target 及其 entitlements 文件,记录产物类型、平台(通过 SDKROOT / SUPPORTED_PLATFORMS),并将 CODE_SIGN_ENTITLEMENTS 解析为磁盘上的 .entitlements 路径。
Phase 2:应用设置
从适用性最高到最低逐步应用,仅应用尚未设置的项。若全部已启用则告知用户并停止。
构建设置的写入方式:
- 项目使用 .xcconfig 文件时,直接编辑 xcconfig(支持项目级与目标级)。
- 仅使用 .pbxproj 时,目标级设置用 UpdateTargetBuildSetting,项目级用 UpdateProjectBuildSetting。
- 混合情况:target 有 xcconfig 就编辑 xcconfig,否则用 Xcode 构建设置工具。不引入新的配置方式。
Step 1:Enhanced Security —— 审计 entitlements 与构建设置,然后按 target 提出差异。读取 references/enhanced-security.md 获取完整键列表、默认值、已弃用键、版本迁移及支持的产品类型列表。会跳过产物类型不在支持列表中的 target(DriverKit target 仅支持构建设置,跳过 entitlement 变更)。对每个受支持 target 收集 ENABLE_ENHANCED_SECURITY、ENABLE_POINTER_AUTHENTICATION 的值,并读取 entitlements 中 com.apple.security.hardened-process* 下的所有键,将 target 分类为:Up-to-date、Partial、Off、No entitlements file。对 Partial 或 Off 的 target 生成变更集(新增必需键与默认开启子选项、移除已弃用键、版本字符串 "1" 升级为 "2" 等)。
注意:若项目存在非源码形式的二进制依赖(frameworks、xcframeworks、Swift Packages),不得启用指针认证,需列出这些依赖并建议用户联系供应商获取同时包含 arm64 与 arm64e 的 Universal 二进制。不自动启用默认关闭的子选项(MTE 系列)。
会先打印拟启用 Enhanced Security 的 target 列表及其收益与可能需要的代码改动摘要,然后通过 AskUserQuestion 询问一次:"Apply the Enhanced Security changes above?",选项为 "Apply all"、"Apply to a subset (choose targets)"、"Skip Enhanced Security"。
硬件内存标记仅在特定平台(macosx、iphoneos/iphonesimulator、xros/xrsimulator)下提供询问。
Step 2:基础 Clang 安全警告 —— 对含 C、C++、Objective-C、Objective-C++ 的代码库直接应用(无需询问),纯 Swift 代码库跳过。资料列出的设置包括:GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR、GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE、CLANG_WARN_IMPLICIT_FALLTHROUGH = YES、GCC_WARN_64_TO_32_BIT_CONVERSION = YES、GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES(仅 C/ObjC/ObjC++)、CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES、CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES、CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES。
Phase 3:询问被禁用的设置
在 pbxproj 与 xcconfig 中查找目录里被显式设为 NO 的构建设置。排除平台不支持 arm64e 时技能自身设置的 ENABLE_POINTER_AUTHENTICATION = NO,但会标记 arm64e 能力平台上主动关闭该项的情况。若决策文档中已有 Disabled 状态及理由则记录并继续;否则询问用户原因,有原因则记录,无原因则建议重新启用。仅考虑 Phase 1 中检测到的语言相关的设置。
Phase 4:验证设置
对 Phase 2 中修改的每个 target,使用 GetTargetBuildSettings 验证所应用设置是否以预期值出现。缺失或值异常时在报告中标记为可能不被当前 Xcode 版本支持。
Phase 5:报告与决策文档
生成精简摘要:Enabled(项目级已启用设置)、Enhanced Security per target(每个受支持 target 一行,含最终状态与简要差异,不支持产物类型的跳过项汇总为一行)、Already active、Inquired。随后读取 references/decision-document.md 创建或更新决策文档。
Phase 6:可选后续步骤
逐个、按顺序提供独立的 yes/no 问题,不合并为多选:额外诊断设置;C/C++ 边界安全编程模型(仅当存在 C 或 C++ 代码时,分别询问是否采用 ENABLE_C_BOUNDS_SAFETY 或 ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS)。
工具偏好
当 XcodeGlob、XcodeGrep、XcodeRead、XcodeLS 可用时应始终使用,不用 Bash 文件系统工具。XcodeGlob 用于文件发现(项目内文件禁用 find),XcodeGrep 用于内容搜索(禁用 grep/rg),XcodeRead 用于文件内容(禁用 cat/Read),XcodeLS 用于目录列举(禁用 ls)。仅在 Xcode 工具无法完成的操作用 Bash 兜底,例如用 plutil 编辑 plist、git 操作。
关于 XcodeGlob "**/*.xcodeproj" 返回 0 结果:这不是失败,.xcodeproj 与 .xcworkspace 未被索引为项目内文件,应改用系统上下文中的项目名称。
路径转换:XcodeGlob 返回项目组织相对路径,优先用 XcodeRead / XcodeUpdate 读取或编辑;被拒绝时(如某些 .entitlements plist 无法通过 XcodeRead 导航),从系统上下文中的项目根目录拼接为文件系统绝对路径;不得用 find 发现磁盘路径。
适用场景
适用于需要评估并加固 Xcode 项目安全构建设置的开发场景,尤其是含 C、C++、Objective-C、Objective-C++ 的代码库。纯 Swift 代码库会跳过基础 Clang 安全警告步骤。
限制
资料未提供该技能的价格、支持的完整平台清单、运行环境要求或效果保证。指针认证在存在非源码二进制依赖时不得启用。硬件内存标记仅部分平台支持,且需要 M5 类及更新的 Apple 芯片硬件。部分行为依赖项目是否使用 xcconfig 及是否存在二进制依赖。