Skip to content

v0.9.2

Choose a tag to compare

@github-actions github-actions released this 09 Oct 13:32
· 298 commits to main since this release

[0.9.2] - 2026-10-10

空运行检测器跳过(性能 P0-5)

  • sizeof_misuse / unchecked_return 空运行跳过:启动前轻量预扫是否有触发形态(sizeof(标识符) 处于 size 上下文 / 存在 unchecked-return API 或分配器调用),无则跳过昂贵的跨文件 typedef 表与 passthrough 修复点。预扫出错时 fail-open 照常运行完整检测,不引入漏报。

integer-overflow 截断累加器误报(CWE-190)

  • unsigned_sub_underflow 截断累加器抑制(P1-2):size - count 中 count 若只由截断式格式化包装器累加(count += snprintf_truncated_s(...) / count = count + sprintf_s(...)),则按契约 count 不超过 size,该减法不会下溢,不再发 unsigned_sub_underflow。仅匹配 *truncated*(含 printf/sprintf)与精确 sprintf_s/vsprintf_s,snprintf/snprintf_s(返回值可超界)不匹配,保持保守。回归夹具:tc128_int_overflow_snprintf_accumulator.c。

race-condition 锁封装函数识别(CWE-362)

  • 纯 lock/unlock 封装函数对(P1-4):xxx_lock()(函数体仅 pthread_mutex_lock(&g_mutex))与 xxx_unlock() 视为与直接原语等价,位于两者之间的共享状态写不再被误报为 shared_data_race。仅当函数体只有 lock(或只有 unlock)调用、无其它调用时才识别为纯封装,关键段 helper 不算。回归夹具:tc129_race_lock_wrapper.c。

resource-leak 自动确认误报修复(CWE-404)

生产环境反馈 0.9.2 的 resource-leak 自动确认(auto-confirmed)包含大量确定性误报,是"几乎无法使用"的主要原因。本轮针对两大非泄漏模式去掉自动确认(仍保留为 suspected 交由 AI 研判,不丢召回):

  • 锁配对(P0-1):xxx_lock() 内 pthread_mutex_lock(&g_mutex)、同文件 xxx_unlock() 内 pthread_mutex_unlock(&g_mutex) 的标准封装函数对,以及 pthread_rwlock_rdlock/wrlock 配对,不再标记 definite(跨函数解锁在本函数内不可证,不能 auto-confirm)。
  • 全局/静态变量持有(P0-2):g_handler = iconv_open(...)、g_handle = dlopen(...)、g_fd = epoll_create(...) 及函数内 static 局部缓存等进程生命周期资源持有,不再标记 definite。findLocalVarsFrom 同步将 static 局部视为非局部(逃逸),消除 memory-leak / resource-leak 两侧的静态缓存误报。

divide-by-zero 跨文件常量除数(CWE-369)

  • 跨文件 #define 常量解析:x / NLOG_SECOND_PER_MINUTE 这类除数宏定义在 .h 头文件时,此前每文件常量表看不到、被误报为"可能为零"。现改用 buildGlobalConstants 合并所有已索引文件(含头文件)的编译期常量(冲突值保守地降为"不确定"),头文件里的非零常量除数像字面量一样被丢弃。回归夹具:tc127_divide_by_zero_crossconst/。

生产内存分配模式识别(对齐 docs/req_内存分配释放典型性优化.md)

  • 第三方 SDK 分配/释放名进入精确集合:VOS_Malloc_F / VOS_Free_F、HpeMemAlloc / HpeMemFree、VOS_Mem_Allock_F / VOS_Mem_ReAllock_F / VOS_MemFree_F 加入 BuiltinAllocators / BuiltinDeallocators,使 null-deref 确认层与 double-free / UAF / unchecked-return 检测器像对待 malloc/free 一样精确对待这些跨仓库 SDK 宏,而非依赖 fail-open 命名启发式。
  • "封装成函数"包装器识别(新增能力):识别"函数体返回分配器结果"的包装器(p = malloc(n); if(!p) return NULL; memset_s(...); return p;),即使包装器名不含 alloc/malloc 子串,调用方的未释放结果也会被检出为泄漏(memory-leak)。这是 40+ 个仓库各自命名、但都"判空 + memset_s 初始化后返回指针"的共性形态。
  • 回归夹具:tc123_resleak_lock_pair.c、tc124_resleak_global_hold.c、tc125_prod_alloc_macros.c、tc126_passthrough_alloc_wrapper.c。

AI 复核 auto-confirmed 结果(新能力)

  • 新增 secguard review-autoconfirmed 命令:对 sgre 判定为 auto-confirmed 的 finding 做一次独立 AI 复核,降低 pipeline 自动确认的误报、恢复 AI 研判价值。支持 --scan-id / --type / --limit / --dry-run / --status / --output-json。
  • 复核结论复用现有 findings.review_status 第二遍字段:false_positive 映射为 dismissed(真正过滤)、ai_confirmed 映射 confirmed、needs_more_evidence 保守保留原 confirmed,并在 result.sarif 以 review_status 属性暴露供观测。
  • review_error(复核调用失败)只写日志、不落库、不进 result.sarif:finding 保持未复核并在下次运行时自然重试,避免"复核失败却仍标 confirmed"误导用户。
  • 完整复核审计(supporting/contradicting/missing 证据数组、模型/provider、prompt/schema 版本、源码 revision、confidence、耗时)合并进 properties.review,与 auto_confirm_evidence 共存,不污染原始机器结论。
  • 扫描时记录源码 revision(scan_runs.source_revision),复核时校验 revision 一致性;payload 修复绝对路径解析与路径穿越防护。
  • 新增 [ai_review] 配置:provider / model / endpoint / api_key_env / timeout_ms / max_retries / budget_usd / cost_per_call_usd / prompt_version / schema_version。