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 新增测试靶场待办 + 白名单机制说明 + 脚本清单
This commit is contained in:
@@ -869,6 +869,7 @@ class StructureEngine(Engine):
|
||||
total_uncompressed = 0
|
||||
executable_members: List[str] = []
|
||||
traversal_members: List[str] = []
|
||||
long_filename_members: List[str] = []
|
||||
member_count = 0
|
||||
encrypted_count = 0
|
||||
|
||||
@@ -886,6 +887,8 @@ class StructureEngine(Engine):
|
||||
traversal_members.append(name)
|
||||
if info.flag_bits & 0x1: # ZIP 加密标志(bit 0)
|
||||
encrypted_count += 1
|
||||
if len(os.path.basename(name)) > 120:
|
||||
long_filename_members.append(name)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
return [
|
||||
Finding(
|
||||
@@ -970,6 +973,18 @@ class StructureEngine(Engine):
|
||||
)
|
||||
)
|
||||
|
||||
if long_filename_members:
|
||||
findings.append(
|
||||
Finding(
|
||||
engine=self.name,
|
||||
layer=self.layer,
|
||||
severity=Severity.LOW.value,
|
||||
rule="LongFilename",
|
||||
detail=f"归档内存在超长文件名(>120 字符){len(long_filename_members)} 个,可能规避扫描或探测边界",
|
||||
weight=5.0,
|
||||
)
|
||||
)
|
||||
|
||||
return findings
|
||||
|
||||
def _inspect_tar(self, target: ScanTarget, max_ratio: int, max_total: int) -> List[Finding]:
|
||||
|
||||
Reference in New Issue
Block a user