Commit Graph

9 Commits

Author SHA1 Message Date
b6a004bdb7 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。
2026-11-02 20:26:56 +08:00
9834930299 fix: PDF/Office/压缩包关键词误报 — 两层修复
【regex 层收紧】policy.yaml keyword_rules

1) ReverseShellNetcat: \\bnc\\b → \\bnc\\s+-[elpvs]\\w*
   nc 后必须跟参数 (-e/-l/-p/-v/-s), 单独 nc 在二进制里必然误报
   ncat 同理: \\bncat\\b → \\bncat\\s+-\\w+
   保留 \\bnetcat\\b (8 字母, 碰撞概率极低)

2) CredentialStealer: 全部关键词加 \\b 词边界
   wce 单独加后续约束: wce(\\.exe\\b|\\s|\\/)
   要求 wce 后跟 .exe / 空格 / / (二进制随机字节里 WCE 不再触发)

【引擎层架构修复】keywords.py

新增 BINARY_SKIP_EXTS (48 个扩展名):
  - PDF / Office (.pdf/.docx/.xlsx/.pptx/...)
  - 压缩包 (.rar/.zip/.7z/.tar/.gz/...)
  - 图片 (.png/.jpg/.gif/.svg/...)
  - 视频 (.mp4/.avi/.mkv/...)
  - 音频 (.mp3/.wav/.flac/...)

KeywordEngine.scan() 开头检查:
  如果 declared_ext / path ext 在 BINARY_SKIP_EXTS → 直接返回空

根因:
  PDF/DOCX/ZIP 等文件是 DEFLATE 压缩流 (伪随机字节)
  短关键词 (nc=2w/wce=3w) 在压缩流里必然出现
  误报导致: 云启智能体平台生成效果.pdf 被拦截
    ReverseShellNetcat: 'g%ew;V6Z?)Nc{>72z}*&96'
    CredentialStealer: '2>>~:pa}w*WCE|2MVB85t/$'

验证:
  ✅ 新 regex: 真实 nc -e / wce.exe 命中, PDF 压缩流字节不命中
  ✅ BINARY_SKIP_EXTS: .pdf/.docx/.zip 跳过, .sh/.ps1/.txt 扫描
  ✅ scan() 方法已含跳过逻辑
2026-10-29 17:28:23 +08:00
5c776785b9 fix: L0-026 假损坏 zip + L1-013 内嵌 EICAR + L5-004 手工 PE 分析
对账: 162/168 通过 (96.4%),剩余 6 条为样本占位符问题

structure.py:
- _check_zip_trailing_garbage(): 新增模块级函数检测 ZIP EOCD 尾部
  多余字节(L0-026 corrupt_direntry.zip 伪装损坏模式)
- _check_embedded_eicar(): 新增模块级函数,作为 ClamAV 只匹配精确
  68B 纯 EICAR 的补充,对文本/代码文件扫描内嵌 EICAR 字节串
  (L1-013 大文件尾部含 EICAR)
- scan() 主流程在 4b/4c 后加 4d 调用 _check_embedded_eicar

binary.py:
- _manual_pe_analysis(): 新增模块级函数,pefile 解析失败时手工搜索
  PE\\0\\0 签名并解析节表 Characteristics,检测 RWX 可写可执行节
  (L5-004 假 PE,e_lfanew 偏移错误导致 pefile 报 Invalid NT Headers)
- scan() 在 pefile 异常后 fallback 调用 _manual_pe_analysis

bugfix: _check_zip_trailing_garbage 越界 crash (IndexError)
- EOCD 被截断/comment_len 溢出时跳过,不抛异常
- 修复 NEG-017 4layer_nested.zip 误触发 engine_failure fail_closed
2026-10-29 16:11:55 +08:00
1a0a24e672 fix: L0-011 双扩展名逻辑反转 + L3-009 跨行关键词预处理
- _has_double_ext(): 逻辑从 SUSPICIOUS_DOUBLE_EXT 白名单改为
  DANGEROUS_EXTS 黑名单(单一事实源),以最后一个扩展名
  是危险可执行 + 倒数第二个是安全/文档类作为判定条件
- _check_extension_mismatch(): safe_then_dangerous 硬编码链
  同样用 DANGEROUS_EXTS 替代,同时删掉冗余的局部 import
- KeywordEngine.scan(): 匹配前预处理换行符 (\r\n/\r/\n → 空串)
  解决 Invoke-Web\r\nRequest 被 CRLF 拆分导致关键词漏匹配

对账结果: 159/168 通过 (94.6%),剩余 9 条为真引擎缺失
- L0-026 假损坏 zip、L1-013 大文件内嵌 EICAR、L1-014 占位符
- L4-005/007/008/010/013 YARA 样本占位或规则缺失
- L5-004 假 PE 结构 pefile 解析失败
2026-10-29 15:59:51 +08:00
26c4ad396f feat: ClamAV 权重升级 + L3 高危关键词零容忍 + index.json 4条修正
- clamav.py: _judge_signature 默认权重 55→85,EICAR 单独 90 分
  (ClamAV 签名命中即 malware,检测到必须阻断)
- policy.yaml zero_tolerance_rules 追加 7 条:
  * Eicar-Test-Signature(双保险,权重+零容忍)
  * RemoteDownloadUnix / RemoteDownloadPowerShell
  * ReverseShellNetcat / ReverseShellPowershell
  * CredentialStealer / CredentialExport
  (步骤 -1 白名单先过滤内网地址,剩余命中步骤 0 零容忍直接 reject)
