@yottameta/yotta-guardian 0.1.0

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,76 @@
1
+
2
+ # 意图验证器协议(yotta-guardian)
3
+
4
+ > 元盾默认纯确定性规则、不调用任何模型。需要语义级复核时,可通过本协议外接任意意图验证器(LLM 网关、本地模型、规则脚本均可),**不绑定任何固定模型**。
5
+
6
+ ## 一、启用方式
7
+
8
+ 1. 命令行外接:--verifier "命令 参数..."(字符串按 shell 规则拆分;Windows 下路径建议用配置文件列表形式避免反斜杠转义问题)
9
+ 2. 配置文件:{"verifier": {"command": ["python3", "/path/verifier.py"], "timeout": 30}}
10
+ 3. 内置启发式:--heuristic(本地确定性复核,不联网)
11
+
12
+ ## 二、请求(stdin,JSON)
13
+
14
+ 引擎对「允许」结论的调用发起验证,写入 stdin 的 JSON:
15
+
16
+ `_BT_`json
17
+ {
18
+ "tool": "exec",
19
+ "cmd": "npm install",
20
+ "path": "",
21
+ "content_preview": "",
22
+ "target": "",
23
+ "policy": "default",
24
+ "cwd": "/home/user/project",
25
+ "findings": []
26
+ }
27
+ `_BT_`
28
+
29
+ 字段说明:tool 为工具类型;cmd / path / content_preview(内容前 500 字符)/ target 为调用内容;policy 为当前策略;findings 为确定性规则已命中的条目(允许结论下通常为空或仅低危)。
30
+
31
+ ## 三、响应(stdout,JSON)
32
+
33
+ `_BT_`json
34
+ {
35
+ "verdict": "allow",
36
+ "severity": "low",
37
+ "reason": "安装依赖,无恶意信号"
38
+ }
39
+ `_BT_`
40
+
41
+ - verdict:allow / deny / review 三选一(必须)。
42
+ - severity:可选,deny 时默认 high;取值 info / low / medium / high / critical。
43
+ - reason:可选,展示给用户的原因。
44
+
45
+ ## 四、判定语义
46
+
47
+ | 验证器 verdict | 引擎处理 |
48
+ |---|---|
49
+ | allow | 维持确定性结论(允许) |
50
+ | deny | 升级为拒绝,严重级取响应 severity(默认 high) |
51
+ | review | 若当前为允许且低危,升级为「建议复核」(medium 警告,exit 1) |
52
+ | 无响应 / 超时 / 输出非法 | 按 review 处理(复核,不静默放行也不误杀) |
53
+
54
+ 已拒绝的调用不会调用验证器(省成本,避免覆盖确定性结论)。
55
+
56
+ ## 五、内置启发式(--heuristic)
57
+
58
+ 本地确定性复核:扫描调用文本中的高影响动词(install / uninstall / delete / remove / overwrite / reset / drop / truncate / purge / cleanup / restart / reboot / shutdown / stop / disable / enable / start / upgrade / update / format / wipe 等),命中则升级为「建议复核」。不联网、可复现、适合作为轻量语义补充。
59
+
60
+ ## 六、示例验证器(Python 桩)
61
+
62
+ `_BT_`python
63
+ #!/usr/bin/env python3
64
+ import json
65
+ import sys
66
+
67
+ req = json.load(sys.stdin)
68
+ cmd = req.get("cmd", "")
69
+ if cmd.startswith("danger"):
70
+ out = {"verdict": "deny", "severity": "high", "reason": "命中自定义策略"}
71
+ else:
72
+ out = {"verdict": "allow", "severity": "low", "reason": "无风险信号"}
73
+ json.dump(out, sys.stdout)
74
+ `_BT_`
75
+
76
+ 真实场景可用该协议把调用摘要发给 LLM 网关做语义判断,返回同样的 JSON 即可接入。
@@ -0,0 +1,96 @@
1
+
2
+ # 策略 / 退出码 / 使用姿势(yotta-guardian)
3
+
4
+ ## 一、三档策略
5
+
6
+ | 策略 | 行为 | 适用场景 |
7
+ |---|---|---|
8
+ | default(默认) | critical / high 拒绝;medium 警告(exit 1);low 允许 | 通用默认,安全与可用平衡 |
9
+ | strict | critical / high / medium 一律拒绝;low 提示 | 高风险环境、不可逆操作前置检查 |
10
+ | loose | 仅 critical 拒绝;high 警告;medium / low 允许 | 需要高可用、仅拦最危险动作 |
11
+
12
+ 放行规则(--allow / --allow-path / ALLOW_PATTERNS / 配置文件 allow)可把 high 降级为警告、medium 降级为允许;**critical 不受放行规则影响**。
13
+
14
+ ## 二、退出码
15
+
16
+ | 退出码 | 含义 | 对应 |
17
+ |---|---|---|
18
+ | 0 | 允许(无 finding 或仅 low) | allowed |
19
+ | 1 | 允许但带警告 / 严格策略下拒绝 medium | 需人工复核 |
20
+ | 2 | 拒绝(high) | denied |
21
+ | 3 | 拒绝(critical) | denied |
22
+ | 4 | 用法错误 / 致命异常 | error |
23
+
24
+ AI 智能体判断:退出码非 0 时不要直接执行;2 / 3 一律停下并向用户报告原因。
25
+
26
+ ## 三、判定优先级
27
+
28
+ 1. 确定性规则引擎先跑(文本 + argv + 路径 + 内容)。
29
+ 2. 放行规则判定(allow 命中可降级,critical 除外)。
30
+ 3. 策略裁决(default / strict / loose)。
31
+ 4. 若配置了意图验证器且当前结论为「允许」,再跑验证器(外部或内置启发式),可把允许升级为复核 / 拒绝;已拒绝的调用不跑验证器。
32
+
33
+ ## 四、使用姿势(AI 智能体)
34
+
35
+ ### 执行前 gate
36
+
37
+ `_BT_`bash
38
+ python3 scripts/yotta_guardian.py check exec --cmd "<待执行命令>" --json
39
+ `_BT_`
40
+
41
+ - exit 0:执行。
42
+ - exit 1:执行但提示用户「护栏给出中危警告」。
43
+ - exit 2 / 3:不执行;向用户说明命中规则(rule_ids 与原因)。
44
+ - exit 4:命令用法错误,检查参数。
45
+
46
+ ### 批量预检
47
+
48
+ `_BT_`bash
49
+ python3 scripts/yotta_guardian.py check --batch calls.json --json
50
+ `_BT_`
51
+
52
+ calls.json 为数组或 {"calls": [...]},每项含 tool / cmd / path / content / old / new / target。任一被拒时整体退出码取最严重值。
53
+
54
+ ### 授权放行
55
+
56
+ 确有授权的操作(如正规重启、备份清理)用显式放行,而不是绕过检查:
57
+
58
+ `_BT_`bash
59
+ python3 scripts/yotta_guardian.py check exec --cmd "<命令>" --allow "<模式>"
60
+ python3 scripts/yotta_guardian.py check write --path "<路径>" --allow-path "<前缀>"
61
+ `_BT_`
62
+
63
+ ### 审计
64
+
65
+ `_BT_`bash
66
+ # 检查时落审计
67
+ python3 scripts/yotta_guardian.py check exec --cmd "<命令>" --audit-log .yotta-guardian/audit.jsonl
68
+
69
+ # 查询
70
+ python3 scripts/yotta_guardian.py audit --file .yotta-guardian/audit.jsonl --tail 20
71
+ python3 scripts/yotta_guardian.py audit --file .yotta-guardian/audit.jsonl --denied --json
72
+ `_BT_`
73
+
74
+ ## 五、JSON 输出结构(check --json)
75
+
76
+ `_BT_`json
77
+ {
78
+ "tool": "yotta-guardian",
79
+ "version": "0.1.0",
80
+ "policy": "default",
81
+ "summary": { "calls": 1, "allowed": 0, "denied": 1, "exit": 3 },
82
+ "results": [
83
+ {
84
+ "call": { "tool": "exec", "cmd": "..." },
85
+ "verdict": "deny",
86
+ "allowed": false,
87
+ "severity": "critical",
88
+ "reason": "拒绝:...",
89
+ "rule_ids": ["ARG-RM-SYSTEM"],
90
+ "findings": [ { "rule_id": "...", "severity": "critical", "category": "command", "reason": "...", "confidence": 95 } ],
91
+ "verifier": null,
92
+ "exit": 3
93
+ }
94
+ ]
95
+ }
96
+ `_BT_`
@@ -0,0 +1,118 @@
1
+
2
+ # 规则目录(yotta-guardian)
3
+
4
+ > 本文件说明元盾的规则分层与内置规则清单。规则数据在 scripts/guardian_rules.py,匹配逻辑在 scripts/yotta_guardian.py。
5
+
6
+ ## 一、规则分层
7
+
8
+ | 层 | 作用于 | 说明 |
9
+ |---|---|---|
10
+ | 文本模式 | exec 命令 / write 内容 | 正则匹配危险形态(下载即执行、编码执行、反向 shell、向系统文件追加内容等) |
11
+ | argv 级 | exec / run / shell | 命令拆词后按「动词 + 标志 + 目标」分析(递归删除、格式化设备、提权、防火墙、服务、持久化等) |
12
+ | 敏感路径 | write / edit / read | 目标路径规范化后按系统核心 / 用户敏感 / 越界分级 |
13
+ | 放行规则 | 命令 / 路径 | 命中则高危可降级为警告(critical 不受影响) |
14
+
15
+ ## 二、文本模式规则(TEXT_PATTERNS)
16
+
17
+ | 规则号 | 严重级 | 作用域 | 说明 |
18
+ |---|---|---|---|
19
+ | CMD-PIPE-SHELL | critical | both | curl 下载内容通过管道交给 shell 执行 |
20
+ | CMD-PIPE-WGET | critical | both | wget 下载内容通过管道交给 shell 执行 |
21
+ | CMD-PS-ENCODED | critical | both | PowerShell 编码命令执行 |
22
+ | CMD-B64-EXEC | critical | both | 解码后执行编码内容 |
23
+ | CMD-REV-BASH | critical | both | bash /dev/tcp 反向 shell |
24
+ | CMD-REV-NC | critical | both | netcat 反向 shell(-e 参数) |
25
+ | CMD-CHMOD-SETID | high | both | chmod 设置 setuid / setgid / sticky 权限位(4 位特殊位形态) |
26
+ | CMD-CHMOD-777 | high | both | chmod 设置全权限位 |
27
+ | CMD-SUDOERS-ECHO | critical | both | 向 sudoers 写入内容(提权持久化) |
28
+ | CMD-PASSWD-FILE | critical | both | 向 passwd 写入内容(账户持久化) |
29
+ | CMD-SSH-EXFIL | high | command | 读取 SSH 私钥后外传 |
30
+ | CTX-PRIVKEY | high | content | 写入私钥材料 |
31
+ | CTX-SECRET-TOKEN | medium | content | 写入疑似密钥 / 令牌 |
32
+
33
+ 作用域说明:both = 命令与内容都扫;command = 仅命令文本;content = 仅写入内容。
34
+
35
+ ## 三、argv 级规则(按动词分组,匹配逻辑在引擎)
36
+
37
+ | 规则号 | 严重级 | 触发示例(动词形态) |
38
+ |---|---|---|
39
+ | ARG-RM-SYSTEM | critical | 递归删除系统关键路径(/、/etc、/usr、/home、/boot、/dev、/var、C: 等) |
40
+ | ARG-RM-SYS-SUB | high | 递归删除系统目录下路径(如 /var 之下) |
41
+ | ARG-RM-ABS | high | 递归删除项目外绝对路径 |
42
+ | ARG-RM-REL | medium | 递归删除相对路径目标 |
43
+ | ARG-FMT-DEVICE | critical | 格式化块设备 / 磁盘(/dev/sd*、C:) |
44
+ | ARG-FMT-TARGET | high | 格式化其他目标 |
45
+ | ARG-DD-DEVICE | critical | dd 直接写入块设备 / 磁盘 |
46
+ | ARG-DD-FILE | high | dd 写入磁盘镜像目标 |
47
+ | ARG-POWER | high | 系统电源 / 重启操作 |
48
+ | ARG-CHMOD-777 | high/critical | chmod 设置全权限位(对系统关键路径为 critical) |
49
+ | ARG-CHMOD-SETID | high | chmod 设置 setuid / setgid / sticky |
50
+ | ARG-CHOWN-SYSTEM | critical | chown 修改系统关键路径属主 |
51
+ | ARG-CHOWN-REC | medium | 递归修改文件属主 |
52
+ | ARG-PRIV-ACCOUNT | high | 账户管理(useradd / userdel / groupadd 等) |
53
+ | ARG-PRIV-GROUP | high | 把用户加入管理员组 |
54
+ | ARG-PRIV-PASSWD | high | 修改账户口令 |
55
+ | ARG-PRIV-SU | medium | 切换用户身份 |
56
+ | ARG-PRIV-SUDOERS | high | 编辑 sudoers |
57
+ | ARG-PRIV-NET | high | 把用户加入 Windows 管理员组 |
58
+ | ARG-FW-FLUSH | high | 清空防火墙规则 |
59
+ | ARG-FW-UFW | high | 禁用 / 重置防火墙 |
60
+ | ARG-FW-NETSH | high | 关闭 Windows 防火墙 |
61
+ | ARG-FW-CHANGE | medium | 修改防火墙规则 |
62
+ | ARG-SVC-STOP | medium | 停止 / 禁用系统服务 |
63
+ | ARG-SVC-START | medium | 启用系统服务 |
64
+ | ARG-SVC-SC | high | 删除 / 停止 Windows 服务 |
65
+ | ARG-CRON | high | 修改 / 删除 crontab(持久化) |
66
+ | ARG-REG-RUN | high | 修改注册表启动项 |
67
+ | ARG-REG | medium | 修改注册表 |
68
+ | ARG-SCHTASKS | high | 创建 / 修改计划任务(持久化) |
69
+ | ARG-REV-NC | critical | netcat 反向 shell |
70
+ | ARG-REV-SOCAT | critical | socat 执行远程命令(反向 shell) |
71
+ | ARG-PS-ENCODED | critical | PowerShell 编码命令执行 |
72
+
73
+ ## 四、敏感路径规则(PATH_PATTERNS)
74
+
75
+ | 规则号 | 严重级 | 说明 |
76
+ |---|---|---|
77
+ | PATH-ETC-CORE | critical | 写入系统核心配置文件(passwd / shadow / sudoers / group / fstab / hosts 等) |
78
+ | PATH-ETC-ADMIN | critical | 写入系统管理目录(sudoers.d / cron.d / systemd / init.d / rc.d) |
79
+ | PATH-BOOT | critical | 写入 /boot 启动分区 |
80
+ | PATH-DEVICE | critical | 直接写入块设备 |
81
+ | PATH-PROC-SYS | critical | 写入 /proc 或 /sys 内核接口 |
82
+ | PATH-WIN-CONFIG | critical | 写入 Windows 注册表配置库(system32\\config) |
83
+ | PATH-WIN-HOSTS | critical | 写入 Windows hosts 文件 |
84
+ | PATH-WIN-BOOT | critical | 写入 Windows 启动文件 |
85
+ | PATH-ETC-ANY | high | 写入 /etc 任意位置 |
86
+ | PATH-SSH-AUTH | high | 写入 SSH 授权 / 私钥文件 |
87
+ | PATH-RC-FILES | high | 写入 shell / 凭据配置文件(bashrc / zshrc / profile / netrc / gitconfig / npmrc 等) |
88
+ | PATH-AWS-CRED | high | 写入云服务凭据文件 |
89
+ | PATH-CRON-SPOOL | high | 写入 cron 任务队列 |
90
+ | PATH-WIN-SYS32 | high | 写入 Windows 系统目录 |
91
+ | PATH-STARTUP | high | 写入系统启动项目录 |
92
+ | PATH-SECRET-FILE | medium | 写入疑似凭据 / 密钥文件(.env / pem / key 等) |
93
+
94
+ 引擎另有一条通用规则 OUT-001(medium):写入当前工作目录之外的目标。
95
+
96
+ ## 五、放行规则
97
+
98
+ - 默认放行模式(ALLOW_PATTERNS):明确安全的只读 / 查询命令前缀(ls / git status / 版本查询等),命中后高危可降级为警告。
99
+ - 命令行放行:--allow "模式"(命令正则,可重复)、--allow-path "路径"(写路径前缀,可重复)。
100
+ - critical 规则**不可**被放行规则覆盖(需人工确认后换用更低风险方案或 loose 策略仍会拒绝)。
101
+
102
+ ## 六、自定义规则文件(--config)
103
+
104
+ `_BT_`json
105
+ {
106
+ "policy": "default",
107
+ "allow": ["^git "],
108
+ "allow_paths": ["./tmp"],
109
+ "deny": ["^evil"],
110
+ "verifier": { "command": ["python3", "/path/verifier.py"], "timeout": 30 }
111
+ }
112
+ `_BT_`
113
+
114
+ - policy: default / strict / loose
115
+ - allow: 命令正则放行模式
116
+ - allow_paths: 写路径放行前缀
117
+ - deny: 自定义拒绝模式(命中记 CFG-DENY,严重级 high)
118
+ - verifier: 意图验证器配置(heuristic: true 或 command 数组),见 intent-verifier.md
@@ -0,0 +1,175 @@
1
+ # -*- coding: utf-8 -*-
2
+ """guardian_rules.py — YottaMeta 元盾(yotta-guardian)内置规则表(数据,不含匹配逻辑)。
3
+
4
+ 本文件只声明规则数据,与 yotta-security-audit(元安)/ yotta-vetter(元审)的
5
+ 「源码静态扫描」规则不同:这里是「工具调用护栏」规则,面向 exec / write / edit 等
6
+ 动作本身(命令文本 / 目标路径 / 写入内容)。
7
+
8
+ 结构:
9
+ TEXT_PATTERNS 文本模式规则(按 scope 作用于命令文本 / 写入内容 / 两者)
10
+ PATH_PATTERNS 敏感路径规则(作用于 write / edit / read 的目标路径)
11
+ ALLOW_PATTERNS 默认放行模式(作用域宽、明确安全的动作)
12
+
13
+ 规则撰写约束(防 ReDoS / 防误报 / 自扫不误报,与元安规则表同一纪律):
14
+ - 不使用嵌套量词;量词作用于字符类或固定串。
15
+ - 危险词之间用 \s、\b、[\\/] 等转义隔开,避免把本文件自身的字面量误报为命中。
16
+ """
17
+ import re
18
+ from collections import namedtuple
19
+
20
+ # 单条文本规则:规则号 / 严重级 / 类别 / 作用域 / 正则源码 / 描述 / 置信度(0-100)
21
+ # scope: "command"=仅命令文本, "content"=仅写入内容, "both"=两者
22
+ TextRule = namedtuple(
23
+ "TextRule", ["id", "severity", "category", "scope", "pattern", "reason", "confidence"]
24
+ )
25
+
26
+ SEVERITY_ORDER = ("info", "low", "medium", "high", "critical")
27
+ SEVERITY_VALUE = {"info": 0, "low": 0, "medium": 1, "high": 2, "critical": 3}
28
+
29
+ TEXT_PATTERNS = [
30
+ # ── 下载即执行 / 编码执行 ─────────────────────────────────────────────
31
+ TextRule("CMD-PIPE-SHELL", "critical", "command", "both",
32
+ r"(?i)\bcurl\b[^\n|;]{0,120}\|\s*(?:ba)?sh\b",
33
+ "curl 下载内容通过管道交给 shell 执行", 95),
34
+ TextRule("CMD-PIPE-WGET", "critical", "command", "both",
35
+ r"(?i)\bwget\b[^\n|;]{0,120}\|\s*(?:ba)?sh\b",
36
+ "wget 下载内容通过管道交给 shell 执行", 95),
37
+ TextRule("CMD-PS-ENCODED", "critical", "command", "both",
38
+ r"(?i)\b(?:powershell|pwsh)\b[^\n|;]{0,120}(?:-e\s*n\s*c|-encodedcommand)\b",
39
+ "PowerShell 编码命令执行", 85),
40
+ TextRule("CMD-B64-EXEC", "critical", "command", "both",
41
+ r"(?i)(?:b64decode|base64)\s*\([^)]{0,120}\)\s*[^\n;]{0,60}\b(?:exec|eval|system)\b",
42
+ "解码后执行编码内容", 85),
43
+
44
+ # ── 反向 shell / 反弹连接 ────────────────────────────────────────────
45
+ TextRule("CMD-REV-BASH", "critical", "command", "both",
46
+ r"(?i)\bbash\s+-i\s*>\s*&?\s*/dev/tcp/",
47
+ "bash /dev/tcp 反向 shell", 95),
48
+ TextRule("CMD-REV-NC", "critical", "command", "both",
49
+ r"(?i)\bnc\b\s+[-A-Za-z0-9. ]{0,40}-e\b",
50
+ "netcat 反向 shell(-e 参数)", 95),
51
+
52
+ # ── 高危系统改动(文本形态,argv 级另有更细规则)─────────────────────
53
+ TextRule("CMD-CHMOD-SETUID", "high", "command", "both",
54
+ r"(?i)\bchmod\s+[1-7][0-7]{3}\b",
55
+ "chmod 设置 setuid / setgid / sticky 权限位", 85),
56
+ TextRule("CMD-CHMOD-777", "high", "command", "both",
57
+ r"(?i)\bchmod\s+777\b",
58
+ "chmod 设置全权限位", 75),
59
+ TextRule("CMD-SUDOERS-ECHO", "critical", "command", "both",
60
+ r"(?i)(?:>>|>)\s*[^\n;]{0,60}/etc/sudoers",
61
+ "向 sudoers 写入内容(提权持久化)", 92),
62
+ TextRule("CMD-PASSWD-FILE", "critical", "command", "both",
63
+ r"(?i)(?:>>|>)\s*[^\n;]{0,60}/etc/passwd",
64
+ "向 passwd 写入内容(账户持久化)", 92),
65
+
66
+ # ── 凭据外传 / 危险读取 ──────────────────────────────────────────────
67
+ TextRule("CMD-SSH-EXFIL", "high", "command", "command",
68
+ r"(?i)(?:id_[a-z0-9]+|\.ssh)[^\n;]{0,80}(?:\bcurl\b|\bwget\b|scp\b|rsync\b)",
69
+ "读取 SSH 私钥后外传", 90),
70
+ TextRule("CTX-PRIVKEY", "high", "content", "content",
71
+ r"-{5}BEGIN\s+(?:[A-Z ]+\s+)?PRIVATE\s+KEY-{5}",
72
+ "写入私钥材料", 90),
73
+ TextRule("CTX-SECRET-TOKEN", "medium", "content", "content",
74
+ r"(?i)\b(?:AKIA[0-9A-Z]{16}|sk-[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{30,}|xox[baprs]-[A-Za-z0-9-]{10,})\b",
75
+ "写入疑似密钥/令牌", 70),
76
+ ]
77
+
78
+ PATH_PATTERNS = [
79
+ # ── critical:系统核心 / 设备 / 启动链 ────────────────────────────────
80
+ TextRule("PATH-ETC-CORE", "critical", "path", "write",
81
+ r"(?i)[\\/]etc[\\/](?:passwd|shadow|sudoers|group|fstab|hosts|ld\.so\.preload|rc\.local)$",
82
+ "写入系统核心配置文件", 95),
83
+ TextRule("PATH-ETC-ADMIN", "critical", "path", "write",
84
+ r"(?i)[\\/]etc[\\/](?:sudoers\.d|cron\.d|cron\b|systemd[\\/]system|init\.d|rc\.d)[\\/]",
85
+ "写入系统管理目录(sudoers / cron / systemd / init)", 95),
86
+ TextRule("PATH-BOOT", "critical", "path", "write",
87
+ r"(?i)[\\/]boot(?:[\\/]|$)",
88
+ "写入 /boot 启动分区", 92),
89
+ TextRule("PATH-DEVICE", "critical", "path", "write",
90
+ r"(?i)[\\/]dev[\\/]sd[a-z]+\d*$",
91
+ "直接写入块设备(磁盘)", 95),
92
+ TextRule("PATH-PROC-SYS", "critical", "path", "write",
93
+ r"(?i)[\\/](?:proc|sys)[\\/]",
94
+ "写入 /proc 或 /sys 内核接口", 92),
95
+ TextRule("PATH-WIN-CONFIG", "critical", "path", "write",
96
+ r"(?i)^[a-z]:[\\/]windows[\\/]system32[\\/]config[\\/]",
97
+ "写入 Windows 注册表配置库", 95),
98
+ TextRule("PATH-WIN-HOSTS", "critical", "path", "write",
99
+ r"(?i)^[a-z]:[\\/]windows[\\/]system32[\\/]drivers[\\/]etc[\\/]hosts$",
100
+ "写入 Windows hosts 文件", 92),
101
+ TextRule("PATH-WIN-BOOT", "critical", "path", "write",
102
+ r"(?i)^[a-z]:[\\/]boot(?:mgr|\.ini)?$",
103
+ "写入 Windows 启动文件", 92),
104
+
105
+ # ── high:用户级敏感 / 系统管理区域 / 启动持久化点 ────────────────────
106
+ TextRule("PATH-ETC-ANY", "high", "path", "write",
107
+ r"(?i)[\\/]etc[\\/]",
108
+ "写入 /etc 系统配置目录", 85),
109
+ TextRule("PATH-SSH-AUTH", "high", "path", "write",
110
+ r"(?i)\.ssh[\\/](?:authorized_keys|config|id_[a-z0-9]+)$",
111
+ "写入 SSH 授权 / 私钥文件", 92),
112
+ TextRule("PATH-RC-FILES", "high", "path", "write",
113
+ r"(?i)[\\/]\.?(?:bashrc|zshrc|profile|bash_profile|netrc|gitconfig|npmrc|pypirc)$",
114
+ "写入 shell / 凭据配置文件(持久化或泄密点)", 85),
115
+ TextRule("PATH-AWS-CRED", "high", "path", "write",
116
+ r"(?i)\.aws[\\/](?:credentials|config)$",
117
+ "写入云服务凭据文件", 90),
118
+ TextRule("PATH-CRON-SPOOL", "high", "path", "write",
119
+ r"(?i)[\\/]var[\\/]spool[\\/]cron[\\/]",
120
+ "写入 cron 任务队列", 88),
121
+ TextRule("PATH-WIN-SYS32", "high", "path", "write",
122
+ r"(?i)^[a-z]:[\\/]windows[\\/]",
123
+ "写入 Windows 系统目录", 85),
124
+ TextRule("PATH-STARTUP", "high", "path", "write",
125
+ r"(?i)(?:start\s*menu[\\/]programs[\\/]startup|启动|\\startup[\\/])",
126
+ "写入系统启动项目录(持久化)", 85),
127
+
128
+ # ── medium:项目内敏感文件名 / 越界写入(引擎另加 OUT-001)────────────
129
+ TextRule("PATH-SECRET-FILE", "medium", "path", "write",
130
+ r"(?i)(?:^|[\\/])\.env(?:$|[\\/])|\.(?:pem|key|p12|pfx)$|(?:credential|secret|token)[^\\/]*$",
131
+ "写入疑似凭据 / 密钥文件", 70),
132
+ ]
133
+
134
+ # 默认放行模式(仅作用于命令文本,命中则高危可降级为警告;critical 不受影响)
135
+ ALLOW_PATTERNS = [
136
+ r"(?i)^\s*(?:ls|dir|pwd|whoami|date|echo|cat|type|head|tail|grep|find|which|where|env|printenv)\b",
137
+ r"(?i)^\s*git\s+(?:status|diff|log|branch|remote|show)\b",
138
+ r"(?i)^\s*(?:python3?|node|npm|pip3?|uv|npx)\s+(-{1,2}\S+\s+)*(-[vV]\b|--version\b|version)",
139
+ ]
140
+
141
+
142
+ def severity_value(sev):
143
+ """严重级 → 数值(0=干净/仅 low,1=medium,2=high,3=critical)。"""
144
+ return SEVERITY_VALUE.get(sev, 0)
145
+
146
+
147
+ def severity_rank(sev):
148
+ """严重级 → 排序权重(越大越严重)。"""
149
+ try:
150
+ return SEVERITY_ORDER.index(sev)
151
+ except ValueError:
152
+ return 0
153
+
154
+
155
+ _COMPILED = {}
156
+
157
+
158
+ def compile_rules():
159
+ """预编译全部文本规则与路径规则,返回 {rule_id: compiled}。"""
160
+ if _COMPILED:
161
+ return _COMPILED
162
+ for r in list(TEXT_PATTERNS) + list(PATH_PATTERNS):
163
+ try:
164
+ _COMPILED[r.id] = re.compile(r.pattern)
165
+ except re.error as e:
166
+ raise ValueError("规则 %s 正则编译失败: %s" % (r.id, e))
167
+ return _COMPILED
168
+
169
+
170
+ def get_rule(rule_id):
171
+ """按规则号取规则(文本/路径/放行)。"""
172
+ for r in list(TEXT_PATTERNS) + list(PATH_PATTERNS):
173
+ if r.id == rule_id:
174
+ return r
175
+ return None