GUNGNIR - DSH 红队战役指挥框架:攻击路径合成的工程化。事实库+门闸+跳板池,执行层可插拔。编排层,不含漏洞利用代码;仅限授权测试。
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 86cloudyun-afk/dsh-gungnir该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · security
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 25 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包warroom @ 0.2.0
✓Node 引擎要求 >=22.13 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 21:23:11
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 105 处,展示前 89 条)
- 执行外部命令来自配置/变量executors/dsh-plugin-cmd.example.mjs:25
execFile(cmd, args, { timeout: timeoutMs, maxBuffer: 16 * 1024 * 1024 }, (err, stdout, stderr) => { - 执行外部命令来自配置/变量executors/dsh-redteam-executor.mjs:18
const child = execFile(cmd, args, { timeout: timeoutMs, maxBuffer: 8 * 1024 * 1024 }, (err, stdout, stderr) => { - 执行外部命令固定命令executors/tool-runner.mjs:118
const pids = spawnSync('pgrep', ['-g', String(pgid)], { encoding: 'utf8', timeout: 5_000 }).stdout ?? ''; - 执行外部命令固定命令executors/tool-runner.mjs:121
const ps = spawnSync('ps', ['-o', 'pid=,args=', '-p', list.join(',')], { encoding: 'utf8', timeout: 5_000 }).stdout ?? ''; - 读取本地文件executors/tool-runner.mjs:152
const body = envFile && existsSync(envFile) - 写入本地文件executors/tool-runner.mjs:158
mkdirSync(dir, { recursive: true }); - 执行外部命令固定命令executors/tool-runner.mjs:168
const r = spawnSync('bash', ['-c', script], { - 读取本地文件executors/tool-runner.mjs:176
const readOut = (f) => { try { return readFileSync(f, 'utf8'); } catch { return ''; } }; - 读取本地文件packages/warroom-core/src/aggregate.js:10
if (!path || !existsSync(path)) return null; - 读取本地文件packages/warroom-core/src/aggregate.js:33
if (existsSync(engDir)) { - 读取本地文件packages/warroom-core/src/aggregate.js:34
for (const id of readdirSync(engDir)) { - 读取本地文件packages/warroom-core/src/aggregate.js:36
if (!existsSync(dbPath)) continue; - 读取本地文件packages/warroom-core/src/broker.js:586
const markdown = readFileSync(exported.paths.markdown ?? exported.path, 'utf8'); - 写入本地文件packages/warroom-core/src/broker.js:682
mkdirSync(dir, { recursive: true }); - 写入本地文件packages/warroom-core/src/broker.js:684
writeFileSync(path, renderChecklist(c) + '\n', 'utf8'); - 读取本地文件packages/warroom-core/src/broker.js:713
return readdirSync(dir).filter((n) => existsSync(join(dir, n, 'fact.db'))); - 读取本地文件packages/warroom-core/src/broker.js:713
return readdirSync(dir).filter((n) => existsSync(join(dir, n, 'fact.db'))); - 写入本地文件packages/warroom-core/src/broker.js:1062
mkdirSync(dir, { recursive: true }); - 读取本地文件packages/warroom-core/src/checklist.js:75
const reports = existsSync(reportsRoot) - 读取本地文件packages/warroom-core/src/checklist.js:76
? readdirSync(reportsRoot).filter((f) => f.endsWith('.md')) - 读取本地文件packages/warroom-core/src/checklist.js:77
.map((f) => ({ f, m: statSync(join(reportsRoot, f)).mtimeMs })).sort((a, b) => b.m - a.m) - 读取本地文件packages/warroom-core/src/checklist.js:82
reproducible = verifyReportAgainstStore(readFileSync(join(reportsRoot, reports[0].f), 'utf8'), store).reproducible; - 读取本地文件packages/warroom-core/src/checklist.js:91
const indexFiles = existsSync(evidenceRoot) - 读取本地文件packages/warroom-core/src/checklist.js:92
? readdirSync(evidenceRoot).filter((f) => f === 'EVIDENCE_INDEX.md').length : 0; - 读取本地文件packages/warroom-core/src/config.js:30
if (!existsSync(path)) { - 读取本地文件packages/warroom-core/src/config.js:34
.map((f) => join(home, f)).filter((f) => existsSync(f)); - 读取本地文件packages/warroom-core/src/config.js:44
try { raw = JSON.parse(readFileSync(path, 'utf8')); } - 读取本地文件packages/warroom-core/src/config.js:68
if (existsSync(path) && !force) throw warroomError(ERR.E_GATE_MISSING_TUPLE, `已存在:${path}(用 --force 覆盖)`); - 写入本地文件packages/warroom-core/src/config.js:70
writeFileSync(path, JSON.stringify(cfg, null, 2) + '\n', 'utf8'); - 写入本地文件packages/warroom-core/src/db.js:135
mkdirSync(dir, { recursive: true }); - 写入本地文件packages/warroom-core/src/db.js:145
mkdirSync(home, { recursive: true }); - 执行外部命令固定命令packages/warroom-core/src/egress-probe.mjs:28
: spawnSync('curl', args, { encoding: 'utf8', timeout: (timeoutSec + 3) * 1000, env: clean }); - 写入本地文件packages/warroom-core/src/evidence.js:24
mkdirSync(dir, { recursive: true }); - 写入本地文件packages/warroom-core/src/evidence.js:98
writeFileSync(checklistFile, renderChecklist(c) + '\n', 'utf8'); - 写入本地文件packages/warroom-core/src/evidence.js:108
writeFileSync(indexPath, index.join('\n'), 'utf8'); - 写入本地文件packages/warroom-core/src/evidence.js:109
writeFileSync(watermarkPath, JSON.stringify({ - 写入本地文件packages/warroom-core/src/knowledge.js:36
mkdirSync(home, { recursive: true }); - 读取本地文件packages/warroom-core/src/maintenance.js:9
if (depth > 4 || !existsSync(root)) return out; - 读取本地文件packages/warroom-core/src/maintenance.js:10
for (const name of readdirSync(root)) { - 读取本地文件packages/warroom-core/src/maintenance.js:12
const st = statSync(p); - 写入本地文件packages/warroom-core/src/maintenance.js:29
mkdirSync(destRoot, { recursive: true }); - 写入本地文件packages/warroom-core/src/maintenance.js:35
mkdirSync(join(target, '..'), { recursive: true }); - 删除本地文件packages/warroom-core/src/maintenance.js:36
rmSync(target, { force: true }); - 读取本地文件packages/warroom-core/src/maintenance.js:55
const dirs = readdirSync(root) - 读取本地文件packages/warroom-core/src/maintenance.js:57
.filter((e) => { try { return statSync(e.path).isDirectory(); } catch { return false; } }) - 读取本地文件packages/warroom-core/src/maintenance.js:58
.map((e) => ({ ...e, mtime: statSync(e.path).mtimeMs })) - 删除本地文件递归packages/warroom-core/src/maintenance.js:61
rmSync(stale.path, { recursive: true, force: true }); - 写入本地文件packages/warroom-core/src/maintenance.js:102
mkdirSync(join(dst, '..'), { recursive: true }); - 写入本地文件packages/warroom-core/src/maintenance.js:103
copyFileSync(src, dst); - 写入本地文件packages/warroom-core/src/preflight.js:46
writeFileSync(probe, 'x'); - 删除本地文件packages/warroom-core/src/preflight.js:47
unlinkSync(probe); - 读取本地文件packages/warroom-core/src/preflight.js:107
if (!existsSync(backupsDir) || readdirSync(backupsDir).length === 0) { - 读取本地文件packages/warroom-core/src/preflight.js:107
if (!existsSync(backupsDir) || readdirSync(backupsDir).length === 0) { - 读取本地文件packages/warroom-core/src/preflight.js:110
const latest = readdirSync(backupsDir) - 读取本地文件packages/warroom-core/src/preflight.js:111
.map((n) => ({ n, m: statSync(join(backupsDir, n)).mtimeMs })) - 读取本地文件packages/warroom-core/src/preflight.js:119
if (existsSync(keyPath)) { - 读取本地文件packages/warroom-core/src/preflight.js:120
const mode = statSync(keyPath).mode & 0o777; - 执行外部命令固定命令packages/warroom-core/src/probes.js:30
const out = execFileSync('node', ['-e', script], { encoding: 'utf8', timeout: timeoutMs + 500 }); - 执行外部命令固定命令packages/warroom-core/src/probes.js:41
const out = execFileSync('docker', ['inspect', '-f', '{{.State.Running}}', String(id)], - 写入本地文件packages/warroom-core/src/report.js:511
mkdirSync(outDir, { recursive: true }); - 写入本地文件packages/warroom-core/src/report.js:539
writeFileSync(path, markdown, 'utf8'); - 写入本地文件packages/warroom-core/src/report.js:544
writeFileSync(path, renderHtml({ - 写入本地文件packages/warroom-core/src/report.js:556
writeFileSync(path, JSON.stringify(json, null, 2), 'utf8'); - 读取本地文件packages/warroom-core/src/report.js:596
return readFileSync(path, 'utf8'); - 写入本地文件packages/warroom-core/src/secrets.js:14
mkdirSync(path, { recursive: true, mode }); - 写入本地文件packages/warroom-core/src/secrets.js:15
chmodSync(path, mode); - 读取本地文件packages/warroom-core/src/secrets.js:20
if (!existsSync(path)) { - 写入本地文件packages/warroom-core/src/secrets.js:21
writeFileSync(path, randomBytes(32), { mode: 0o600 }); - 写入本地文件packages/warroom-core/src/secrets.js:23
chmodSync(path, 0o600); - 读取本地文件packages/warroom-core/src/secrets.js:24
const key = readFileSync(path); - 读取本地文件packages/warroom-core/src/secrets.js:32
if (!existsSync(p)) throw warroomError(ERR.E_SECRET_KEY_INVALID, `缺少历史密钥 ${keyId}(${p})——无法解密该条秘密`); - 写入本地文件packages/warroom-core/src/secrets.js:33
chmodSync(p, 0o600); - 读取本地文件packages/warroom-core/src/secrets.js:34
return readFileSync(p); - 写入本地文件packages/warroom-core/src/secrets.js:133
mkdirSync(join(this.root, KEYS_DIR), { recursive: true, mode: 0o700 }); - 读取本地文件packages/warroom-core/src/secrets.js:134
if (!existsSync(archived)) { - 读取本地文件packages/warroom-core/src/weekly.js:28
const reports = existsSync(reportsDir) - 读取本地文件packages/warroom-core/src/weekly.js:29
? readdirSync(reportsDir).filter((f) => f.endsWith('.md')) - 读取本地文件packages/warroom-core/src/weekly.js:30
.map((f) => ({ f, m: statSync(join(reportsDir, f)).mtimeMs })).sort((a, b) => b.m - a.m) - 写入本地文件packages/warroom-core/src/weekly.js:99
mkdirSync(dir, { recursive: true }); - 写入本地文件packages/warroom-core/src/weekly.js:102
writeFileSync(path, `${renderWeekly(w)}\n`, 'utf8'); - 读取本地文件packages/warroom-core/src/weekly.js:103
const existing = readdirSync(dir).filter((f) => f.endsWith('.md')).sort().reverse(); - 读取本地文件packages/warroom-dashboard/src/dsh-entry.mjs:136
return readFile(join(ROOT, asset[0])).then((body) => { - 读取本地文件packages/warroom-dashboard/src/server.js:38
const body = await readFile(join(ROOT, asset[0])); - 读取本地文件packages/warroom-dashboard/src/snapshot.js:14
if (!existsSync(paths.engagementsRoot)) return []; - 读取本地文件packages/warroom-dashboard/src/snapshot.js:16
try { directories = readdirSync(paths.engagementsRoot, { withFileTypes: true }); } - 读取本地文件packages/warroom-dashboard/src/snapshot.js:95
if (existsSync(globalPath)) assertRealPathWithin(base, globalPath, 'global.db'); - 读取本地文件packages/warroom-dashboard/src/snapshot.js:96
if (existsSync(engagementsRoot)) assertRealPathWithin(base, engagementsRoot, 'Engagement root'); - 读取本地文件packages/warroom-dashboard/src/snapshot.js:104
if (!existsSync(factPath)) { - 读取本地文件packages/warroom-plugin/src/dsh-entry.mjs:77
data = JSON.parse(readFileSync(config.preset, 'utf8'));
扫描于 2026/10/31(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 攻击路径合成
- 事实库与门闸
- 跳板池管理
README
由 DeepSeek 最新模型翻译生成DSH GUNGNIR(冈格尼尔)
永恒之枪,出手必中——攻击路径合成的工程化:把分散、隐蔽、看似无关的弱点,拼成一条到 shell 的完整链路。
DSH 红队战役指挥框架。100% 红队工具:仅限已获授权的攻防演练与渗透测试。
仓库只含编排层,不含任何漏洞利用代码。
状态
| 项 | 现状 |
| 版本 | v0.1.0(v0.1 冻结闭环达成:16 批次 / 134 PR;最终审计见 FINAL-AUDIT.md) |
| 测试 | 884 例登记用例;本次 Mac 安全离线复核计数见 ACCEPTANCE.md |
| CI 闸 | 六道本地闸(验收套件 / 工具 schema / 预设允许清单 / 故障矩阵 / 工具文档与看板契约同步 / 自审闸)+ 三个真跑 CI job:围栏真实容器(fence)、执行层跨进程演练(drill)、真实 DSH 挂载验收(native-host → HOST_VERIFIED) |
| 故障矩阵 | 21 场景(丢回包/乱序/写失败/残留/重启/撤销/备份恢复/密钥/配置/版本/迁移/路由/心跳/知识库/交付边界/门禁/确认边界/归档幂等/门禁同源) |
| 工具 | 36 个 warroom_(schema 严格校验;以 presets/warroom.preset.json 允许清单为准) |
展开完整文档(README 剩余 1 节)
DSH GUNGNIR(冈格尼尔) 永恒之枪,出手必中——攻击路径合成的工程化:把分散、隐蔽、看似无关的弱点,拼成一条到 shell 的完整链路。 DSH 红队战役指挥框架。100% 红队工具:仅限已获授权的攻防演练与渗透测试。 仓库只含编排层,不含任何漏洞利用代码。 状态 | 项 | 现状 | | 版本 | v0.1.0(v0.1 冻结闭环达成:16 批次 / 134 PR;最终审计见 FINAL-AUDIT.md) | | 测试 | 884 例登记用例;本次 Mac 安全离线复核计数见 ACCEPTANCE.md | | CI 闸 | 六道本地闸(验收套件 / 工具 schema / 预设允许清单 / 故障矩阵 / 工具文档与看板契约同步 / 自审闸)+ 三个真跑 CI job:围栏真实容器(fence)、执行层跨进程演练(drill)、真实 DSH 挂载验收(native-host → HOST_VERIFIED) | | 故障矩阵 | 21 场景(丢回包/乱序/写失败/残留/重启/撤销/备份恢复/密钥/配置/版本/迁移/路由/心跳/知识库/交付边界/门禁/确认边界/归档幂等/门禁同源) | | 工具 | 36 个 warroom_(schema 严格校验;以 presets/warroom.preset.json 允许清单为准) | | 验收对照 | docs/ACCEPTANCE.md(逐条状态 + 证据命令) | | 最终审计 | docs/FINAL-AUDIT.md(§8 十二项 11/12 闭环;未闭环项均需操作员 DSH 环境) | | 故障矩阵 | docs/FAULT-MATRIX.md(21 场景:场景/期望/契约归属) | 六件套与动线(一屏) | 阶段 | 命令 | 产出 | | 起好 | init → doctor → config init | 家目录、配置、体检 | | 开工 | engage(授权冻结)→ jump acquire → egress → preflight | 可动手的战役 + 出口 + 预检结论 | | 干活 | wave --dry-run(先演练)→ wave(依赖驱动)→ watch/rate(值班) | 事实入库、任务结项、油表可见 | | 收口 | checklist(缺什么)→ deliver(一键交付)→ evidence/report | 报告(md/json/html,客户版/蓝队版)+ 证据包 + 门禁结论 | | 留存 | weekly --archive → backup --keep 7 → aggregate | 周报、备份、跨会话聚合(只读) | | 对外 | gate-check.mjs(外部门禁)→ CI-INTEGRATION.md | 你的流水线可直接用 | 判断顺序:告警 → 油表 → 漂移;值班一屏 = watch(内置油表),跨战役 = watch --all。 规格与架构决策(本仓库为唯一真源) - 规格(v1.4):docs/WARROOM-FRAMEWORK.md - ADR-001 权限与执行边界(rev1):docs/adr/ADR-001-permission-execution-boundary.md - ADR-002 数据与证据契约(rev2):docs/adr/ADR-002-data-evidence-contract.md - ADR-003 Adapter 生命周期(rev2):docs/adr/ADR-003-adapter-lifecycle.md - ADR-004 v0.2 边界与验收:docs/adr/ADR-004-v0.2-scope.md - ADR-006 执行层能力面(八项动作全实装 + 显式证据协议):docs/adr/ADR-006-executor-capability-surface.md - ADR-007 批准与动作绑定(批准指纹 + 原子单次消费 + 授权手段校验):docs/adr/ADR-007-approval-action-binding.md - ADR-008 证据来源与资源清单真实性(目标文本不得成为事实 + 后台进程进清单):docs/adr/ADR-008-evidence-provenance-and-resource-manifest.md - ADR-009 终态与资源收口(完成不掩盖活资源;终态取消仍必须真的停 + 逐项证实):docs/adr/ADR-009-terminal-state-and-resource-settlement.md - 冻结快照:docs/adr/frozen/ - 快速开始(真实演练输出):docs/QUICKSTART.md - 工具清单(自动生成):docs/TOOLS.md - 桥协议: docs/DSH-BRIDGE-PROTOCOL.md | 预设挂载:docs/PRESET.md | 备份恢复:docs/BACKUP.md - 合并审查记录:docs/MERGE-REVIEW-2026-10-02.md 治理:ADR 一经 Accepted 即不可变,修正以新 rev 重写并留修订记录;规格/doctrine 改动走 PR + RFC。 贡献流程、六闸门槛、写作用域与外部 PR 审查方式见 CONTRIBUTING.md(含 CODEOWNERS)。 快速开始(CLI,不依赖 DSH) node bin/warroom.mjs engage --target 10.0.0.0/24 --rhythm open # 开工指令即授权,冻结授权对象 node bin/warroom.mjs exec --engagement eng_... --command-id c1 --target 10.0.0.5 --class active node bin/warroom.mjs status --engagement eng_... --task wt_... node bin/warroom.mjs cancel --engagement eng_... --task wt_... node bin/warroom.mjs report --engagement eng_... node bin/warroom.mjs secret put --plaintext '...' --label ssh-pw # 明文只进加密库 node bin/warroom.mjs jump import --id jh-1 --addr-v4 203.0.113.9 全部子命令支持 --json;默认 home 为 $WARROOM_HOME 或 ./.warroom。 包结构 | 包 | 平面 | 内容 | | packages/shared-types | 共同契约 | 状态机与迁移表、错误码、四元组/契约/回执校验 | | packages/warroom-core | host | 事实库(fact.db/global.db)、门闸 broker、跳板池、秘密库、报告、adapter(fake / redteam-mode / DSH 桥) | | packages/warroom-tools | agent | 36 个 warroom_ 工具定义(允许清单制的唯一副作用入口) | | packages/warroom-plugin | DSH 插件 | host 服务骨架 + warroom_* 工具包装(挂载层入口) | | presets/ | 预设 | 三角色(commander/recon/chain)+ 允许清单 | 测试与四闸 npm run ci # 六道闸一次跑完(推荐;验收套件 884 例) node scripts/executor-drill.mjs # 执行层落地演练(fake / --mode bridge) node scripts/ci.mjs --quiet # 只看汇总(别用 | tail,管道会吞退出码) node --test # 只跑验收套件 node scripts/validate-tool-schemas.mjs # 工具 schema(DSH 挂载硬要求) node scripts/check-preset.mjs # 预设允许清单闭合 node scripts/fault-matrix.mjs # 故障矩阵 21 场景(与 docs/FAULT-MATRIX.md / SCENARIOS 同源) node scripts/self-review.mjs # 自审:秘密/链接/验收引用/代码卫生 数据位置 $WARROOM_HOME/engagements/<engagement_id>/fact.db(战役事实)+ $WARROOM_HOME/global.db (跳板/租约/op_log/命令队列/秘密)+ $WARROOM_HOME/secrets/(密钥,700/600,不随备份走)。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
86cloudyun-afk/dsh-gungnir
GUNGNIR - DSH 红队战役指挥框架:攻击路径合成的工程化。事实库+门闸+跳板池,执行层可插拔。编排层,不含漏洞利用代码;仅限授权测试。
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7