用途
soia-safe-audit-fix-codebase 用于对一个完整代码库执行“先审计、后确认、再修复”的安全闭环。第一次运行只能读取和报告;修复阶段必须由客户在看到具体发现、文件、行为变化、测试与回滚方案后明确授权。即使客户第一句话写“审计并修复”,也必须完成第一阶段并停在确认门,不能在同一阶段直接修改代码。
典型需求包括:给一个代码路径做整体安全检查、判断某漏洞是否影响项目、修复审计发现、验证修复是否真实有效。
主要能力
客户想要整体安全检查时,技能读取仓库规则、架构、依赖、入口、权限边界和代码实现,输出项目安全概览、攻击面、Findings、证据与覆盖缺口。判断某漏洞是否影响项目时,对照依赖、版本、配置、部署方式和调用路径,给出命中/不命中/未知结论及证据链。修复审计发现时,先给修复批次预览,等待确认后逐条修复,输出精确文件范围、diff、测试与逐项状态。验证修复时,执行复现、直接测试、相关回归、重扫和独立复核,输出实际运行的命令、结果、未覆盖项和残余风险。
使用方式
至少提供代码库路径。可选提供:目标分支/提交、生产部署方式、技术栈、威胁重点、允许使用的本地扫描器、测试命令、报告保存位置和可接受的修复窗口。
示例提示:使用 soia-safe-audit-fix-codebase 审计 <repo-path>。第一阶段只读,给我整体报告和分批修复方案;我确认具体批次后再改代码和测试。
安装本技能及其同仓依赖:
npx skills add soia-team/soia-open-skills -g -a '*' -s soia-safe-audit-fix-codebase -y
依赖情况:soia-dev-fix-loop 为强依赖,缺失则审计可继续但修复阶段停止,不能手写简化版闭环;soia-dev-coding-protocol 为强依赖,缺失则修复阶段停止;soia-safe-track-vulnerability-intel 为可选增强,缺失仍可做代码审计但依赖情报覆盖标为降级;项目原生构建/测试工具强依赖于验证,只能报告未验证修复;SAST/SCA/SBOM 工具为可选增强,缺失时用原生依赖树、锁文件和人工审计降级并列出缺口。
本技能默认不需要私有配置,配置可放在 ~/.config/soia-skills/soia-open-skills/soia-safe/soia-safe-audit-fix-codebase/config.yml,或用环境变量 SOIA_SEC_AUDIT_CODEBASE_CONFIG_FILE 指定路径。不得在配置、报告或日志中保存 Token、私钥、Cookie、数据库连接串、源码正文或生产数据。
阶段 A:只读项目安全审计
- 冻结范围和现场:解析目标路径并确认是预期仓库,读取 AGENTS.md、贡献指南、安全策略、构建与测试说明,记录分支、commit 和未提交变更,不得清理、覆盖、暂存或修改客户改动;定义包含与不包含内容。
- 建立项目清单:运行只读盘点 python3 scripts/inventory_codebase.py <repo-path>,输出语言、清单文件、构建入口、容器/IaC 和测试线索,不读取或上传秘密内容。
- 建立攻击面和数据流:识别外部入口、信任边界、身份与权限、数据存储、外部调用、反序列化、文件处理、命令执行、后台任务、管理端和部署边界,优先审查高风险数据流。
- 审计依赖与已知漏洞:检查直接/传递依赖、锁文件、最终制品、容器镜像和 SBOM;依赖情报不可用时标记降级。依赖存在不等于可利用,将版本命中、调用可达、配置、部署方式和外部暴露分别列证据。
- 形成并对抗式复核 Findings:每条包含稳定编号、严重度和置信度、file:line 或制品位置、可观察的危险行为与攻击者前提、影响范围、最小安全复现或静态证据、修复方向与测试建议;报告前尝试推翻每条发现。
- 输出报告和修复预览后停止:输出管理摘要、架构与攻击面、Findings、依赖风险、覆盖缺口和修复批次,确认未修改代码、未运行改变状态的命令、客户已看到预览并等待确认。
阶段 A 结束时必须给出审计基线、Finding 表、修复批次和明确提问,要求客户确认一个或多个批次/编号。有效确认示例:确认修复批次 B1,包含 F-001、F-003;允许修改列出的 4 个文件并运行报告中的测试。如果代码、分支、commit、工作树或修复范围在确认后发生实质变化,原确认失效,需重新生成受影响批次并再次确认。
阶段 B:确认后的修复与验证
- 重新核对确认和基线,只处理客户确认的 Finding/批次,发现漂移时停止并刷新预览,保留无关改动。
- 建立安全复现,优先使用单元测试、集成 fixture、静态断言或本地 canary,不得在生产环境执行 PoC、端口扫描、爆破、真实命令执行、数据外传或破坏性验证。
- 调用修复闭环,把确认的 Findings 交给 soia-dev-fix-loop 并遵循 soia-dev-coding-protocol,逐条选择 fix/reject/defer,实施最小修复,搜索同类模式,禁止用 TODO、吞错、关闭规则、降低断言或删除测试伪装修复;范围扩大时先更新批次并重新确认。
- 分层验证,每个 fix 至少具备直接验证、正常路径、相关回归、重扫和独立复核;测试无法运行或回归成本未获授权时,结论只能是“部分验证”或“blocked”,不能称为测试通过。
- 交付修复回执,按 Finding 列出决策、代码变化、直接测试、回归、重扫、独立复核和残余风险,检查工作树确认未混入未授权文件。
提交、push、建 PR、合并、部署或发布都需要独立授权;“确认修复”只授权本地修改与预览中列出的测试。
私密信息与中间数据
审计默认全程本地运行,不把源码、制品、SBOM、路径、依赖清单或报告上传给第三方 AI/扫描服务。需要云端扫描器时须先说明发送字段、目标服务和保留策略并取得授权。报告默认留在会话,保存时使用客户选择的目录;中间数据使用 OS 临时目录并在成功或失败后清理。日志和报告对 Token、私钥、密码、连接串、Cookie、内部主机名、用户数据和绝对路径脱敏,证据只保留定位所需最小片段。
资源与验证
项目只读盘点脚本为 scripts/inventory_codebase.py;审计视角见 references/audit-checklist.md;报告结构见 references/report-contract.md;确认与授权见 references/confirmation-gate.md。
验证命令:
python3 scripts/inventory_codebase.py --self-test python3 scripts/inventory_codebase.py <repo-path> --pretty
真实前向测试使用临时 fixture 仓库,放入源码、manifest、测试、CI、容器文件、忽略目录和一个只按名称识别的秘密候选;运行盘点后核对目标树未变化、忽略目录未进入统计、秘密内容和绝对路径未出现在 JSON。不得为了测试本技能而对真实生产仓库进入阶段 B。技能自身还必须验证:阶段 A 前后目标仓库 diff/状态一致;阶段 B 只在有效确认后产生 diff;每条已修复 Finding 都有直接测试和至少一条独立复核证据。