关于 axiom-security
axiom-security 面向 Apple 平台应用开发者,涵盖钥匙串、加密、通行密钥、应用完整性、文件保护、Agent 安全和代码签名,并引导至专项资料或自动扫描。
主要功能
- 01钥匙串凭据存储指南
- 02CryptoKit 加密与签名参考
- 03通行密钥实现指南
- 04应用完整性与 Agent 安全
- 05文件保护与代码签名
- 06自动安全审计路由
适用场景
- 01将 API 令牌存入钥匙串
- 02选择加密或签名 API
- 03实现通行密钥登录
- 04诊断签名和配置描述文件错误
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-security安装后在 Claude Code 中输入/axiom-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
skills/agentic-security.mdapp-attest.mdcode-signing-diag.mdcode-signing-ref.mdcode-signing.mdcryptokit-ref.mdcryptokit.mdfile-protection-ref.mdkeychain-diag.mdkeychain-ref.mdkeychain.mdpasskeys.mdsecurity-privacy-scanner.md详细介绍
安全与凭据
任何涉及钥匙串、加密、通行密钥、应用完整性、Agentic/AI 功能安全、文件保护或代码签名的工作,都必须使用此技能。
无法启动 Axiom Agent? 如果此路由器指引你使用某个 Agent,请直接按照其中的步骤操作。通过 MCP,
axiom_get_agent会返回该 Agent;在其他环境中,请读取下方的文件,只需搜索和读取文件即可。此处可用:
skills/security-privacy-scanner.md。对于任何其他 Agent,通过 MCP 使用
axiom_get_agent也会返回该 Agent;使用axiom_xclog_*、axiom_xcsym_*和axiom_xcprof_*工具运行其 xclog、xcsym 和 xcprof 步骤。在其他环境中,请在 Axiom 的技能中搜索skills/<agent>.md;如果没有该文件,请使用本套件的技能自行完成相关工作,并使用PATH中的任意 Axiom 工具。
快速参考
| 症状 / 任务 | 参考 |
|---|---|
| 安全存储令牌、密码、API 密钥 | 参见 skills/keychain.md |
| 选择 kSecAttrAccessible 级别、生物识别保护 | 参见 skills/keychain.md |
| SecItem 函数签名、属性常量 | 参见 skills/keychain-ref.md |
| errSecDuplicateItem、errSecItemNotFound、errSecInteractionNotAllowed | 参见 skills/keychain-diag.md |
| 加密数据、签署载荷、密钥管理 | 参见 skills/cryptokit.md |
| 哈希函数、HMAC、AES-GCM、ChaChaPoly、ECDSA、EdDSA、密钥协商 | 参见 skills/cryptokit-ref.md |
| 通行密钥登录、WebAuthn、ASAuthorizationController | 参见 skills/passkeys.md |
凭据提供方 OS27 的一次性验证码自动填充 | 参见 skills/passkeys.md(Delivered Verification Codes) |
| 应用完整性验证、DCAppAttestService、防欺诈指标 | 参见 skills/app-attest.md |
| 提示注入、保护 AI Agent / Agentic 功能、工具确认 | 参见 skills/agentic-security.md |
| NSFileProtection 级别、静态数据保护 | 参见 skills/file-protection-ref.md |
| SensitiveContentAnalysis 判定结果绝不能离开设备(不得进入分析系统/审核队列/同步缓存;许可协议 §3.3.3) | 参见 axiom-vision(skills/vision-ref.md) |
| 证书管理、配置描述文件、CI/CD 签名 | 参见 skills/code-signing.md |
| 未找到证书、配置描述文件不匹配、权限错误 | 参见 skills/code-signing-diag.md |
| 证书 CLI、配置描述文件检查、权限提取 | 参见 skills/code-signing-ref.md |
| Apple Pay 支付证书 / 通行证类型证书 / Tap to Pay 权限 | 参见 axiom-payments 套件 |
决策树
digraph security {
start [label="Security task" shape=ellipse];
what [label="What do you need?" shape=diamond];
start -> what;
what -> "skills/keychain.md" [label="store/retrieve\ncredentials, tokens,\nsecrets"];
what -> "skills/keychain-ref.md" [label="SecItem API syntax,\nattribute constants,\naccess levels"];
what -> "skills/keychain-diag.md" [label="keychain errors\n(errSec codes)"];
what -> "skills/cryptokit.md" [label="encrypt data,\nsign payloads,\nSecure Enclave keys"];
what -> "skills/cryptokit-ref.md" [label="CryptoKit API\n(AES, ECDSA, HPKE,\npost-quantum)"];
what -> "skills/passkeys.md" [label="passkey sign-in,\nreplace passwords"];
what -> "skills/app-attest.md" [label="app integrity,\nfraud prevention"];
what -> "skills/agentic-security.md" [label="AI agent security,\nprompt injection"];
what -> "skills/file-protection-ref.md" [label="file encryption,\nNSFileProtection"];
what -> "skills/code-signing.md" [label="set up signing,\nprofiles, CI/CD"];
what -> "skills/code-signing-diag.md" [label="signing errors,\nupload rejections"];
what -> "skills/code-signing-ref.md" [label="CLI commands,\nprofile inspection"];
}
- 安全存储令牌、密码、API 密钥?→
skills/keychain.md1a. 需要 SecItem 函数签名、属性常量?→skills/keychain-ref.md1b. 钥匙串错误(errSecDuplicateItem、errSecItemNotFound)?→skills/keychain-diag.md - 加密数据、签署载荷、管理密钥?→
skills/cryptokit.md2a. 需要 CryptoKit API 详情(AES-GCM、ECDSA、HPKE、后量子密码)?→skills/cryptokit-ref.md - 实现通行密钥登录、替代密码?→
skills/passkeys.md - 验证应用完整性、防止欺诈?→
skills/app-attest.md - 保护 Agentic/AI 功能(提示注入、工具确认、锁屏意图)?→
skills/agentic-security.md - 静态文件加密、NSFileProtection 级别?→
skills/file-protection-ref.md - 设置代码签名、管理证书、CI/CD?→
skills/code-signing.md7a. 代码签名错误排查?→skills/code-signing-diag.md7b. 证书 CLI 命令、配置描述文件检查?→skills/code-signing-ref.md - 签名后构建/上传失败?→ 参见 axiom-build
- 准备 App Store 提交?→
/skill axiom-shipping - 隐私清单、跟踪透明度?→ 参见 axiom-integration
- 数据持久化(SwiftData、Core Data、存储策略)?→
/skill axiom-data - TLS 配置、网络请求的证书固定?→
/skill axiom-networking - 想要自动化安全扫描?→ security-privacy-scanner(Agent)
冲突处理
security 与 axiom-build:当构建因签名错误而失败时:
- 代码签名错误(证书、配置文件、授权)→ 使用 security
- 环境问题(Xcode 版本、模拟器、Derived Data)→ 使用 axiom-build
- 如果不确定,请检查错误消息:
CODESIGN、ITMS-90xxx、errSec→ 使用 security
security 与 shipping:准备提交 App Store 时:
- 隐私清单、提交检查清单、拒绝原因 → 使用 shipping
- 用于分发的代码签名、证书管理 → 使用 security
security 与 axiom-data:存储敏感数据时:
- 令牌、密码、API 密钥 → 使用 security(钥匙串)
- 用户偏好设置、非敏感设置 → 使用 axiom-data(UserDefaults/SwiftData)
- 数据库文件的文件加密级别 → 使用 security(file-protection-ref)
- SQLite 专用数据保护(
.db/-wal/-shm三件套、设备锁定时的小组件访问)→ 参见 axiom-data (skills/grdb-app-groups.md) §4
security 与 axiom-networking:保护网络通信时:
- TLS 配置、证书固定 → 使用 axiom-networking
- 对 API 请求签名、加密负载 → 使用 security(CryptoKit)
关键模式
Keychain(skills/keychain.md):
- SecItem 心智模型:唯一性约束、数据保护类别
- 生物识别访问控制(Face ID / Touch ID)
- App 与扩展之间的 Keychain 共享
- 后台访问陷阱、Mac Keychain 差异
- 将敏感数据从 UserDefaults/@AppStorage 迁移过来
Keychain API(skills/keychain-ref.md):
- SecItemAdd/CopyMatching/Update/Delete 签名
- 项目类别属性、唯一性约束规则
- kSecAttrAccessible 级别及其适用场景
- 访问控制标志、生物识别集成
- 完整错误代码参考
Keychain 诊断(skills/keychain-diag.md):
- 因意外的唯一性约束导致 errSecDuplicateItem
- 项目实际存在却提示 errSecItemNotFound(查询不匹配)
- 在后台上下文中出现 errSecInteractionNotAllowed
- 访问组和授权不匹配
- App 更新后项目消失
CryptoKit(skills/cryptokit.md):
- AES-GCM 和 ChaChaPoly 认证加密
- ECDSA/EdDSA 数字签名
- Secure Enclave 硬件支持的密钥
- 用于端到端加密的密钥协商(ECDH)
- 面向现代非对称加密的 HPKE
- 后量子算法(ML-KEM、ML-DSA)
- CommonCrypto 迁移路径
CryptoKit API(skills/cryptokit-ref.md):
- 哈希函数(SHA-256/384/512、SHA-3)、HMAC
- 对称加密(AES-GCM、ChaChaPoly)
- 非对称签名(P256、P384、P521、Curve25519、Ed25519)
- 密钥协商、密钥派生(HKDF)
- Secure Enclave 密钥的创建和使用
- Swift Crypto 跨平台对等支持
Passkeys(skills/passkeys.md):
- ASAuthorizationController 注册和断言流程
- AutoFill 辅助请求(QuickType 栏集成)
- 为现有用户自动升级 Passkey(iOS 18+)
- 组合凭据请求(Passkey + 密码 + 使用 Apple 登录)
- WebAuthn 的关联域配置
App Attest(skills/app-attest.md):
- DCAppAttestService 证明和断言流程
- 在服务端验证证明对象
- 从第 27 个周期开始支持 macOS + 防篡改信号(扩展、密钥访问控制)
- 将欺诈指标作为调查信号
- 每台设备 2 位状态的 DeviceCheck
- 面向大量安装用户的渐进式推出策略
- 妥善处理不受支持的设备
Agentic Security(skills/agentic-security.md):
- 对 Agentic 功能进行威胁建模(间接提示词注入、致命三重奏)
- 确定性与概率性缓解措施(脱敏、重点标记、确认、解锁门控)
- Foundation Models 生命周期修饰符(.onToolCall 确认、.historyTransform)
- App Intents authenticationPolicy 和架构风险元数据
文件保护(skills/file-protection-ref.md):
- NSFileProtection 级别(complete、completeUnlessOpen、afterFirstUnlock、none)
- 与设备密码关联的硬件加速加密
- 后台文件访问要求
- Keychain 与文件保护对比
代码签名(skills/code-signing.md):
- 自动签名与手动签名的权衡
- 跨团队管理证书和配置描述文件
- 使用 fastlane match 在团队范围内共享证书
- CI/CD 签名设置(GitHub Actions、Xcode Cloud)
- 分发构建准备(App Store、TestFlight、Ad Hoc)
代码签名诊断(skills/code-signing-diag.md):
- 证书问题(过期、缺失、类型错误、已撤销)
- 配置描述文件问题(过期、缺少证书、App ID 错误)
- 授权不匹配(Xcode 中启用了功能,但配置描述文件中没有)
- CI 中的 Keychain 问题(Keychain 已锁定、errSecInternalComponent)
- 归档/导出失败(导出方式错误、证书类型错误)
代码签名命令行工具(skills/code-signing-ref.md):
- 使用
security find-identity、security cms -D检查配置描述文件 - 使用
codesign -d --entitlements提取授权 - 证书类型、有效期、每个账户的限制
- fastlane match 命令和 Keychain 管理
自动扫描
安全审计 → 启动 security-privacy-scanner Agent(扫描硬编码凭据、不安全的令牌存储、Privacy Manifest 覆盖缺口、ATS 违规、缺失的 ATT 描述、缺失的出口合规信息、薄弱的 Keychain ACL,以及复合拒绝风险;并将安全态势评为 HARDENED/GAPS/VULNERABLE)
反合理化
| 想法 | 现实 |
|---|---|
| "我先把令牌存到 UserDefaults 里" | 任何具有文件访问权限的进程都能读取 UserDefaults 的 plist 文件。用 Keychain 只需 10 行代码。skills/keychain.md 展示了这种模式。 |
| "我的应用不需要加密" | 只要你在静态存储中保存任何用户数据,iOS 文件保护就是现成可用的。skills/file-protection-ref.md 介绍了各种保护级别。 |
| "CommonCrypto 用起来没问题,不必迁移" | CommonCrypto 是 C API,需要手动管理内存,也不提供编译时安全保障。CryptoKit 可防止缓冲区溢出和密钥误用。 |
| "我就用自动签名" | 自动签名在 CI、团队规模扩大或功能变更导致问题之前都能正常工作。趁还不需要之前,先了解手动签名。skills/code-signing.md 介绍了两种方式。 |
| "Passkey 还太新,密码够用了" | Passkey 能抵御网络钓鱼,并从 iOS 16 起受支持。迁移方案支持两者同时使用。skills/passkeys.md 展示了组合流程。 |
| "我重新生成所有证书就能解决这个问题" | 重新生成会撤销现有证书,并导致每位队友的构建失败。先诊断问题。skills/code-signing-diag.md 提供了诊断流程。 |
| "App Attest 对我的应用来说太过了" | 如果你的应用有任何由服务器验证的购买、促销或竞争性功能,被篡改的客户端就会利用它。skills/app-attest.md 介绍了渐进式部署。 |
| "我会在加密包装器上使用 @unchecked Sendable" | 在安全代码中向编译器隐瞒线程安全问题,就会导致数据损坏。参见 axiom-concurrency,了解安全模式。 |
| "kSecAttrAccessibleAlways 没问题" | 自 iOS 12 起已弃用。即使设备处于锁定状态,项目仍可访问,而且备份时不会加密。至少应使用 kSecAttrAccessibleAfterFirstUnlock。 |
| "提示词注入不会影响我们这个小 AI 功能" | 任何传入模型的外部内容(例如日历邀请或动态帖子)都是攻击面,而模型会选择执行哪些操作。skills/agentic-security.md 介绍了威胁模型和确定性缓解措施。 |
示例调用
用户:"如何安全地存储身份验证令牌?"
→ 阅读:skills/keychain.md
用户:"保存到 keychain 时出现 errSecDuplicateItem"
→ 阅读:skills/keychain-diag.md
用户:"SecItem 属性常量有哪些?"
→ 阅读:skills/keychain-ref.md
用户:"如何用 AES 加密用户数据?"
→ 阅读:skills/cryptokit.md
用户:"CryptoKit 的 ECDSA 签名 API 是什么?"
→ 阅读:skills/cryptokit-ref.md
用户:"如何在应用中添加 passkey 登录?"
→ 阅读:skills/passkeys.md
用户:"如何验证我的应用没有被篡改?"
→ 阅读:skills/app-attest.md
用户:"如何保护应用的 AI Agent 免受提示词注入?"
→ 阅读:skills/agentic-security.md
用户:"我的 Siri 意图应该能否在锁屏界面使用?"
→ 阅读:skills/agentic-security.md
用户:"我应该使用哪种 NSFileProtection 级别?"
→ 阅读:skills/file-protection-ref.md
用户:"构建失败,并显示 'No signing certificate found'"
→ 阅读:skills/code-signing-diag.md
用户:"如何为 CI 配置 fastlane match?"
→ 阅读:skills/code-signing.md
用户:"如何检查配置描述文件?"
→ 阅读:skills/code-signing-ref.md
用户:"扫描我的代码,查找安全问题"
→ 调用:security-privacy-scanner Agent