学习精选 · AI 工具
AI 学习经验

GitHub 如何用小型分类模型做密钥扫描:误报更少、速度快 86%

GitHub Blog2026-10-13约 3 分钟读完AI 整理查看原文

GitHub 把密钥扫描改成两段式:先用正则表达式大范围找出候选字符串,再用微调过的 ModernBERT 结合文件路径、变量名和上下文判断它是不是真密钥。结果用户接受率提升 11.5%,扫描耗时下降 86%,服务成本降低 98%。

今天就能做

  • 如果你在做内容审核、风控或任何“高召回候选 + 精判”的场景,可以照搬这个结构:规则先捞全,小模型再判准。
  • 训练分类器时,把最容易混淆的 hard negative(占位符、测试数据、校验和)当成重点样本,而不是只堆正例。
  • 划分训练集和评估集前,按仓库、候选值等维度分组去重,避免近似样本泄漏导致指标虚高。

要解决的问题:误报和漏报的平衡

  • 密钥扫描有两个时机:push protection 在推送前拦截,post-push scanning 在提交后持续扫描并生成告警。
  • 告警太少,真凭证会留在仓库里;告警太多,开发者会把时间花在排查假密钥上。
  • 通用密钥没有固定前缀、长度或校验位,语法上常和构建 ID、校验和、资源哈希、示例值撞车,只能靠上下文区分。

两段式流水线怎么跑

  • 第一步用正则表达式做候选生成,追求高召回,快速、确定性地把像凭证的字符串都找出来。
  • 第二步把候选值连同文件路径、变量名、周边代码和文本一起交给微调后的 ModernBERT 分类器,输出它是真密钥的概率。
  • 高置信度的进入告警,占位符、测试 fixture、校验和这类假密钥在到达开发者之前就被过滤掉。
  • 模型不替代正则,只补在机器学习最有价值的一环:区分“看起来像密钥”和“很可能是真密钥”。

为什么选 ModernBERT 而不是通用 LLM

  • 分类任务只需要在短候选窗口上做校准判断,要求高吞吐、低延迟,编码器结构比生成式 LLM 更合适。
  • 模型小、推理成本低,相比原来的 LLM 流水线服务成本降低 98%,也更容易扩容。
  • 效率提升让通用密钥检测能前移到 push protection,在推送前就返回结果,而不只是提交后扫描。

训练数据与防泄漏

  • 数据来自三处:GitHub 仓库的产品反馈加人工校验、高召回正则候选加人工标注和弱标签、针对稀疏难例合成的样本。
  • 合成样本覆盖文档里的密钥、测试 fixture、公钥、校验和、结构化相似串和近似对,入库前要过确定性校验和模型质量复核。
  • 每条输入包含候选值、文件路径、密钥类型和有限长度的上下文。
  • 划分数据集前,把共享仓库、候选值或示例的行分到同一组,避免近似重复同时出现在训练集和评估集。
  • 阈值先在离线评估里选,再在生产流量上验证后才扩大上线。

实际效果

  • 用户接受率提升 11.5%,说明误报减少。
  • post-push 扫描的中位执行时间下降 86%。
  • 相比 LLM 流水线,服务成本降低超过 98%。

原文:GitHub’s model for secret detection: Finding more secrets with less noise

来源:GitHub Blog · 2026-10-13

查看原文

本文由 AI 阅读原文后整理,未经人工逐字核对,内容以原文为准。

登录后可以点赞、查看和发表评论