- index.json 修正 4 条翻译错误:
  恶意样本(L1-003/L3-012/L3-023/L3-025)从 pass→review

对账效果: 51 fail → 11 fail, 通过率 66% → 93.5%
2026-10-29 15:38:25 +08:00
57d89b3d05 feat: A+B 缺口全补 + README 待办记录
A 结构层小缺口 (3/3):
  ✅ structure.py 加 LongFilename 告警 (>120 字符成员名)
  ✅ extractor.py _SAFE_NAME_RE 扩展 emoji 范围 (保留 emoji 文件名不崩)
  ✅ 重生成 L0-023_5layer_nested.zip (5 层真嵌套)

B 白名单机制 (2/2):
  ✅ policy.yaml 加 keyword_whitelist (内网 IP/域名自动放行 RemoteDownloadUnix/PowerShell)
  ✅ policy.yaml 加 yara_hash_whitelist (MD5 在白名单跳过 YARA 告警)
  ✅ policy.py Property 类加两个 property 读取白名单
  ✅ policy.py PolicyEngine.decide() 步骤 -1: 白名单过滤 (优先级最高)
  ✅ scanner.py decide() 调用补传 md5

外部资源缺口 (3 条,README 已记录):
  - L1-009/010 需真实签名 .cvd 文件
  - L1-014 需压测脚本 stress_test.py

测试靶场:
  ✅ rules/test_rules.yar (7 条自动生成 YARA 规则)
  ✅ README 新增测试靶场待办 + 白名单机制说明 + 脚本清单
2026-10-29 14:40:49 +08:00
2daa3fcd3c fix: 对账 P0-P2 一轮全消 (CSV想拦35→0, CSV想放5→0)
引擎修复:
- policy.yaml allowed_extensions 补 .java/.log/.ttf/.dwg/.odt 等 20+ 类型 (白名单 gate 被拒根因)
- structure.py SuspiciousImports weight 45→25 (单一 API 不再直接 100 分 malicious)
- structure.py 新增 EncryptedArchive 显式检测 (flag_bits bit0=1)
- rules/rule_labels.yaml 新增 EncryptedArchive → 加密压缩包

样本修复:
- L0-020/021 zip_bomb 重写: DEFLATED 50×50MB/20×20MB → 膨胀比 1027x/1023x ✅ ArchiveBombSuspect reject
- L0-030 nested_traversal 重写: 真 ../穿越 + 内层 zip → PathTraversal malicious
- L0-024 encrypted 重写: flag_bits bit0=1 → EncryptedArchive suspicious

最终 P0-P2 关键修复项 9/9 通过:
  ✅ NEG-007 java clean (白名单放行)
  ✅ NEG-011 log clean (白名单放行)
  ✅ NEG-015 ttf clean (白名单放行)
  ✅ NEG-016 dwg clean (白名单放行)
  ✅ NEG-020 odt clean (白名单放行)
  ✅ L0-020 zip_bomb reject ArchiveBombSuspect
  ✅ L0-021 small_bomb reject ArchiveBombSuspect
  ✅ L0-024 encrypted suspicious EncryptedArchive
  ✅ L0-030 nested malicious PathTraversal
2026-10-29 12:02:36 +08:00
d05537e1fb feat: 靶场对齐 CSV 126 条用例
- policy.yaml: 新增 9 条恶意行为关键词规则(ReverseShell/CredentialStealer/Mimikatz/TScon 等)
- binary.py: 新增 4 条 PE 检测(UPXPackerDetected/RWXSectionDetected/PEArchInfo/DebugInformationPresent)
- console.py + test_center.html: 靶场表格最前加 case_id 列,与 CSV 用例编号一致
- docker-compose.yml: 挂载 tests/samples 为只读 volume,样本更新免 rebuild
- scripts/generate_csv_samples.py: 一键从用例.csv 生成样本 + index.json
- tests/samples/: 128 个 CSV 对齐样本文件 + index.json(93 条元数据)

引擎覆盖度: L3 12%→60%, L5 20%→55%, 总计 54%→75%
2026-10-29 11:33:58 +08:00
16f134e328 feat: MeshSafe 文件摆渡安全卫士 v1.0 初始提交
核心功能:
- 6 层检测管线: L0 结构分析 → L1 ClamAV → L2 文档深度检测 → L3 关键词匹配 → L4 YARA → L5 PE/二进制
- FastAPI + PostgreSQL + Redis + Docker Compose 架构
- 客户端 HMAC-SHA256 签名鉴权 + 限流 + 幂等性
- 控制台 UI (登录/Dashboard/诊断中心/策略管理/任务列表/测试中心/产品介绍页)
- 三层诊断定时器 (error_scan 30s / db_aggregate 30s / container_check 5min)

并发与稳定性修复:
- 诊断定时器 Redis 时间槽位锁 (多 worker 同一槽位只有一个执行)
- JSONL 存储 fcntl 跨进程排他锁 + 容错解码 + 原子重写
- 移除 SQLite fallback, 统一 PostgreSQL
- API_CLIENTS 脱敏为环境变量, .env 已 .gitignore
2026-10-28 19:07:11 +08:00