fix: 六引擎误报根因修复 — 解包递归、YARA 恒真规则、签名分级、real_type 溢出

检测范围与证据链修复,不改裁决口径(口径改动在下一条提交)。

- extractor:zip/tar 成员在超限分支外漏加回扫描队列,解包后内容永远不参与检测;
  zip 目录条目被当成内嵌对象;tar 超限成员先落盘不删。递归真正生效后深扫耗时可测。
- clamav:_HIGH/_MEDIUM/_UNWANTED 关键词是小写,而签名名是 "Win.Trojan..." 大小写混排,
  分级判定恒不命中全走默认档;改统一大写匹配。超过 clamd MaxFileSize 的裸奔区间
  (1G~1.5G) 新增 ClamAVSkippedSizeLimit(30) — 按"不可扫描不放行"进复核。
- yara:pe.yar C1 系列改用导入表判定,不再靠裸子串命中字符串表;
  linux.yar C7 多条规则条件恒真(裸 nc/fetch 之类)已收紧;C8/C3 相应收窄。
- structure:DangerousExecutableExtension 是载体信号而非恶意行为,critical 权重 45→35,
  不再作为把中低置信度信号一起顶过 block_score 的底座。
- scanner/documents:real_type 拼进 libmagic 对 MSI/OLE 的元数据串实测 334+ 字符,
  超列宽导致整条 scan_tasks INSERT 连 findings 一起丢(被拒文件不留痕)→
  列宽 256→512,migrate.sql 补 ALTER。
This commit is contained in:
2026-11-02 20:26:56 +08:00
parent 64b682319e
commit b6a004bdb7
13 changed files with 636 additions and 311 deletions

View File

@@ -34,6 +34,17 @@ _settings = get_settings()
TEMP_ROOT = os.environ.get("MESHSAFE_TEMP_ROOT", "/tmp/meshsafe")
def _clip(value: Any, limit: int) -> str:
"""按列宽截断字符串。
外部可控的长度(libmagic 描述串、归档成员路径、用户文件名)一旦超出列宽,
PostgreSQL 会拒绝整条 INSERT,连带同事务里的 scan_findings 一起丢失——
被拒绝的文件反而查不到记录。宁可截断,也不能整条不落库。
"""
text = str(value or "")
return text[:limit]
@dataclass
class ScanContext:
"""一次扫描任务的上下文。"""
@@ -95,12 +106,12 @@ class ScanOutcome:
id=self.task_id,
channel=self.channel,
client_id=self.client_id,
filename=self.file_info.get("filename", ""),
declared_ext=self.file_info.get("declared_ext", ""),
filename=_clip(self.file_info.get("filename", ""), 512),
declared_ext=_clip(self.file_info.get("declared_ext", ""), 32),
size=self.file_info.get("size", 0),
sha256=self.file_info.get("sha256", ""),
md5=self.file_info.get("md5", ""),
real_type=self.file_info.get("real_type", ""),
real_type=_clip(self.file_info.get("real_type", ""), 512),
status="completed",
mode=self.mode,
verdict=self.verdict,
@@ -122,7 +133,7 @@ class ScanOutcome:
severity=f.severity,
rule=f.rule,
detail=f.detail,
extracted_path=f.extracted_path,
extracted_path=_clip(f.extracted_path, 1024),
weight=f.weight,
))