用途
该技能用于测试应用安全是否满足 OWASP Top 10 (2025) 的要求,并通过自动化的 CI 工具链把安全测试纳入持续集成流程,而不是仅在发布前或季度性渗透测试中进行。它面向 Web 应用与 API 的安全测试,也覆盖嵌入了 LLM 的应用(聊天机器人、RAG、智能体、copilot)的特有失败模式。
发现与前置问题
技能首先建议检查 .agents/qa-project-context.md,若存在则直接采用其中已确认的信息(认证机制、合规要求、基础设施),跳过重复询问。随后需要明确:威胁模型(关键资产、威胁角色、攻击面)、认证机制(会话 Cookie、JWT、OAuth 2.0/OIDC、API Key 或 MFA)、合规要求(SOC 2、HIPAA、PCI DSS、GDPR)、已有安全工具(OSV-Scanner、Snyk、Dependabot、Semgrep、ZAP)、API 形态(REST、GraphQL、gRPC)、部署模型(云、容器、Serverless)。
核心原则
- 安全是持续行为而非阶段性工作:扫描在每个 PR 的 CI 中运行,早发现成本远低于生产环境发现。
- OWASP Top 10 是底线而非上限,领域特定威胁需要额外分析。
- 纵深防御:单一工具无法覆盖全部,需叠加 DAST + SCA + SAST + 认证测试 + 密钥扫描。
- 左移:SAST 与密钥扫描在提交时、依赖与供应链检查在 PR 时、DAST 在预发环境、认证测试每次运行。
- 测试攻击者而非用户:负向路径本身就是测试内容。
OWASP Top 10 (2025) 检查清单
2025 版相对 2021 版的变动:新增 A03 软件供应链失效(替代“易受攻击和过时的组件”)、新增 A10 异常条件处理不当、A02 安全配置错误上移、A07 认证失效改名、A09 安全日志与告警失效改名;SSRF 不再是独立项,其测试归入 A01 与 A06。
- A01 访问控制失效:IDOR、函数级访问控制缺失、路径遍历、CORS 配置错误、SSRF。
- A02 安全配置错误:生产环境关闭堆栈跟踪、修改默认凭据、禁用多余 HTTP 方法、关闭目录列表、管理面板不公开、云存储桶不公开。
- A03 软件供应链失效:提交 lockfile 并用其安装(npm ci,而非 npm install)、生成并存档 SBOM、构件来源证明、每个 PR 做依赖审查、CI 密钥不暴露给 fork、自托管 Runner 与不可信 PR 代码隔离。
- A04 加密失效:TLS 版本/密码套件/HSTS、使用 bcrypt/argon2 哈希密码、敏感数据不进 URL/日志/错误、Cookie 带 Secure/HttpOnly/SameSite、安全响应头。
- A05 注入:SQL 注入、XSS(反射/存储/DOM)、状态变更操作的 CSRF、命令注入。
- A06 不安全设计:认证端点限流、业务逻辑滥用、账户锁定、任何抓取用户 URL 的功能采用允许列表。
- A07 认证失效:登录后会话轮换、过期/alg:none JWT 拒绝、RBAC 矩阵、OAuth state 篡改。
- A08 软件或数据完整性失效:CDN 脚本的 SRI、CSP 响应头且不含 unsafe-inline / unsafe-eval。
- A09 安全日志与告警失效:失败登录被记录且超阈值告警、管理员操作审计并告警非常规时段事件、日志不含密钥/PII、告警链路本身受监控。
- A10 异常条件处理不当:错误响应不泄露堆栈/框架/数据库结构、认证默认拒绝(fail closed)、超时与部分失败不绕过授权、错误路径资源清理、模糊测试各端点并验证错误契约。
OWASP LLM Top 10 (2025)
若应用嵌入 LLM,需使用 OWASP Gen AI Security Project 的独立清单:LLM01 提示注入、LLM02 敏感信息泄露、LLM03 供应链、LLM04 数据与模型投毒、LLM05 不当输出处理、LLM06 过度代理、LLM07 系统提示泄露、LLM08 向量与嵌入弱点、LLM09 错误信息、LLM10 无界消耗。其中 LLM01 与 LLM02 的深度行为覆盖(间接注入、注入检测器、敏感性测试、越狱红队)交由 ai-system-testing 技能;本技能只提供 CI 门禁视角。LLM05 与经典 Top 10 的 A05 注入相衔接:应将 LLM 输出视为不可信输入并重新执行注入检查。
自动化安全扫描
完整流水线分层:
- OWASP ZAP (DAST):每个 PR 对预发环境做基线扫描,API 用 zap-api-scan.py。ZAP MCP Server 可让编码智能体驱动爬虫、主动扫描与告警分析。
- 依赖/供应链:OSV-Scanner 作为默认门禁,多语言支持且发现漏洞时以非零退出;配合 SBOM (Syft) 与来源证明 (cosign / attest-build-provenance) 满足 A03。npm audit 仅作粗略快速检查,不作为门禁。
- SAST:Semgrep p/owasp-top-ten 作为门禁;eslint-plugin-security 作为较弱的二级信号(规则约 13 条,2020 年以来无实质增长,漏报率较高),只作提示不作为覆盖。ESLint 10 移除了 .eslintrc,只支持 flat config。
- 密钥扫描:TruffleHog 加 --only-verified,git-secrets 做 pre-commit。
认证测试模式
覆盖会话管理、JWT(过期、alg:none 混淆、错误密钥签名)、RBAC 矩阵测试,以及登录后会话轮换(会话固定)和 OAuth state 参数篡改。完整代码见 references/auth-tests.md。
CI 集成
五层各有对应 CI 步骤:密钥扫描(TruffleHog --only-verified)、依赖检查(OSV-Scanner,发现漏洞即失败,SBOM 与来源证明服务 A03)、SAST(Semgrep 门禁,ESLint 插件为弱二级)、DAST(ZAP 基线扫描预发 URL)、自定义认证测试(npx playwright test --project=security)。若以 npm audit 作为门禁,需解析 npm audit --json 并在 high/critical 数量大于 0 时退出 1,因其自身不可靠地非零退出。
反模式
安全测试只在发布前做;依赖单一工具;把近乎失效的 linter 当作 SAST 覆盖;忽略依赖告警;只测正常认证路径;在测试文件中硬编码密钥;跳过 SSRF 测试;在多种状态码都合法时只断言单一状态(应使用 expect([400, 403, 422]).toContain(...),toBeOneOf 并非内置匹配器);只测已知 payload。
验证
需证明断言确实会触发:将一个负向路径测试指向故意存在漏洞的目标并确认其失败,例如本地运行 OWASP Juice Shop(docker run --rm -p 3000:3000 bkimminich/juice-shop)后以 BASE_URL=http://localhost:3000 npx playwright test --project=security 运行;确认匹配器写法(grep -r "toBeOneOf" tests/ 应无结果);通过植入已知漏洞依赖确认门禁非零退出。
完成标准
提交 owasp-coverage.md(或 CI 作业断言其存在),将每个 OWASP 2025 类别映射到至少一个带标签测试或记录的“已缓解/接受风险”条目;OSV-Scanner 在 CI 中对 high/critical 非零退出;Semgrep p/owasp-top-ten 在主分支零未解决发现;ZAP 基线扫描每次运行上传报告为 CI 构件(if: always());安全 Playwright 项目对预发退出 0 且对 Juice Shop 产生失败;认证/会话边界用例各有通过测试(CSRF 拒绝、过期令牌拒绝、alg:none 拒绝、登出会话失效、RBAC 角色提升阻止);测试文件中无真实密钥。
相关技能
ci-cd-integration 负责流水线阶段接线与部署门禁机制;compliance-testing 负责将安全控制映射到法规;ai-system-testing 负责产品自身 LLM 特性的深度 OWASP LLM Top 10 工作。
限制
该技能的介绍未提供具体收费、价格、平台支持范围或独立的效果数据;相关工具的具体版本与配置细节需参见其引用的 references/owasp-tests.md、references/auth-tests.md、references/scanning-and-ci.md,本介绍未展开。