YV3507/dsh-plugin-allcrash ↗★ 0
dsh-plugin-allcrash
按禁止名单检测插件,支持告警、拦截操作或终止宿主并记录报告 适合需要强制审计和禁用特定风险插件的系统管理员。
安裝
$
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"] | 禁止名单(名字 / 名字@版本 / 对象条目,见上)。[] 表示确实不禁止任何插件;写成非数组时该项被忽略并告警(不会因此把守卫关掉) |
mode | crash | 命中后的响应:crash / deny / warn,见「响应分层」 |
crash_message | 原型那句歌词 | 崩溃信息开头的一句 |
crash_on_install_attempt | true | plugin_manager install_bundle 目标命中时,在 pnpm 启动之前就处理(按 mode 决定拒绝还是崩溃,profile 不会被动过)。同理拦截 set_bundle / set_plugin / set_version_exemption 里 enabled: true 的被禁目标 |
crash_on_install_log | false | 额外监听 pnpm 输出,覆盖不经工具的安装通道(Web 市场 / CLI);见「已知行为」第 5 条 |
guard_self_removal | true | 禁止通过 plugin_manager 关停或卸载守卫自身 |
self_entry_ids | ["allcrash"] | 守卫自身的 loader 行 id,用于识别「有人要拆我」 |
self_package | dsh-plugin-allcrash | 守卫自身的包名 |
watch_interval_ms | 5000 | 看门狗扫描间隔(最小 250ms) |
include_disabled | false | 行存在但被 disabled 是否也算命中(原型只看「已加载」)。loader 行与 agent preset 行同一语义 |
audit_log | true | 写 ${DSH_HOME}/.allcrash/watch.log |
配置写错类型时,出错的项会被忽略并打印告警,守约会保持上一层(更严格)的取值;
告警过的同一组问题不会重复刷屏,最终也会随崩溃报告一起写出(config_problems)。
配置项
| 键 | 默认 | 含义 |
|---|---|---|
crash_plugin | ["example-plugin"] | 禁止名单(名字 / 名字@版本 / 对象条目,见上)。[] 表示确实不禁止任何插件;写成非数组时该项被忽略并告警(不会因此把守卫关掉) |
mode | crash | 命中后的响应:crash / deny / warn,见「响应分层」 |
crash_message | 原型那句歌词 | 崩溃信息开头的一句 |
crash_on_install_attempt | true | plugin_manager install_bundle 目标命中时,在 pnpm 启动之前就处理(按 mode 决定拒绝还是崩溃,profile 不会被动过)。同理拦截 set_bundle / set_plugin / set_version_exemption 里 enabled: true 的被禁目标 |
crash_on_install_log | false | 额外监听 pnpm 输出,覆盖不经工具的安装通道(Web 市场 / CLI);见「已知行为」第 5 条 |
guard_self_removal | true | 禁止通过 plugin_manager 关停或卸载守卫自身 |
self_entry_ids | ["allcrash"] | 守卫自身的 loader 行 id,用于识别「有人要拆我」 |
self_package | dsh-plugin-allcrash | 守卫自身的包名 |
watch_interval_ms | 5000 | 看门狗扫描间隔(最小 250ms) |
include_disabled | false | 行存在但被 disabled 是否也算命中(原型只看「已加载」)。loader 行与 agent preset 行同一语义 |
audit_log | true | 写 ${DSH_HOME}/.allcrash/watch.log |
配置写错类型时,出错的项会被忽略并打印告警,守约会保持上一层(更严格)的取值;
告警过的同一组问题不会重复刷屏,最终也会随崩溃报告一起写出(config_problems)。