security-check 是一个面向安全告警分诊的知识与策略技能,用于对 Dependabot、Snyk 等来源的安全告警进行分类、优先级排序并给出处置建议。它本身不打开 PR、不修改仓库;如需执行动作,应使用 /security-runner。
用途
该技能用于在运行 /security-runner 之前理解可能采取的动作;也适用于人工审查一批 Dependabot/Snyk 告警、将新仓库接入安全分诊流程,或与 entropy-check 一起作为每周 cron 任务,形成完整的健康信号。
主要能力
分类模型
优先级由两个维度决定:
- 维度一:严重性(来自 CVE/公告)——critical、high、medium、low。
- 维度二:可利用性(来自上下文)——network-reachable、dev-only、test-only。
- network-reachable:存在漏洞的包属于暴露在互联网上的运行时依赖。
- dev-only:该包是 devDependency 或构建工具,不会发布到生产环境。
- test-only:仅在测试中使用,从不在生产环境运行。
决策矩阵
| 严重性 | network-reachable | dev-only | test-only |
|---|---|---|---|
| critical | P0 — 立即修补 | P1 | P2 |
| high | P1 — 本周处理 | P2 | P2 |
| medium | P2 — 下批处理 | backlog | dismiss |
| low | backlog | dismiss | dismiss |
各优先级的动作
| 优先级 | 动作 | 标签 |
|---|---|---|
| P0 | 立即打开修复 PR;若无补丁则阻止部署 | security P0 |
| P1 | 本周打开修复 PR | security P1 |
| P2 | 通过 file-finding.sh 写入每周发现摘要,附升级路径;在月度周期中批量处理 | — |
| Backlog | 写入每周发现摘要,无紧迫性 | — |
| Dismiss | 通过 API 关闭并记录原因 | — |
自动补丁标准
仅当以下条件全部满足时,补丁才可安全自动合并(无需人工审查即打开 PR):
- 仅为补丁版本升级——例如 1.2.3 → 1.2.4。次版本或主版本升级需要人工审查。
- CVE 在该补丁中已修复——通过 GitHub 公告或 NVD 条目核实。
- 无破坏性变更——检查目标版本区间的包 CHANGELOG。
- CI 通过——更新不得破坏现有测试。
任一条件不满足,则合并前需要人工审查。
合并策略感知
关键:绝不在受限仓库上自动合并安全补丁。
在打开或合并任何 PR 之前,检查 crew.yml 中的 merge_strategy:
MERGE_STRATEGY=$(cat crew.yml 2>/dev/null | grep merge_strategy | head -1 | awk '{print $2}')
| merge_strategy | 动作 |
|---|---|
| auto-merge | CI 通过后,安全补丁可自动合并 |
| restricted | 打上 ready-to-merge 标签;由人工审查并手动合并 |
| (缺失/未知) | 视为 restricted——安全失败 |
受限仓库示例:Lexgo。如有疑问,一律视为 restricted。
可利用性检测
要判断网络可达性,检查 package.json(或等价文件):
# Node.js — 检查包位于 dependencies 还是 devDependencies
cat package.json | python3 -c "
import sys, json
pkg = json.load(sys.stdin)
print('runtime:', list(pkg.get('dependencies', {}).keys()))
print('dev:', list(pkg.get('devDependencies', {}).keys()))
"
# Ruby — 检查 Gemfile 分组
grep -A5 'group :development\|group :test' Gemfile
# Python — 检查包位于 requirements.txt 还是 requirements-dev.txt
diff <(cat requirements.txt 2>/dev/null) <(cat requirements-dev.txt 2>/dev/null)
如果告警中的包同时出现在运行时和开发依赖中,则归类为 network-reachable。
OpenSSF Scorecard 集成
归属:ossf/scorecard,由 OpenSSF 贡献者开发(Apache 2.0)。在构建自定义安全评级之前先运行它——scorecard 开箱即用覆盖 18 项安全检查。
运行 scorecard 以补充告警分诊,提供仓库级安全态势:
# 安装(一次性)
go install sigs.k8s.io/scorecard/v4@latest
# 对目标仓库运行
scorecard --repo github.com/{org}/{repo} --format json 2>/dev/null | \
jq '.checks[] | {name: .name, score: .score, reason: .reason}' | \
grep -E '"score": [0-7]' # 显示低分检查项
每项检查评分 0-10。需优先关注的检查项:
- Token-Permissions(< 7):工作流使用了过大的令牌权限范围。
- Branch-Protection(< 7):缺少分支规则。
- Dependency-Update-Tool(< 7):未配置 Dependabot 或 Renovate。
- Vulnerabilities(< 10):依赖中存在已知 CVE。
将 scorecard 输出纳入 entropy-check 评级——安全评分信号进入 D/F 等级桶。
Cron 集成
在 crew.yml 中添加每周自动分诊:
cron:
- schedule: "0 5 * * 1" # 每周一 05:00
task: "Weekly security triage: process open Dependabot/Snyk alerts on all active repos, open fix PRs for safe patches, create issues for breaking changes"
输出契约
对一批告警分类后,生成分诊摘要:
Security Triage: {org}/{repo}
Date: YYYY-MM-DD
Alerts scanned: N
P0 (patch now): X alerts
P1 (this week): Y alerts
P2 (batch next): Z alerts
Backlog: A alerts
Dismissed: B alerts
Action required:
- [CRITICAL][net-reachable] lodash@4.17.20 → CVE-2021-23337 — patch to 4.17.21 (safe, patch-only)
- [HIGH][dev-only] webpack@4.46.0 → CVE-2023-28154 — P2, no runtime exposure
使用方式
通过 npx 安装:
npx skills add fellowship-dev/dogfooded-skills/skills/ops/security-check
适用场景
- 在运行 /security-runner 之前,了解对仓库可预期的动作。
- 人工审查一批 Dependabot/Snyk 告警。
- 将新仓库接入安全分诊流程。
- 与 entropy-check 一起作为每周 cron 任务,形成完整健康信号。
相关技能
- /security-runner——执行分诊:打开 PR、创建 issue、通过 API 关闭告警。
- /entropy-check——文档/架构健康;scorecard 评分可纳入 entropy 评级。
- Dependabot 覆盖情况(是否配置了 Dependabot)是需直接检查的仓库设置;maintenance 技能已于 2026-09-14 退役。
- /deps-runner——处理非安全类依赖更新;遵循相同的 PR 模式。
限制
该技能为知识/策略技能,不打开 PR、不修改仓库;执行动作需配合 /security-runner。自动合并仅适用于满足全部自动补丁标准的补丁版本升级,且受限仓库(如 Lexgo)绝不自动合并。