@kenhkl/agent-moss 0.16.7 → 0.16.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ # 规则目录模板(随包分发,**不用跑任何命令**)
2
+
3
+ 把要用的文件拷进你的**规则目录**(环境变量 `AGENT_MOSS_EXTRA_RULES_DIR` 指向的那个目录):
4
+
5
+ | 文件 | 干什么 | 放进目录的效果 |
6
+ |---|---|---|
7
+ | `extra.json` | **追加**规则 | 内置规则**全部保留**,你写的加在其后一起判定 |
8
+ | `override.json` | **覆盖**规则 | **你写了哪个类别,那个类别就整份以你的为准**;没写的类别照常用内置 |
9
+
10
+ > 两个文件里每个类别都是**空数组** ⇒ **原样拷进去 = 什么都不改**(安全)。
11
+ > 想加什么,照下面的样例往对应类别的方括号里填。
12
+
13
+ ---
14
+
15
+ ## 生效规则(**先看这一节**:谁会被读、谁压谁)
16
+
17
+ AgentMoss **只读规则目录里的这两个文件名**,其他名字的 `.json` **一律不读**:
18
+
19
+ | 文件 | 作用 |
20
+ |---|---|
21
+ | `extra.json` | 里面**出现的类别** → **追加**在内置规则之后一起判定 |
22
+ | `override.json` | 里面**出现的类别** → **整份替换**内置的同名类别(没写的类别保持内置不变) |
23
+ | 其他任何 `.json` | **不读**(启动日志与 `agent-moss rules status` 会列出"**不会被读取**"清单) |
24
+ | `scenarios/<场景id>/rules.json` | 场景规则(如 bank 的白名单 / 禁 ssh)的**整份替换位** —— 独立机制,不走上面两个文件(前提:`AGENT_MOSS_SCENARIO` 保持开启) |
25
+
26
+ **两个文件同时存在时:都生效。**最终规则 =
27
+
28
+ ```
29
+ ① override.json 里写到的那些类别 (整份以你的为准,内置同类不再参与)
30
+ ② + extra.json 里写到的那些类别 (追加)
31
+ ③ + 没被上面碰过的内置类别 (照常生效)
32
+ ```
33
+
34
+ 同一个 `pattern` / `path` 重复时 → **保留先出现的**,也就是优先级 **override.json > extra.json > 内置**。
35
+
36
+ ⚠️ **空数组 = 不覆盖 / 不追加**(所以这两个模板原样拷进目录 = 什么都不改,安全)。
37
+ ⚠️ 想改**场景规则**(bank 白名单/禁 ssh):走 `<规则目录>/scenarios/bank/rules.json`,
38
+ 且 `AGENT_MOSS_SCENARIO` **必须保持开启**——关掉它不是"覆盖",而是让 bank 规则**全部失效**。
39
+
40
+ ## 怎么写(照抄这两段就行)
41
+
42
+ ### 例 1:追加一条"禁止 su" + 一条"保护 /data/hr"(写进 `extra.json`)
43
+
44
+ ```json
45
+ {
46
+ "dangerous_commands": [
47
+ {"pattern": "(?:^|[;&|])\\s*su(?:\\s|$)", "risk_level": "high",
48
+ "risk_type": "privilege_escalation", "reason": "禁止切换用户"}
49
+ ],
50
+ "sensitive_path_access": [
51
+ {"path": "/data/hr", "risk_level": "high", "desc": "HR 数据", "deny_mode": "deny_both"}
52
+ ]
53
+ }
54
+ ```
55
+
56
+ ### 例 2:覆盖内置的敏感路径(写进 `override.json`)
57
+
58
+ ```json
59
+ {
60
+ "sensitive_path_access": [
61
+ {"path": "/data/hr", "risk_level": "high", "desc": "HR 数据", "deny_mode": "deny_both"}
62
+ ]
63
+ }
64
+ ```
65
+
66
+ > ⚠️ 只写 `sensitive_path_access` ⇒ **内置的 91 条敏感路径全部被这份替换掉**(这就是"覆盖")。
67
+ > 只想加一条请用 `extra.json`。
68
+
69
+ ---
70
+
71
+ ## 字段说明(只跑 L1 的部署看这三类就够)
72
+
73
+ | 类别 | 字段 | 说明 |
74
+ |---|---|---|
75
+ | `dangerous_commands` | `pattern`(正则)、`risk_level`(high/critical)、`risk_type`、`reason` | 危险命令 |
76
+ | `injection_detection` | `keyword`、`lang`(如 `zh`) | 提示注入关键词 |
77
+ | `sensitive_path_access` | `path`、`risk_level`、`desc`、`deny_mode` | 敏感路径 |
78
+
79
+ 另外三个类别(`intent_consistency` / `password_modify_consent` / `user_deletion_consent`)属于 **L2**;
80
+ 设了 `AGENT_MOSS_DISABLE_LOGIC_RULES=1` 时写了也不生效。
81
+
82
+ ### ✍️ 正则里的反斜杠要写两次
83
+
84
+ JSON 里 `\` 是转义符,所以正则的 `\s`、`\b`、`\n` 要写成 **`\\s`、`\\b`、`\\n`**:
85
+
86
+ | 你想要的匹配 | JSON 里要写 |
87
+ |---|---|
88
+ | 空白 `\s` | `"\\s"` |
89
+ | 单词边界 `\b` | `"\\b"` |
90
+ | 换行 `\n` | `"\\n"` |
91
+
92
+ (上面"例 1"里就是这么写的,可以直接抄。)
93
+
94
+ ---
95
+
96
+ ## 三个最常见的坑
97
+
98
+ 1. **敏感路径想连"读取"一起拦,必须写 `"deny_mode": "deny_both"`**;只写 `path` 默认**只拦写/删**。
99
+ 2. **覆盖是"整类替换"**:`override.json` 的 `dangerous_commands` 里只写 1 条,
100
+ 内置那 225 条危险命令规则就都不生效了 —— 只想加规则请用 `extra.json`。
101
+ 3. **同一条命令可能被多条内置规则覆盖**:`cat /etc/shadow` 在 `sensitive_path_access` 与
102
+ `dangerous_commands` 里各有一条。删完用下面这条命令看**理由**(命中哪条),按理由删干净:
103
+
104
+ ```bash
105
+ agent-moss analyze "cat /etc/shadow"
106
+ ```
107
+
108
+ ## 想删掉内置的某一条?
109
+
110
+ ```bash
111
+ # 生成一份内置 L1 规则的全量拷贝,删掉/改掉你不要的那条
112
+ agent-moss rules init --dir <你的目录> --with-builtin
113
+ ```
114
+ (这份拷贝会被"钉"在当版:以后升级内置规则不会反映到它上面 —— 只做临时改动用。)
115
+
116
+ ## 高级:另外三类数据也能覆盖 / 追加(一般用不到)
117
+
118
+ 除了上面六个规则类别,这两个文件还认三个键(形状不同,别和规则类别混):
119
+
120
+ | 键 | 内容 | 覆盖 / 追加语义 |
121
+ |---|---|---|
122
+ | `skills` | L3 技能表 `{"类别": {"技能名": ["关键词", ...]}}` | 覆盖:写到的**类别**整份替换;追加:按技能名合并 |
123
+ | `ltl_rules` | L2.2 时序规则 `[{"id": "...", ...}]` | 覆盖:整份替换规则清单;追加:按 `id` 合并 |
124
+ | `tools` | 工具注册表 `{"工具名": {"actionClass": "...", ...}}` | 覆盖:整份替换;追加:按工具名合并 |
125
+
126
+ 空模板里**没有**这三个键(默认不写就是完全不管);要用时自己加上。
127
+
128
+ ## 改完自查
129
+
130
+ ```bash
131
+ agent-moss rules status
132
+ ```
133
+ 会打印:生效了哪些类别各多少条 / 哪些文件**不会被读取**(名字不对)/ 模板还没填。
@@ -0,0 +1,14 @@
1
+ {
2
+ "_说明": [
3
+ "追加规则:内置规则全部保留,你写在这里的规则加在内置之后一起判定。",
4
+ "只跑 L1 的部署只需要前三个类别(后三个属于 L2,写了也不生效)。",
5
+ "怎么填、可直接照抄的样例:见同目录 README.md。",
6
+ "改完自查:agent-moss rules status"
7
+ ],
8
+ "dangerous_commands": [],
9
+ "injection_detection": [],
10
+ "sensitive_path_access": [],
11
+ "intent_consistency": [],
12
+ "password_modify_consent": [],
13
+ "user_deletion_consent": []
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "_说明": [
3
+ "覆盖规则:你写了哪个类别,那个类别就整份以你的为准(内置同名类别不再生效);",
4
+ "没写的类别照常用内置。空数组 = 不覆盖,所以本文件**原样放着 = 什么都不改**。",
5
+ "怎么填、可直接照抄的样例:见同目录 README.md。",
6
+ "要删掉内置的某一条(而不是整类替换):用 agent-moss rules init --with-builtin。",
7
+ "改完自查:agent-moss rules status"
8
+ ],
9
+ "dangerous_commands": [],
10
+ "injection_detection": [],
11
+ "sensitive_path_access": [],
12
+ "intent_consistency": [],
13
+ "password_modify_consent": [],
14
+ "user_deletion_consent": []
15
+ }