DST-01 File deletion
拦截 本机命中 68 次 destructive 沙箱触发已验证
① 它防什么
执行文件或目录删除命令
Agent executed a file or directory deletion command
② 触发判据
| 项 | 值 |
|---|---|
| 级别 | critical |
| 类别 | destructive |
| 闸门 | Gate 4 behavior (destructive/persistence) |
| 判据类型 | tool_call |
| 适用工具 | Bash |
命令模式
\brm\b\bdel\b\brmdir\b\bunlink\b\bshutil\.rmtree\b\bos\.remove\bremove-item(?:^|[;&|(]\s*|\s)rd(?:\s*[/][A-Za-z]|\s+[^=\s])\bdd\s+if=[^\n]{0,80}\bof=/dev/\bmkfs\b\btruncate\s+-s\b\bshred\s+-[a-z]*u?\b\bmv\b[^\n]{0,120}\s/dev/null\b(^|[;|&]\s*):\s*>\s*[^\s]\brmSync\s*\(\brm_rf\b\bFileUtils\.rm\b\bunlink\s+glob\barray_map\(\s*["']unlink["']\bosascript\b[^\n]{0,200}\bdelete\b\bfind\b[^\n]{0,200}\s-delete\b
排除模式(命中则不拦)
rm -rf node_modulesrm -rf \.gitrm -rf __pycache__rm -rf \.pslremove-item node_modulesremove-item -recurse.*node_modules\brm\s+-rf\s+(dist|build|target|venv|\.tox|\.mypy_cache|\.ruff_cache|\.pytest_cache|htmlcov|coverage|out|bin|obj)(\s|$|;)\brm\s+-rf\s+\S*\.(egg-info|pyc)(\s|$|;)\brm\s+-rf\s+\.nox\b\\bgrep\\b\\bfind\\b\\bcat\\b\\bhead\\b\\btail\\b\\btype\\b\\bselect\\-string\\b\\bdef\\s+\\w*(remove|unlink|delete)\\w*\\(\\bos\\.remove\\b.*\\#\\b#.*\\b(unlink|rm|del)\\b
以上判据由 rules/default.json 直接生成,不手写、不意译。
③ 真实命中示例
证据 A:沙箱构造触发(一次性临时项目目录,用完即删;调用真实钩子)
2026-09-24T01:44:08+08:00 ✗ block [DST-01]
工具:Bash 退出码:2
判据:command
命中:rm
复现方式:与仓库 challenge/generate_challenge.py 同一方法——
建一次性沙箱 → 喂事件给真实 hooks/pre_tool_use.py → 读沙箱账本。
本机全部 24 条规则均以该方法触发成功(24/24)。
证据 B:本机日常账本命中(真实工作场景,68 次)
2026-09-10T09:55:21+08:00 ✗ 拦截 [DST-01]
工具:Bash 宿主:zcode
判据:command
os.remove
在你自己机器上复算:
grep -h "DST-01" .psl/audit/*.jsonl | head
④ 误报与豁免
① 内置排除模式(命中这些模式时不拦,已在判据里列出):
rm -rf node_modulesrm -rf \.gitrm -rf __pycache__rm -rf \.pslremove-item node_modulesremove-item -recurse.*node_modules\brm\s+-rf\s+(dist|build|target|venv|\.tox|\.mypy_cache|\.ruff_cache|\.pytest_cache|htmlcov|coverage|out|bin|obj)(\s|$|;)\brm\s+-rf\s+\S*\.(egg-info|pyc)(\s|$|;)\brm\s+-rf\s+\.nox\b\\bgrep\\b\\bfind\\b\\bcat\\b\\bhead\\b\\btail\\b\\btype\\b\\bselect\\-string\\b\\bdef\\s+\\w*(remove|unlink|delete)\\w*\\(\\bos\\.remove\\b.*\\#\\b#.*\\b(unlink|rm|del)\\b
② 豁免机制:本规则适用全局的四类豁免(详见 已知边界):
| 机制 | 含义 | 本机次数 |
|---|---|---|
| workspace_root_allow | 路径在已声明的 workspace root 内 ⇒ 放行 | 890 |
| dst02_path_whitelisted | 路径在项目根外但在 policy 白名单内 ⇒ 放行 | 12 |
| dst02_bash_path_suspect | Bash 命令提到根外路径 ⇒ 只提醒、不拦 | 3033 |
| exclude_patterns_allow | 命中 critical 规则但被 exclude_patterns 放行 | 11 |
③ 放行侧实测(证明「该放行的放行了」):
| 实验 | 结果 | 期望 |
|---|---|---|
| 大小写:RM -RF 大写是否仍被拦 | block | ? |
| 规则自带排除:rm -rf node_modules 不该被拦 | allow | allow |
⑤ 边界
| 边界 | 说明 |
|---|---|
| 匹配对象 | tool_call |
| 适用工具 | Bash |
| 平台限定 | 全平台 |
| 判据类型 | command |
| 大小写 | 实测:大小写不敏感(RM -RF 与 rm -rf 同样被拦,见边界实验 A2) |
| 路径规范化 | 实测:生效(./sub/../.env 同样被拦,见边界实验 A3) |
| 脚本不解析 | Bash 命令文本中提到项目根外的绝对路径,只提醒不拦——
理由写进产品:scripts are not parsed (THREAT_MODEL Non-goals) |
| 失败姿态 | fail-open:钩子自身故障时不拦截,也绝不拖垮宿主 |
| 强度 | best-effort 拦截,不是硬性安全边界(不是沙箱、不是防火墙) |
全局边界与口径:已知边界。
⑥ 怎么复现
grep -h "DST-01" .psl/audit/*.jsonl | head # 本机这条规则的命中
python challenge/generate_challenge.py # 用真实钩子生成一条沙箱链
python challenge/verify.py # 复算整条哈希链
账本逐日 JSONL:.psl/audit/YYYY-MM-DD.jsonl;
记录带 prev/hash,链算术公开在
AUDIT_SCHEMA。
引用这一页
Antinel AgentState. DST-01 执行文件或目录删除命令 —— 规则详情. https://antinel.com/agentstate/rules/DST-01/(访问日期:YYYY-MM-DD)
Antinel. (2026). DST-01 执行文件或目录删除命令 —— 规则详情. AgentState. https://antinel.com/agentstate/rules/DST-01/
BibTeX
@misc{antinel_agentstate_rules_DST_01,
title = {DST-01 执行文件或目录删除命令 —— 规则详情},
author = {{Antinel}},
year = {2026},
url = {https://antinel.com/agentstate/rules/DST-01/},
note = {口径: 已实测}
}
口径:已实测 采集时刻:2026-09-23T22:41:18+08:00