文件: internal/tool/file_guard.go:161-193(关键 :178)
问题: 含 ** 的 pattern 按第一个 ** 切分后,prefix 部分只用 == / HasPrefix 字面量比较,prefix 中的 、?、[...] 通配符不展开(suffix 部分却走 filepath.Match 完整 glob)。上游 matchProtectedPattern 注释明确承诺 glob 语义(.env、src/secrets/),且不含 ** 的 pattern 走 filepath.Match 全展开——语义上更宽的 src/*-gen/ 保护力反而更弱。
触发场景(复核实测确认):
- matchGlob("src/*-gen/**", "src/a-gen/secret.key") = false(期望 true)
- IsProtected 全链路确认不拦截——写入保护静默失效(fail-open),无任何告警
预期 vs 实际: 预期 src/-gen/** 保护所有 src/<任意>-gen/ 子树;实际不存在字面量叫 src/-gen 的路径,保护完全失效。
修复建议: prefix 改为按 / 切段逐段 filepath.Match,与 suffix 处理对齐;补测试(src/*-gen/** vs src/a-gen/x、src/[ab]/** vs src/a/x)。顺带考虑 **/空 prefix 分支仅匹配 basename 的深层后缀限制。
严重程度: Medium-High(安全控制静默失效,仅用户配置通配 prefix 时触发;独立复核实测确认)
文件: internal/tool/file_guard.go:161-193(关键 :178)
问题: 含 ** 的 pattern 按第一个 ** 切分后,prefix 部分只用 == / HasPrefix 字面量比较,prefix 中的 、?、[...] 通配符不展开(suffix 部分却走 filepath.Match 完整 glob)。上游 matchProtectedPattern 注释明确承诺 glob 语义(.env、src/secrets/),且不含 ** 的 pattern 走 filepath.Match 全展开——语义上更宽的 src/*-gen/ 保护力反而更弱。
触发场景(复核实测确认):
预期 vs 实际: 预期 src/-gen/** 保护所有 src/<任意>-gen/ 子树;实际不存在字面量叫 src/-gen 的路径,保护完全失效。
修复建议: prefix 改为按 / 切段逐段 filepath.Match,与 suffix 处理对齐;补测试(src/*-gen/** vs src/a-gen/x、src/[ab]/** vs src/a/x)。顺带考虑 **/空 prefix 分支仅匹配 basename 的深层后缀限制。
严重程度: Medium-High(安全控制静默失效,仅用户配置通配 prefix 时触发;独立复核实测确认)