audit-xcode-security-settings — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-xcode-security-settings (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Assess an Xcode project's security posture and progressively enable security build settings and entitlements — from broadly applicable warnings through Enhanced Security hardening.
When GetTargetBuildSettings writes its output to a saved file due to a token limit, see references/reading-build-settings.md for the schema and the filter script (scripts/filter_build_settings.py). Do not read the saved file linearly.
When XcodeGlob, XcodeGrep, XcodeRead, and XcodeLS tools are available, ALWAYS use them. Do not fall back to Bash filesystem tools (ls, find, cat, grep) to learn about the project. They trigger extra permission prompts and bypass project scoping.
find is forbidden for files inside the project.grep/rg is forbidden for files inside the project.cat/Read is forbidden for files registered in the project.ls is forbidden for any path inside the project.Project root and name are already in the system prompt context. Do NOT run ls to "verify" the project layout before starting. The system prompt already tells you the working directory and the project structure.
Empty XcodeGlob results are not a failure. The .xcodeproj and .xcworkspace are not indexed as files inside the Xcode project organization — XcodeGlob "**/*.xcodeproj" correctly returns 0 matches. Use the project name from system-prompt context instead. Do not fall back to filesystem ls/find.
Path translation between project-org and filesystem. XcodeGlob returns project-org-relative paths. To read or edit a file:
XcodeRead / XcodeUpdate with the project-org path..entitlements plists may not be navigable through XcodeRead), translate to a filesystem absolute path by prepending the project root from system context. Do NOT use find to discover the on-disk path.Fall back to Bash only for operations the Xcode tools cannot do (e.g., plutil for plist editing, git operations).
| Symptom | Cause | Correct Response |
|---|---|---|
XcodeGlob "**/*.xcodeproj" returns 0 matches | The .xcodeproj itself isn't a project-indexed file | Use the project name from system context; do not fall back to find or ls |
XcodeRead <project-org-path> fails for a config-type file (.entitlements, .xcsettings, .xcconfig) | Some on-disk artifacts aren't navigable via project paths | Translate to filesystem absolute path using the project root from system context, then use Read / Edit |
Read the system prompt context. It contains:
Do not call ls, find, or any filesystem tool to re-discover this information.
Before starting Phase 1:
Workflow: - Phase 1: Analyze project and existing settings - Phase 2: Apply settings - Step 1: Enhanced Security - Step 2: Basic Clang safety warnings - Phase 3: Inquire about disabled settings - Phase 4: Validate applied settings - Phase 5: Report and update decision document - Phase 6: Optional follow-ups
TaskCreate with the same items so verbose users get a tracker.When entering each phase or sub-step:
in_progress.When finishing each phase or sub-step:
completed.Phase 6 starts as a single task and a single line. When the user opts into a specific follow-up, print "▶ Phase 6 / <name>" at start and "✓ Phase 6 / <name>" at end, and create/update the corresponding sub-task.
No user interaction. Gather facts silently. Prefer XcodeGlob, XcodeGrep, and XcodeRead over Bash equivalents when available (see Tool Preferences).
.xcodeproj or .xcworkspace via XcodeGlob (**/*.xcodeproj) or Glob.**/xcode-security-settings.md) via XcodeGlob or Glob. If found, read it and extract: languages and all prior setting decisions with their statuses and rationale. This informs subsequent phases.**/*.c → C**/*.cpp, **/*.cxx, **/*.cc → C++**/*.m → Objective-C**/*.mm → Objective-C++**/*.swift → SwiftSDKROOT / SUPPORTED_PLATFORMS), and resolve CODE_SIGN_ENTITLEMENTS to the on-disk .entitlements path (per configuration if it varies). Phase 2 Step 1 needs this map. When using GetTargetBuildSettings, see references/reading-build-settings.md for the output schema and the recipe for handling large results.Apply settings progressively, from most applicable to least.
Check existing security settings. Grep pbxproj and xcconfig files for settings from the catalog (see references/settings-and-entitlements-catalog.md). Only apply settings that aren't already set. If everything is already enabled, tell the user and stop.
How to apply build settings:
UpdateTargetBuildSetting for target-level settings and UpdateProjectBuildSetting for project-level settings..xcconfig file, edit the xcconfig. Otherwise, use the Xcode build setting tools. Never introduce a new configuration method.Prefer project-level when possible (less duplication). Fall back to target-level via UpdateTargetBuildSetting when the project doesn't use xcconfig.
Exception — `ENABLE_ENHANCED_SECURITY`: Must be set at project level. If the project uses xcconfig, set it there. Otherwise, use UpdateProjectBuildSetting.
#### Step 1: Enhanced Security — Audit entitlements + build settings, then propose per-target diffs
Read references/enhanced-security.md for the full key list, defaults, deprecated keys, version migration, and the supported product-type list. For details on individual sub-options, see:
references/pointer-authentication.md — arm64e pointer signingreferences/typed-allocators.md — type-aware memory allocationreferences/stack-zero-init.md — automatic stack variable zeroingreferences/readonly-platform-memory.md — dyld state protectionreferences/runtime-restrictions.md — dylib and Mach message restrictionsreferences/security-compiler-warnings.md — security-focused compiler warningsreferences/cpp-hardening.md — C++ stdlib hardening and bounds checkingreferences/hardware-memory-tagging.md — ARM MTEreferences/enhanced-security.md. Remaining targets are "supported targets." Note: DriverKit targets are supported for build settings only — skip entitlement changes for them.ENABLE_ENHANCED_SECURITY and ENABLE_POINTER_AUTHENTICATION (check target-level, then project-level inherited). For non-DriverKit targets, also read the entitlements file and collect every key under com.apple.security.hardened-process*, including the deprecated keys. Compare against the required + default-ON keys in references/enhanced-security.md Part B and bucket each target:ENABLE_ENHANCED_SECURITY is YES, but missing default-ON sub-options, or has deprecated keys, or version "1" / deprecated version key present.ENABLE_ENHANCED_SECURITY is absent..entitlements file yet. If the user confirms applying, one will be created (see Step 5).IMPORTANT Do not enable pointer authentication if the project has any binary dependencies (such as frameworks, xcframeworks, Swift Packages) that are not in this project from source. If the project does have such dependencies, list them and recommend that the user reach out to the vendor of the dependencies for a Universal binary that includes both arm64 and arm64e.
com.apple.security.hardened-process, ...enhanced-security-version-string = "2") and missing default-ON sub-options (hardened-heap, dyld-ro, platform-restrictions-string = "2")....platform-restrictions, ...enhanced-security-version)."1" → "2" if present.If a supported target has no `.entitlements` file, include creating one and wiring CODE_SIGN_ENTITLEMENTS in the change set.
Build settings: Follow "How to apply build settings" above. If the project uses xcconfig, set ENABLE_ENHANCED_SECURITY = YES at project level there. Otherwise, use UpdateProjectBuildSetting.
Because a project-level ENABLE_ENHANCED_SECURITY = YES cascades ENABLE_POINTER_AUTHENTICATION = YES to every target, pre-write a target-level ENABLE_POINTER_AUTHENTICATION = NO override on each target whose platform doesn't support arm64e (detect via SDKROOT / SUPPORTED_PLATFORMS). Skip if the target already has an explicit target-level value.
Do not auto-enable default-OFF sub-options (MTE family); report state and offer enablement in step 6 below.
Then print a short summary of the benefits of enabling Enhanced Security in terms of the security protections it provides and code changes it may require.
Then ask once via AskUserQuestion: "Apply the Enhanced Security changes above?" Offer "Apply all", "Apply to a subset (choose targets)", "Skip Enhanced Security".
ENABLE_POINTER_AUTHENTICATION = NO overrides on non-arm64e-platform targets via UpdateTargetBuildSetting. Skip targets where the user already has an explicit target-level value..entitlements plists directly — add required + default-ON keys, remove deprecated keys, migrate version-string "1" → "2" atomically..entitlements file, create one and wire CODE_SIGN_ENTITLEMENTS to it.Report: "Enabled Enhanced Security on N target(s). Removed M deprecated entitlement(s). Upgraded version string to 2 on K target(s). Added arm64e override on T non-arm64e-platform target(s)."
SUPPORTED_PLATFORMS (or SDKROOT) is macosx, iphoneos / iphonesimulator, or xros / xrsimulator. (Hardware backing is M5-class Apple silicon and later; tvOS, watchOS, and DriverKit targets are not supported.) Skip this step if Enhanced Security was not applied or if no modified target matches one of those platforms. Otherwise ask via AskUserQuestion: "Hardware memory tagging is available via com.apple.security.hardened-process.checked-allocations. Do you want to enable it?" If yes → read references/hardware-memory-tagging.md and apply it.#### Step 2: Basic Clang Safety Warnings
For codebases with C, C++, Objective-C, and Objective-C++, apply without asking. For pure Swift codebases, skip this step. Skip settings already enabled. Unless annotated otherwise, all settings below apply to 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++ only)CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YESCLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YESCLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YESReport briefly: "Enabled additional compiler warnings."
Grep pbxproj and xcconfig files for any build setting from references/settings-and-entitlements-catalog.md that is explicitly set to NO. Exclude ENABLE_POINTER_AUTHENTICATION = NO on targets whose platform doesn't support arm64e (the skill itself sets it there). Do flag ENABLE_POINTER_AUTHENTICATION = NO on arm64e-capable targets — that's a deliberate opt-out worth inquiring about. If no other disabled settings are found, skip this phase. Only consider settings relevant to the languages detected in Phase 1 — see the Scope column in the catalog.
For each disabled setting found, check whether it has an entry in the decision document with status Disabled and a rationale.
If there is a documented rationale in the decision document, note it in the report and move on. The rationale documents a prior decision that can be re-audited later.
If there is no entry in the decision document, ask the user:
"I found CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND explicitly set to NO with no explanation. Is there a reason for this?"If the user provides a reason, accept it and record the rationale in the decision document so future audits can re-evaluate it. If no reason, recommend re-enabling.
This also applies to any setting the skill would normally enable, such as ENABLE_ENHANCED_SECURITY. If any is already explicitly set to NO, follow the same decision-document-check-then-inquire flow.
For each target modified in Phase 2, use GetTargetBuildSettings to verify that every build setting applied appears with the expected value. If a setting is missing or has an unexpected value, flag it in the report as potentially unsupported by the current Xcode version. See references/reading-build-settings.md for the output schema and the recipe for handling large results.
Produce a lean summary:
Decision document. Read references/decision-document.md and follow it to create or update the decision document.
Offer these one at a time, in order. Each is a separate yes/no question — do not combine them into a single multi-choice prompt. For recommended adoption order and a decision matrix based on language mix, see references/adoption-strategy.md.
AskUserQuestion: "There are additional diagnostic settings that could find more issues but may also produce false positives. Want to enable them?" If yes → read references/additional-settings.md and follow it.ENABLE_C_BOUNDS_SAFETY? It's an annotation-based programming model for C bounds safety — invoke Xcode's bounds-safety skill to get started." For C++ projects, ask: "Want to look into adopting ENABLE_CPLUSPLUS_BOUNDS_SAFE_BUFFERS? It enables C++ bounds-safe buffer patterns — invoke Xcode's bounds-safety skill to get started."= NO lacks a documented rationale) and the decision document location (first creation only).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.