前言¶
提示注入是 LLM 智能体的核心弱点:模型分不清「指令」与「数据」。藏在网页检索结果、文件内容、[CRON TASK] / [SCHEDULE REMINDER] 等文本里的恶意指令,可以悄悄改写行为、外传数据或执行破坏性操作,即「上下文病毒感染」。
dsh-prompt-antivirus 是一个全局防提示注入/上下文病毒感染插件。它在数据进入模型前后各加一道防线,覆盖 dsh 全部预设与子代理。插件由 QinpanWan 维护,遵循 MIT 许可证,纯 JS 实现,无原生依赖。
核心功能¶
插件在四个关键节点挂载拦截逻辑:
-
工具参数扫描 (
tools/pre-execute)- 扫描工具调用参数中的恶意指令。
- 高危命中直接
deny。 - 高危 + 危险工具(如
send_email/apply_patch/delete_*)触发ask(人工审批)。
-
工具结果扫描 (
tools/post-execute)- 扫描工具返回结果中的恶意内容。
block模式下将结果转为错误状态。quarantine模式下替换命中片段。
-
进入模型前消息扫描 (
agent/pre-step)- 扫描即将发送给模型的提示词。
- 高危消息进入前进行隔离或替换。
- 每会话注入一次「金丝雀守卫」消息。
-
出站文本消毒 (
llm/stream)- 扫描模型生成的回复。
- 命中金丝雀守卫时中断输出(block 模式)。
- 替换出站文本中的恶意片段。
防御模式¶
插件提供三种运行模式,默认为 quarantine:
- quarantine(隔离模式)
- 行为:可原地改写的路径(工具结果 / 消息 / 出站文本)会替换命中片段;工具参数无法原地改写,直接拒绝并说明。
- block(阻断模式)
- 行为:同隔离模式,另加「金丝雀命中即中断输出」与更严格的拒绝策略。
- monitor(监控模式)
- 行为:只记录审计日志,不干预执行。
可演进签名库¶
签名库不写死在代码里,而是磁盘化存储,支持热更新。
- 存储路径:默认
rules/virus-signatures.(可通过环境变量PROMPT_ANTIVIRUS_RULES_PATH覆盖)。 - 自动初始化:首次启动自动落盘默认库。
- 维护命令:
_antivirus_learn <sample> [category]:把漏网攻击样本提炼成签名并持久化。_antivirus_rules_export:导出当前病毒库为 JSON 字符串,用于共享。_antivirus_rules_import <rules>:合并外部病毒库(按正则源去重)。_antivirus_status:查看当前配置与最近 20 条审计。
安装与启用¶
使用官方命令安装插件,随后重启 dsh web 使配置生效。
dsh plugin --profile web add github:QinpanWan/dsh-prompt-antivirus
安装完成后,重启 dsh web。启动日志中应出现 [prompt-antivirus] 已加载。插件挂载在 profile 层,对所有预设与子代理全局生效。
典型用法¶
- 扫描文本:
_antivirus_scan "some input"
- 学习攻击样本:
_antivirus_learn "malicious sample" "attack_type"
- 查看状态:
_antivirus_status
- 导出/导入病毒库:
_antivirus_rules_export
_antivirus_rules_import <rules>
注意事项与局限¶
- 局限性:签名扫描本质是「打地鼠」,能可靠命中已知措辞,但改写后的攻击可能漏过。请配合最小权限工具集与危险操作人工确认(高危 + 危险工具默认走审批通道)。
- 审计日志:默认落盘至
~/.dsh/task-board/prompt-antivirus-audit.l。 - 依赖:依赖
@deepseek-ai/dsh-tools和@deepseek-ai/dsh-llm(peerDependencies)。