YV3507/dsh-plugin-allcrash ↗★ 0

dsh-plugin-allcrash

DSH Host plugin: a configured forbidden plugin (loaded, enabled, installed, or about to be installed) crashes the Host process immediately and leaves a crash report. 适合需要强制审计和禁用特定风险插件的系统管理员。

パッケージ
dsh-plugin-allcrash
互換性
未検証
バージョン
1.1.0
ライセンス
MIT
最終更新
2026/09/28

インストール

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:YV3507/dsh-plugin-allcrash

ドキュメント

README 全文を読む ↗

配置

${DSH_HOME}/allcrash.json(默认即 ~/.dsh/allcrash.json):

生效范围是 DSH_HOME(同一台机器上的所有 profile 共用这一份名单与审计日志)。 需要某个 profile 用不同的名单时,在那个 profile 的 composition 行里写 config(行配置优先级更高), 见下。

{
  "crash_plugin": [
    "example-plugin",
    "dshmarket@1.66.0",
    "bad-plugin@=2.0.0", "mode": "deny", "reason": "2.x 会改数据格式" }
  ],
  "mode": "crash",
  "crash_message": "Never gonna give you up, never gonna let you down, Never gonna run around and desert you.",
  "crash_on_install_attempt": true,
  "crash_on_install_log": false,
  "guard_self_removal": true,
  "self_entry_ids": ["allcrash"],
  "self_package": "dsh-plugin-allcrash",
  "watch_interval_ms": 5000,
  "include_disabled": false,
  "audit_log": true
}

改动会在下一次扫描(默认 ≤ 5 秒)被读到,无需重启。 生成的默认文件里还有三个下划线开头的说明字段(_readme / _encoding / _keys),仅作文档用途,不影响解析。

名字与版本

crash_plugin 的每个元素可以是字符串或对象:

写法语义
"evil-plugin"整个插件(支持 * / ? 通配,大小写不敏感)
"dshmarket@1.66.0"精确版本
"bad-plugin@ >= =1.0.0 =1.2.3 =0.2.3 =1.2.0 /package.json 的 version(link: 依赖读到的就是真实目录的版本)
路径 / file:// 行从模块文件往上找最近的 package.json
agent preset 行 / 安装日志拿不到版本 → 带版本约束的条目在这里只回报 note

响应分层(mode)

命中之后做什么,由全局 mode 或条目上的 mode 决定(取更严格者):

值安装 / 启用 / 拆守卫(可拦动作)已加载的插件
crash(默认)崩 Host崩 Host
deny拒绝该工具调用(返回 deny + 原因),Host 存活无法"拦",退化为 warn
warn只告警,放行(dry-run)只告警 + 审计
  • warn 用于编写阶段:先把名单当 dry-run 跑起来,看"如果上膛会崩在谁身上"。命中会写一份完整诊断到 ${DSH_HOME}/.allcrash/would-crash-- .txt(刻意不写进 crash-reports/,那个目录的语义是"真的崩过"), 并在审计里记 would-crash。同一个违规只记一次,不会每 5 秒刷一份。
  • deny 用于发行/日常:拦得住的动作就不用崩 —— 安装、启用、拆守卫都被拒绝且会话不丢; 插件已经加载时没有"可拦的动作",此时 deny 退化为 warn(要么显式改成 crash,要么把它卸掉)。
  • 审计日志里有三种可 grep 的动词:CRASH(崩了)、would-crash(dry-run 命中)、DENY(拒绝了动作)。

对这份文件的两个刻意行为(都是为了「把配置文件删掉就等于关掉守卫」这类绕过不成立):

  • 删文件 ≠ 关守卫:曾经读到过名单、之后文件消失时,插件会沿用上一次的有效名单、把它写回去并在日志里告警。 要停用守卫请显式写 "crash_plugin": []。
  • 改坏不生效也不静默:解析失败或类型写错时沿用上一次的有效配置并告警(不会退回默认的占位符名单)。

也可以写在 composition 行里 —— 优先级高于配置文件,但带 config 的行只在启动时合成,需要重启:

- insert:
    - id: allcrash
      name: 'dsh-plugin-allcrash'
      config:
        crash_plugin: ['dshmarket']

配置项

键默认含义
crash_plugin["example-plugin"]禁止名单(名字 / 名字@版本 / 对象条目,见上)。[] 表示确实不禁止任何插件;写成非数组时该项被忽略并告警(不会因此把守卫关掉)
modecrash命中后的响应:crash / deny / warn,见「响应分层」
crash_message原型那句歌词崩溃信息开头的一句
crash_on_install_attempttrueplugin_manager install_bundle 目标命中时,在 pnpm 启动之前就处理(按 mode 决定拒绝还是崩溃,profile 不会被动过)。同理拦截 set_bundle / set_plugin / set_version_exemption 里 enabled: true 的被禁目标
crash_on_install_logfalse额外监听 pnpm 输出,覆盖不经工具的安装通道(Web 市场 / CLI);见「已知行为」第 5 条
guard_self_removaltrue禁止通过 plugin_manager 关停或卸载守卫自身
self_entry_ids["allcrash"]守卫自身的 loader 行 id,用于识别「有人要拆我」
self_packagedsh-plugin-allcrash守卫自身的包名
watch_interval_ms5000看门狗扫描间隔(最小 250ms)
include_disabledfalse行存在但被 disabled 是否也算命中(原型只看「已加载」)。loader 行与 agent preset 行同一语义
audit_logtrue写 ${DSH_HOME}/.allcrash/watch.log

配置写错类型时,出错的项会被忽略并打印告警,守约会保持上一层(更严格)的取值; 告警过的同一组问题不会重复刷屏,最终也会随崩溃报告一起写出(config_problems)。

配置项

键默认含义
crash_plugin["example-plugin"]禁止名单(名字 / 名字@版本 / 对象条目,见上)。[] 表示确实不禁止任何插件;写成非数组时该项被忽略并告警(不会因此把守卫关掉)
modecrash命中后的响应:crash / deny / warn,见「响应分层」
crash_message原型那句歌词崩溃信息开头的一句
crash_on_install_attempttrueplugin_manager install_bundle 目标命中时,在 pnpm 启动之前就处理(按 mode 决定拒绝还是崩溃,profile 不会被动过)。同理拦截 set_bundle / set_plugin / set_version_exemption 里 enabled: true 的被禁目标
crash_on_install_logfalse额外监听 pnpm 输出,覆盖不经工具的安装通道(Web 市场 / CLI);见「已知行为」第 5 条
guard_self_removaltrue禁止通过 plugin_manager 关停或卸载守卫自身
self_entry_ids["allcrash"]守卫自身的 loader 行 id,用于识别「有人要拆我」
self_packagedsh-plugin-allcrash守卫自身的包名
watch_interval_ms5000看门狗扫描间隔(最小 250ms)
include_disabledfalse行存在但被 disabled 是否也算命中(原型只看「已加载」)。loader 行与 agent preset 行同一语义
audit_logtrue写 ${DSH_HOME}/.allcrash/watch.log

配置写错类型时,出错的项会被忽略并打印告警,守约会保持上一层(更严格)的取值; 告警过的同一组问题不会重复刷屏,最终也会随崩溃报告一起写出(config_problems)。