Files
MeshSate/config/policy.yaml
zhaolei f1a176aae0 fix: 裁决口径重构 — rule_overrides 改处置地板,YARA 权重分档与阈值解耦
三件事,都围绕"分数只反映证据,不放行由地板保证":

- rule_overrides 的 manual_review 旧实现是 score=max(score,65) 并跳过该规则自身权重:
  注进去的 65 不是证据,再叠任意 ≥5 分噪声就越过 block_score=70 变拒绝,同时显示分数
  与真实证据脱钩。改为步骤 9「复核地板」:权重照常累加,裁决后处置低于复核才抬到
  manual_review,已判 reject 不降回。3661 条历史扫描重放 0 收紧 0 放行;把 review_score
  下界抬到 36/40/50 或把 DEE 权重降到 10,无地板时干净 exe 静默放行,有地板恒为人工复核。
- DangerousExecutableExtension 进 rule_overrides(manual_review),落实光闸口径「EXE/DLL/
  脚本不自动放行」,不再依赖 weight=30 恰好等于 review_score 下界这种数值巧合。
- YARA 权重分档 85/65/45/25 → 85/60/30/10,只有 critical 一档能独立越过 70;
  档位与 rules/*.yar 的 meta.risk_level 一一对应,控制台注释与 policy.html 同步。
- 词表:RemoteDownloadUnix/PowerShell 移出零容忍、改判"工具与 URL/IP 同框",
  新增 RemoteDownloadExec(40)/PayloadDropToDisk(45) 带内网源站白名单。裸 cmdlet 名会把
  nvidiaInspector.exe 的 add_DownloadFileCompleted 白送 30 分,把 45 分复核顶成 75 分拒绝。
- 风险等级文案:裁决已是 malicious/error 时仍输出"打开风险低"是自相矛盾的对外文案,
  强制收敛到 critical。
- 靶场 L5-005 expected_verdict reject→review:旧 85 分靠载体45+时间戳20+未签名10+架构10
  堆叠,属权重堆叠误报;真实注入器由 C1_PE_ProcessInjection(85) 拦截。
2026-11-02 20:27:30 +08:00

512 lines
18 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# MeshSafe 全局检测策略
# 说明:所有裁决逻辑集中在此文件,调整策略无需改动代码。
# 修改后调用 POST /api/v1/policies/reload 或重启服务生效。
# ============================================================
version: "2026.10.2"
description: "MeshSafe 默认全局策略(麒麟桌面/UOS x86 + WPS 目标终端)"
# ---------- 全局阈值 ----------
global:
# 风险分 ≥ 该值直接拒绝
block_score: 70
# 风险分落在该区间转人工复核
review_score: [30, 70]
# 引擎不可用时的降级策略:fail_closed(拒绝)/ fail_open(放行)
# 生产环境应为 fail_closed,满足等保"安全优先"要求
engine_failure_mode: fail_closed
# 单文件大小上限(字节)—— 与 ClamAV MaxFileSize=1G 对齐,留余量给其他 5 引擎
max_file_size: 1610612736 # 1.5 GB
# 同步模式的最大文件大小,超过转异步
sync_max_size: 536870912 # 512 MB(超过转异步扫描,避免请求超时)
# 是否允许加密压缩包
allow_encrypted_archive: false
# 是否允许加密文档(Office 加密)
allow_encrypted_document: false
# ================================================================
# 零容忍规则集(独立于评分模型,优先级最高)
# 命中即 reject,不走评分累加。与 §7.2 步骤 0 对应。
# ================================================================
zero_tolerance_rules:
# ---- 跨平台通用载体 ----
- PdfJavaScript # PDF 打开即执行脚本
- PdfLaunchAction # PDF 打开即启动程序
- PdfOpenAction # PDF 打开即执行动作
- PathTraversal # 解包路径穿越
- IsoWithExecutable # ISO 挂载后内部含可执行
- MacroObfuscated # 宏代码混淆/加密(意图不可知)
- AttachedTemplate # Office 外部模板注入
# ---- 宏相关(WPS on Linux 生效)----
- VBAAutoExec # VBA 宏 AutoOpen 自动执行入口
- VBAAutoExecShell # VBA 宏自动执行 + Shell/CreateObject 调用
- MRaptorAutoExec # mraptor 判定为自动执行宏
- MRaptorAutoExecSuspicious # mraptor 判定为可疑自动执行宏
- DDEAutoExecution # DDE/DDEAUTO 自动执行字段
- EmbeddedExecutable # 文档内嵌可执行对象
# ---- Linux 专属载体 ----
- LinuxExecutable # ELF 原生二进制
- DesktopFileAutoExec # .desktop 文件 Exec= 字段含危险命令
- ShellScriptDangerous # Shell/Python/Perl/Ruby 脚本含危险函数
- LinuxPortableExecutable # AppImage/Flatpak/Snap 便携包
- ArchiveContainsLinuxExec # 压缩包内混有 .sh/.deb/.run/.bin
# ---- Windows 专属载体(纵深防御)----
- LnkWithAutoExec # LNK 快捷方式(Linux 不识别,保持检测)
- ChmWithScript # CHM 帮助文件(Linux 默认不自动执行)
# ---- ClamAV 引擎检测 ----
- Eicar-Test-Signature # EICAR 测试病毒(等保要求:检测到即阻断)
# ---- L3 高危关键词(白名单优先,剩余命中即阻断)----
- ReverseShellNetcat # 反弹 Shell (nc/ncat//dev/tcp/bash -i)
- ReverseShellPowershell # PowerShell 反弹 Shell (-enc)
- CredentialStealer # 凭据窃取工具 (mimikatz/sekurlsa/wce/...)
- CredentialExport # 凭据导出命令 (reg save/reg export/...)
# ---------- 文件类型白名单 ----------
# 只允许这些类型通过。空列表表示不限制(不推荐生产使用)。
allowed_extensions:
# --- Office 文档 ---
- .doc
- .docx
- .docm
- .xls
- .xlsx
- .xlsm
- .ppt
- .pptx
- .pptm
- .rtf
- .pdf
- .wps # WPS 文字
- .et # WPS 表格
- .dps # WPS 演示
# --- 文本与图像 ---
- .txt
- .csv
- .json
- .xml
- .yaml
- .yml
- .html
- .htm
- .md # Markdown(飞书/Notion 导出)
- .markdown
- .jpg
- .jpeg
- .png
- .gif
- .bmp
- .tiff
- .svg
- .webp
# --- 音视频 ---
- .mp4
- .mov
- .avi
- .mkv
- .wmv
- .flv
- .webm
- .mp3
- .wav
- .flac
- .m4a
# --- 脑图/设计 ---
- .xmind
- .drawio
- .vsdx
- .bpmn
- .epub
# --- 邮件 ---
- .eml
- .msg
# --- 归档(允许进入后递归扫描)---
- .zip
- .rar
- .7z
- .tar
# --- 业务源码/脚本/数据(业务开发/运维合法上传)---
- .java
- .py
- .js
- .ts
- .go
- .c
- .cpp
- .cs
- .sql
- .sh
- .log # 运维日志
- .ini
- .cfg
- .conf
- .properties
# --- 专业文档/素材 ---
- .odt
- .ods
- .odp
- .ttf # 字体文件
- .otf
- .dwg # CAD 图纸
- .dxf
- .stl
- .fbx
- .step
- .iges
- .gz
- .bz2
- .xz
- .iso
# --- 可执行与脚本(零容忍规则拦截,此处允许进入裁决流程)---
# 两层防御:零容忍(步骤 0)先拦截,扩展名白名单(步骤 3)作为兜底
# 这样策略中临时禁用某个零容忍规则时,文件仍可进入评分裁决
- .exe
- .dll
- .msi
- .scr
- .com
- .elf
- .so
- .desktop
- .appimage
- .deb
- .rpm
- .run
- .bin
- .snap
- .sh
- .bash
- .zsh
- .py
- .pl
- .rb
- .js
- .vbs
- .bat
- .cmd
- .ps1
- .hta
- .lnk
- .chm
# ---------- 需要强制深检的类型 ----------
# 一期无沙箱,此配置预留。命中这些类型自动转异步。
sandbox_required_extensions:
- .exe
- .msi
- .iso
# ---------- 特定规则的处置覆盖 ----------
# 仅针对未进入零容忍集的规则。零容忍规则已在上方处理,此处不再覆盖。
# rule_name: [action, reason_override]
# action 取值:pass / pass_with_flag / manual_review / reject / reject_and_notify
rule_overrides:
# 光闸口径:EXE/DLL/脚本一律不自动放行,最低人工复核。
# 用 override 而不是靠 weight=30 恰好等于 review_score 下界来维持——
# 数值巧合意味着把下界调到 >35 或把权重降一点,干净可执行文件就会静默放行。
DangerousExecutableExtension:
action: manual_review
reason: "可执行/脚本类型文件,按光闸口径最低转人工复核"
VBAShellInvocation:
action: manual_review
reason: "宏调用 Shell 但无自动执行入口,需人工复核"
ArchiveContainsExecutable:
action: manual_review
reason: "压缩包内含 Windows 可执行文件,转人工确认(Linux 不识别)"
ArchiveBombSuspect:
action: reject
reason: "压缩比异常,疑似压缩炸弹"
ExtensionMismatch:
action: reject
reason: "声明扩展名与真实类型不一致,疑似伪装"
DoubleExtension:
action: reject
reason: "双扩展名伪装,高风险"
# ---- 邮件相关 ----
EmailAttachmentDangerous:
action: manual_review
reason: "邮件附件为高风险类型,需人工确认是否为钓鱼/恶意附件"
EmailAttachmentDisguised:
action: reject
reason: "邮件附件存在双扩展名伪装,高风险钓鱼特征"
EmailPhishingKeyword:
action: manual_review
reason: "邮件正文/Subject 命中钓鱼特征,需人工确认"
# ---- 加密 ----
OfficeEncrypted:
action: reject
reason: "Office 文档已加密,策略禁止加密文档进入内网"
# ---------- 通知设置 ----------
notification:
# 拒绝时是否返回详细原因给调用方(便于摆渡系统向用户提示)
include_reason: true
# 拒绝原因的最大长度
max_reason_length: 500
# ---------- YARA 规则权重映射 ----------
# 档位权重与 rules/*.yar 的 meta.risk_level 一一对应(由 binary.py 读取 meta 得到
# 默认严重度,再用本表覆盖为固定权重,保证规则文件与策略只有一处真相)。
# critical=85(单独命中即 reject)/ high=60 / medium=30 / low=10
# 只有 critical 一档可以独立越过 block_score=70;其余档位需与其他信号叠加。
# 不在本表的规则:沿用 meta.risk_level 推导出的默认权重。
yara_rule_weights:
critical: # weight=85
- C1_PE_ProcessInjection
- C1_PE_RAT_CommandControl
- C3_JSP_Webshell_Deserialization
- C3_JSP_Webshell_RuntimeExec
- C3_PHP_Webshell_Oneliner
- C3_Webshell_Behinder
- C3_Webshell_CommandExecutionEcho
- C3_Webshell_Godzilla
- C7_Linux_ReverseShell_Bash
- C7_Linux_ReverseShell_NC
- C7_Linux_Rootkit_KernelModule
- C8_Ransomware_BlackCat
- C8_Ransomware_Conti
- C8_Ransomware_Encryption
- C8_Ransomware_LockBit
high: # weight=60
- C1_PE_DLLHijacking
- C1_PE_Downloader_Loader
- C1_PE_LOLBin_Usage
- C3_JSP_Webshell_MemoryShell
- C3_PHP_Webshell_Obfuscated
- C3_PHP_Webshell_VariableDeformation
- C3_Webshell_ASP_Classic
- C3_Webshell_ASPNET
- C3_Webshell_AntSword
- C7_Linux_Persistence_AuthorizedKeys
- C7_Linux_Persistence_Crontab
- C7_Linux_Persistence_LD_PRELOAD
- C7_Linux_Persistence_SystemD
- C7_Linux_ReverseShell_Perl
- C7_Linux_ReverseShell_Python
- C7_Linux_ReverseShell_Socat
- C8_Mining_Monero
- C8_Ransomware_Ryuk_Pseudo
- C8_Ransomware_VolumeShadow
medium: # weight=30
- C1_PE_EntropyHighNetwork
- C1_PE_Mutex_Persistence
- C7_Linux_Miner_Generic
- C7_Linux_ReverseShell_Misc
- C7_Misc_Ruby_Lua_ReverseShell
- C7_Network_Tools_Malicious
- C8_Ransomware_Note_Filename
- C9_Packer_Themida_VMP
low: # weight=10
- C8_Ransomware_Extension_Blacklist
- C9_Packer_UPX
# ---------- 内网特征词表引擎(P1)----------
# 规则为数据驱动:在 policy.yaml 中声明,引擎从 PolicyStore 加载。
# 控制台 P2 可实时修改并热重载。
# 每条规则字段:
# name: 规则名(Finding.rule)
# match: contains | regex | any_of
# pattern: contains/regex 模式的匹配串
# keywords: any_of 模式的关键词列表
# weight: 评分权重(默认 30)
# severity: low | medium | high | critical(默认 medium)
# ignore_case: 正则模式是否忽略大小写
keyword_rules:
# ---- 内网合规特征(辅助判断,不进零容忍)----
- name: ClassifiedLevelMarkers
match: any_of
keywords: ["绝密", "机密", "秘密", "内部文件", "内部资料", "禁止外传"]
weight: 25
severity: low
- name: InternalDocumentPatterns
match: regex
pattern: "(?:国家机密|涉密|密级[::]\\s*[一二三四五])"
ignore_case: true
weight: 30
severity: medium
# ================================================================
# 恶意行为特征词表(覆盖 CSV L3 全部 25 条用例)
# ================================================================
# ---- 远程下载即执行(要有完整动作链,裸词不算;README 里的安装命令进复核而非直接拒)----
# cross_line:命令换行/续行是本类特征最常见的绕过(curl \ + 下一行 | sh),
# 拼接后仍要求"下载工具 + 执行动作"同框,散文里的多行文本不会凑出这条链。
- name: RemoteDownloadExec
match: regex
pattern: "(?:\\b(?:curl|wget)\\b[^\\n]{0,120}\\|\\s*(?:ba|z|k|da)?sh\\b|\\b(?:curl|wget)\\b[^\\n]{0,120}(?:&&|;)\\s*(?:chmod\\s+\\+x|\\./)|(?:^|[^\\w$-])(?:iex|invoke-expression)\\b[^\\n]{0,60}(?:\\biwr\\b|invoke\\s*[-_]?\\s*web\\s*[-_]?\\s*request|invoke\\s*[-_]?\\s*rest\\s*[-_]?\\s*method|downloadstring)|\\b(?:iwr|invoke\\s*[-_]?\\s*web\\s*[-_]?\\s*request|invoke\\s*[-_]?\\s*rest\\s*[-_]?\\s*method)\\b[^\\n]{0,120}\\|\\s*(?:iex|invoke-expression)\\b|certutil\\s+[-/]urlcache[^\\n]{0,60}\\.exe\\b|mkfifo[^\\n]{0,60}(?:\\bnc\\s|\\bnetcat\\b))"
ignore_case: true
cross_line: true
weight: 40
severity: critical
# ---- 下载并落地成可执行文件(dropper 行为,比"下载即执行"弱一档但仍高危)----
- name: PayloadDropToDisk
match: regex
pattern: "(?:\\b(?:curl|wget)\\b[^\\n]{0,120}(?:-o|-O|--output)\\s+\\S*\\.(?:exe|dll|ps1|bat|cmd|vbs|jar|msi|so|bin)\\b|\\b(?:i\\s*[-_]?\\s*wr|invoke\\s*[-_]?\\s*web\\s*[-_]?\\s*request|invoke\\s*[-_]?\\s*rest\\s*[-_]?\\s*method)\\b[^\\n]{0,120}-o(?:utfile)?\\s+\\S*\\.(?:exe|dll|ps1|bat|cmd|vbs)\\b|\\b(?:new-object|activexobject)\\s+system\\.net\\.webclient[^\\n]{0,80}downloadfile)"
ignore_case: true
cross_line: true
weight: 45
severity: critical
# ---- 外部下载动作(cmdlet/API + 无执行链):计分进复核,不再零容忍 ----
# cmdlet 名(Invoke-WebRequest/Invoke-RestMethod/BitsAdmin)是 PowerShell 专有写法,
# 单独出现即进复核。.NET/Win32 的方法名(DownloadString/DownloadFile)不一样——
# 它们存在于所有托管程序的标识符表里,裸匹配实测把 nvidiaInspector.exe 的
# `add_DownloadFileCompleted`、`DownloadFileAsync` 各算一次命中,白送 30 分,
# 把 45 分的人工复核顶成 75 分拒绝。所以方法名必须与 URL/IP 同框才算下载。
- name: RemoteDownloadPowerShell
match: regex
pattern: "(?:\\b(?:Invoke-WebRequest|Invoke-RestMethod|Start-BitsTransfer|BitsAdmin)\\b|\\bDownload(?:String|File)\\b[^\\n]{0,40}(?:https?://|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(?:https?://|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})[^\\n]{0,40}\\bDownload(?:String|File)\\b)"
ignore_case: true
weight: 30
severity: medium
# ---- 下载工具 + 明确地址:只认"工具与 URL/IP 同框",裸 -o 参数不算 ----
# 旧写法里的 `curl|wget -O/-o 任意值` 会命中任何写成两段的安装文档,去掉。
- name: RemoteDownloadUnix
match: regex
pattern: "(?:\\b(?:curl|wget|certutil)\\b[^\\n]{0,80}(?:https?://|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))"
ignore_case: true
weight: 30
severity: medium
# ---- 反弹 Shell ----
- name: ReverseShellNetcat
match: regex
# 只认「执行原语」形态:nc/ncat/netcat 带 -e/-c(把 shell 交给连接),
# 或 /dev/tcp、bash -i >& 这类内核级反连。裸 nc / nc -l / nc -z 是运维常用,
# 出现在速查文档和二进制字符串表里必然误报,不计分。
pattern: "(\\b(?:nc|ncat|netcat)\\s+(?:[^\\n]{0,60}\\s)?-[ec]\\w*\\s*(?:/bin/|/usr/|cmd\\.exe\\b|\\S*sh\\b)|/dev/tcp/|bash\\s+-i\\s+>&|sh\\s+-i\\s+>&)"
ignore_case: true
weight: 40
severity: critical
- name: ReverseShellPowershell
match: regex
pattern: "(powershell\\s+-enc|powershell\\s+-w\\s+hidden\\s+-enc|powershell\\s+-ExecutionPolicy\\s+Bypass\\s+-enc)"
ignore_case: true
weight: 35
severity: critical
# ---- 凭据窃取工具 ----
- name: CredentialStealer
match: regex
# 全部加 \b 词边界, wce 要求后跟 .exe / 空格 / / (二进制随机字节里的 WCE 不会触发)
pattern: "(\\bmimikatz\\b|\\bsekurlsa\\b|\\bwce(\\.exe\\b|\\s|\\/)|\\bgsecdump\\b|\\bfgdump\\b|\\blsadump\\b|\\bdcsync\\b|\\bdcsyncer\\b|\\brubeus\\b)"
ignore_case: true
weight: 45
severity: critical
# ---- 凭据导出命令 ----
- name: CredentialExport
match: regex
pattern: "(reg\\s+save\\s+HKLM\\\\SYSTEM|reg\\s+save\\s+HKLM\\\\SAM|reg\\s+export\\s+SAM|reg\\s+export\\s+SYSTEM|hxdump|secretsdump)"
ignore_case: true
weight: 45
severity: critical
# ---- 远程会话劫持 ----
- name: RemoteSessionHijack
match: regex
pattern: "(\\btscon\\b|\\brdpclip\\b|\\brdp_shadow\\b|\\bshadow\\s+[0-9]+\\b|CreateRemoteThread)"
ignore_case: true
weight: 35
severity: high
# ---- 命令执行混淆 ----
- name: CommandExecutionObfuscated
match: regex
pattern: "(cmd\\s+/c|cmd\\s+/d|certutil\\s+-decode|certutil\\s+-urlcache|\\bmshta\\b|\\bregsvr32\\s+\\/s)"
ignore_case: true
weight: 25
severity: medium
# ---- WMI/LDAP 攻击 ----
- name: WMILdapAttack
match: regex
pattern: "(wmic\\s+path|wmic\\s+process\\s+call\\s+create|ldapsearch\\s+-x|ldapwhoami)"
ignore_case: true
weight: 30
severity: high
# ---------- 白名单(规则命中后二次放宽) ----------
# 优先级:白名单 > 关键词规则 > YARA 规则 > 评分累加
# 命中白名单的规则会从 findings 中过滤,不再进入裁决
keyword_whitelist:
# ---- 内网合法运维地址/域名(白名单放行 curl/wget 下载)----
- rule: RemoteDownloadUnix # curl/wget 下载特征
allowed_keywords:
- "192.168."
- "10."
- "172.16."
- "172.17."
- "172.18."
- "172.19."
- "172.2"
- "172.3"
- ".senmesh.com"
- "repo.internal"
- "mirror.internal"
- rule: RemoteDownloadExec # 下载即执行:内网源站安装脚本按白名单放行
allowed_keywords:
- "192.168."
- "10."
- "172.16."
- "172.17."
- "172.18."
- "172.19."
- "172.2"
- "172.3"
- ".senmesh.com"
- "repo.internal"
- "mirror.internal"
- rule: PayloadDropToDisk # 下载落地可执行文件:内网源站安装包放行
allowed_keywords:
- "192.168."
- "10."
- "172.16."
- "172.17."
- "172.18."
- "172.19."
- "172.2"
- "172.3"
- ".senmesh.com"
- "repo.internal"
- "mirror.internal"
- rule: RemoteDownloadPowerShell # Invoke-WebRequest/BitsAdmin
allowed_keywords:
- "192.168."
- "10."
- ".senmesh.com"
yara_hash_whitelist:
# YARA 命中后,文件 MD5 在此列表 → 跳过告警
# 典型场景:已知安全的开源工具被 YARA 误匹配
- md5: "00000000000000000000000000000000"
note: "示例:占位,生产按需补充"
# ---------- 审计 ----------
audit:
# 记录扫描结果明细到审计日志
log_findings: true
# 是否记录提取到的子文件路径
log_extracted_paths: true