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) 拦截。
This commit is contained in:
@@ -174,7 +174,7 @@ def _annotate_yaml(raw: str) -> str:
|
||||
# ---- rule_overrides ----
|
||||
"rule_overrides": '特定规则的处置覆盖。action: pass | manual_review | reject',
|
||||
# ---- yara ----
|
||||
"yara_rule_weights": 'YARA 规则按严重度分档赋权重(critical=85 high=65 medium=45 low=25)',
|
||||
"yara_rule_weights": 'YARA 规则按严重度分档赋权重(critical=85 high=60 medium=30 low=10)',
|
||||
# ---- keyword ----
|
||||
"keyword_rules": '词表引擎规则。match: contains | regex | any_of',
|
||||
# ---- notification ----
|
||||
@@ -215,9 +215,9 @@ def _annotate_yaml(raw: str) -> str:
|
||||
# YARA 权重分档 → 中文
|
||||
_WEIGHT_TIER_HINTS = {
|
||||
"critical": "weight=85(严重)",
|
||||
"high": "weight=65(高危)",
|
||||
"medium": "weight=45(中等)",
|
||||
"low": "weight=25(低危)",
|
||||
"high": "weight=60(高危)",
|
||||
"medium": "weight=30(中等)",
|
||||
"low": "weight=10(低危)",
|
||||
}
|
||||
|
||||
lines = raw.split("\n")
|
||||
|
||||
@@ -115,13 +115,14 @@ class Policy:
|
||||
"""YARA 规则权重映射:规则名 → weight(0-100)。
|
||||
|
||||
从 policy.yaml 的 yara_rule_weights.{critical/high/medium/low} 展开。
|
||||
档位权重固定:critical=85 / high=65 / medium=45 / low=25。
|
||||
档位权重固定:critical=85 / high=60 / medium=30 / low=10
|
||||
(与 rules/*.yar 的 meta.risk_level 分档、binary.py 默认权重一致)。
|
||||
"""
|
||||
weights = {
|
||||
"critical": 85.0,
|
||||
"high": 65.0,
|
||||
"medium": 45.0,
|
||||
"low": 25.0,
|
||||
"high": 60.0,
|
||||
"medium": 30.0,
|
||||
"low": 10.0,
|
||||
}
|
||||
result: Dict[str, float] = {}
|
||||
for tier, weight in weights.items():
|
||||
@@ -414,6 +415,8 @@ class PolicyEngine:
|
||||
5) 规则覆盖
|
||||
6) 权重累加评分
|
||||
7) 阈值裁决
|
||||
8) 复核区间上界校正
|
||||
9) 复核地板(步骤 5 声明 manual_review 的规则,只抬处置不抬分数)
|
||||
"""
|
||||
import logging
|
||||
|
||||
@@ -566,14 +569,15 @@ class PolicyEngine:
|
||||
)
|
||||
|
||||
# 5) 规则覆盖优先处理
|
||||
override_findings: List[Finding] = []
|
||||
# action=reject 立即拒绝;action=manual_review 只登记"复核地板",
|
||||
# 不往分数里注 65 —— 地板在步骤 9 生效。
|
||||
review_floor = False
|
||||
for finding in findings:
|
||||
override = policy.rule_overrides.get(finding.rule)
|
||||
if not override:
|
||||
continue
|
||||
action = override.get("action", "manual_review")
|
||||
reason = override.get("reason") or f"规则 {finding.rule} 命中策略"
|
||||
override_findings.append(finding)
|
||||
triggered.append(
|
||||
{
|
||||
"type": "rule_override",
|
||||
@@ -593,12 +597,10 @@ class PolicyEngine:
|
||||
triggered=triggered,
|
||||
)
|
||||
if action == "manual_review":
|
||||
score = max(score, 65.0)
|
||||
review_floor = True
|
||||
|
||||
# 6) 其余信号按权重累加
|
||||
# 6) 全部信号按权重累加
|
||||
for finding in findings:
|
||||
if finding in override_findings:
|
||||
continue
|
||||
score += finding.weight
|
||||
if finding.severity in {Severity.HIGH.value, Severity.CRITICAL.value}:
|
||||
reasons.append(f"{finding.engine}:{finding.detail}")
|
||||
@@ -622,6 +624,12 @@ class PolicyEngine:
|
||||
if score >= policy.block_score:
|
||||
verdict, action = "malicious", "reject"
|
||||
|
||||
# 9) 复核地板:策略里声明 manual_review 的规则保证"不低于人工复核",
|
||||
# 与权重数值和 review_score 阈值解耦——调高 review_score 下界或调低
|
||||
# 这些规则的权重,都不会让它们覆盖的文件类型静默放行。
|
||||
if review_floor and action in ("pass", "pass_with_flag"):
|
||||
verdict, action = "suspicious", "manual_review"
|
||||
|
||||
reason = self._build_reason(verdict, reasons, score)
|
||||
return Decision(
|
||||
verdict=verdict,
|
||||
@@ -753,7 +761,9 @@ class PolicyEngine:
|
||||
if any("url" in f.rule.lower() or "link" in f.rule.lower() or "qr" in f.rule.lower()
|
||||
for f in findings):
|
||||
factors.append("external_url")
|
||||
if ext in {".exe", ".dll", ".elf", ".so", ".desktop", ".appimage", ".run", ".bin", ".deb", ".rpm"}:
|
||||
if ext in {".exe", ".dll", ".elf", ".so", ".desktop", ".appimage", ".run", ".bin", ".deb", ".rpm",
|
||||
".msi", ".msp", ".com", ".pif", ".scr", ".cpl", ".jar", ".war",
|
||||
".vbs", ".vbe", ".js", ".jse", ".ps1", ".bat", ".cmd", ".hta", ".lnk", ".cab", ".appx"}:
|
||||
factors.append("contains_executable")
|
||||
if ext == ".iso":
|
||||
factors.append("is_mountable_image")
|
||||
@@ -774,6 +784,14 @@ class PolicyEngine:
|
||||
advice = "文件结构正常,无特别提示"
|
||||
requires_macro = False
|
||||
|
||||
# 裁决已经是恶意/引擎不可判定时,"打开风险低"是自相矛盾的对外文案:
|
||||
# 摆渡系统会把这段展示给用户,等于告诉用户"被拦下的文件可以放心打开"。
|
||||
if verdict in {"malicious", "error", "reject"} and level != "critical":
|
||||
level = "critical"
|
||||
factors.append("verdict_rejected")
|
||||
advice = "该文件已被判定为恶意或不可判定,请勿打开,联系管理员处理"
|
||||
requires_macro = False
|
||||
|
||||
return {
|
||||
"level": level,
|
||||
"factors": factors,
|
||||
|
||||
@@ -172,10 +172,10 @@
|
||||
<h3>权重分档说明(来自 policy.yaml → yara_rule_weights)</h3>
|
||||
<div style="font-size:13px;color:#555;line-height:1.8;">
|
||||
<span class="chip chip-zt">critical → weight=85</span>
|
||||
<span class="chip chip-warn">high → weight=65</span>
|
||||
<span class="chip chip-info">medium → weight=45</span>
|
||||
<span class="chip chip-ok">low → weight=25</span>
|
||||
<span style="color:#888;margin-left:12px;">未配置的规则默认 weight=50</span>
|
||||
<span class="chip chip-warn">high → weight=60</span>
|
||||
<span class="chip chip-info">medium → weight=30</span>
|
||||
<span class="chip chip-ok">low → weight=10</span>
|
||||
<span style="color:#888;margin-left:12px;">未列出的规则沿用 rules/*.yar 中 meta.risk_level 推导出的同档权重</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user