ITPub博客

首页 > 人工智能 > 人工智能 > GitHub 的密钥检测模型:以更少噪声发现更多密钥

GitHub 的密钥检测模型:以更少噪声发现更多密钥

人工智能 作者:ITPUB社群 时间:1970-01-01 08:33:46 0 删除 编辑


更高的接受率

按所有者加权的告警精确率

更低的扫描执行时间中位数

更低的推理服务成本

紧凑模型与远程 LLM 调用对比

当开发者对检测结果有信心时,密钥扫描效果最佳。检测过少,真实凭据可能残留在仓库中。告警过于频繁,开发者可能会花时间调查并非密钥的字符串。

通用密钥使这种平衡尤为困难。同一个字符串可能是真实凭据,也可能是文档占位符,因此检测它需要理解周围的代码和文本。

为应对这一挑战,我们专门针对 GitHub 的产品需求训练了一个密钥分类器:在满足大规模扫描的速度和效率要求的同时,区分真实凭据与相似字符串。

在我们的配套文章《秘密保护必须与软件同步扩展》中,我们解释了为什么秘密保护必须跟上 AI 加速开发的步伐。在这里,我们深入幕后,介绍支撑这一努力的上下文感知分类器:我们如何设计、训练和评估它,以更少的噪音发现更多真实的秘密。

我们实现了什么

GitHub 秘密扫描在两个关键时刻发挥作用:

  • 推送保护通过在推送被接受之前扫描变更,帮助防止秘密进入仓库,让开发者有机会处理发现的问题。

  • 推送后扫描在代码提交后工作,持续扫描仓库内容并在检测到潜在秘密时创建警报,以便开发者和安全团队进行调查和修复。

我们开发了一个快速分类器,与之前基于 LLM 的流水线相比,将推送后扫描的中位执行时间减少了 86%。这种效率使得将通用秘密检测扩展到推送保护变得切实可行,在开发者推送变更之前就返回结果,而不仅仅是在代码提交之后。

为什么秘密难以检测

结构化凭证通常包含独特的前缀、长度、字符集或校验和。通用秘密可能没有这些特征。它们的语法与构建标识符、校验和、资产哈希、示例值以及其他非敏感字符串重叠。上下文才是决定性的信号。

| 可能是真实凭证 | 可能是无害的相似值 |
| --- | --- |
| 在生产数据库 URL 旁分配的密码 | 测试夹具中相同形状的密码值 |
| 部署配置中的连接字符串 | 安装指南中的 localhost 连接字符串 |
| 绑定到 API(应用程序编程接口) 凭证的高熵值 | 高熵校验和、构建 ID 或资产哈希 |

这些情况是困难负样本:匹配凭证模式但并非可用凭证的字符串。添加更多规则可以抑制其中一些,但每个例外都有可能隐藏真实秘密。学习型分类器则可以利用文件路径、秘密类型、变量名以及附近代码或文本等信号。

这就是为什么我们发布了一个使用两阶段流水线的新扫描器:

  • 候选生成:正则表达式过滤器以高召回率扫描内容中的潜在秘密。此阶段经过优化,能够快速且确定性地捕获广泛的凭证类模式。

  • 上下文感知分类:一个微调的 ModernBERT 分类器评估每个候选及其周围上下文。它经过训练以识别区分真实秘密和误报的信号,包括占位符值、示例、文档片段、生成内容和非敏感标识符。由于该模型小巧且在我们的推理基础设施上运行高效,其服务成本远低于基于 LLM 的流水线,且更易于扩展。

  • 用户接受度提升 11.5%,减少了误报。

  • 推送后秘密检测执行时间加快 86%。

  • 与基于 LLM 的流水线相比,成本节省超过 98%。

我们的流水线如何工作

在扫描内容时,正则表达式模式会广泛撒网,标记出任何看起来像凭据的内容,因此真正的密钥从一开始就不会被遗漏。每个候选内容随后会交给经过微调的 ModernBERT 分类器,该分类器会结合文件路径、变量名和周围代码来读取该值。分类器会估计它是真实密钥的可能性。高置信度的发现会变成警报,而占位符、测试夹具和校验和等相似内容会在到达开发者之前被过滤掉。

我们的流水线如何工作

先广泛,后谨慎

扫描

仓库内容、提交、拉取请求以及其他被扫描的表面。

生成候选

正则表达式模式识别可能的令牌、密钥和类似凭据的字符串。

分类

经过微调的 ModernBERT 评估候选内容 + 上下文,并分配其为真实密钥的可能性。

警报或抑制

高置信度的发现会继续推进;可能的误报会被过滤。

重要的设计选择在于,模型并不取代确定性扫描,而是对其进行补充。正则表达式仍然是快速查找候选字符串的合适工具。分类器则用于机器学习最能发挥优势的地方:区分“看起来像密钥”和“很可能是真实密钥”。

一个困难负样本问题:几乎看起来像真的密钥

大多数误报并非随机产生。它们是困难负样本:匹配凭据模式但并非可用凭据的字符串。示例包括文档占位符、测试中的玩具示例、脱敏值、非敏感 ID 以及生成的测试夹具。这些情况对正则表达式来说很容易匹配,而对纯基于规则的系统来说,要在不意外丢失真实密钥的前提下抑制它们则很困难。

ModernBERT 之所以有帮助,是因为它可以结合附近的代码和文本一起读取候选内容,提供与 LLM 相当的情境理解能力,同时没有生成自然语言输出所带来的延迟和计算开销。例如,一个候选内容周围出现“example”“dummy”“fake”或“replace-me”等词时,其风险可能低于部署文件中赋值给环境变量的候选内容。分类器从标注示例中学习这些上下文差异,而不需要工程师将每个例外都编码为另一条规则。

我们选择 ModernBERT,是因为它非常适合这一工作负载:紧凑、高效,并且非常适合对代码相邻文本进行分类。对于密钥扫描,模型需要在短候选窗口上以高吞吐量和低延迟做出经过校准的决策。

这使得经过微调的编码器分类器,在流水线的这一阶段比通用 LLM 具有更好的服务形态。模型可以直接在我们的决策边界上进行训练,并使用对密钥扫描质量至关重要的相同召回率和精确率指标进行评估。

我们如何训练

挑战在于为仅凭语法会产生误导的情况找到具有代表性的数据。训练和评估策略结合了三个来源:

  • 来自 GitHub 仓库的产品衍生示例,使用密钥检测体验中的反馈以及额外的人工验证。

  • 来自 GitHub 仓库数据的高召回率正则候选,包括人工标注示例和用于扩大覆盖范围的弱标签。

  • 针对稀疏和困难情况的合成示例,例如文档密钥、测试夹具、公钥、校验和、结构化相似项以及近似命中对。

合成数据行在纳入之前会通过确定性验证和基于模型的质量审查。训练重点放在真实密钥、现实误报以及经常迷惑纯正则方法的困难负样本上。每个模型输入都包含候选值、文件路径、密钥类型以及有限数量的周围上下文。我们通过离线评估选择阈值,然后在更广泛推广之前,在类生产流量上验证行为。

在拆分数据之前,我们将共享同一仓库、候选值或示例的行分组,以避免近似重复项同时出现在训练和评估中。

训练聚焦于对告警质量最重要的案例:真实密钥、现实误报,以及正则表达式经常匹配到的困难负样本。输入表示包括候选密钥字符串、文件路径、类型以及有限数量的周围上下文。输出是分类分数,供扫描器用于决定该候选是否应继续处理。

我们针对产品权衡进行了优化:在保持或提升召回率的同时,减少误报并降低服务成本。在实践中,这意味着分类器阈值通过离线评估选定,然后在推广前针对类生产流量进行验证。

最重要的训练原则是让模型看到那些容易混淆的示例。我们纳入了在语法上与真实密钥相似但语义不同的候选样本,这样模型不仅能学会密钥长什么样,还能学会在上下文中误报长什么样。

训练后的模型以 8 位量化导出为 ONNX 格式,从而实现快速推理。

评估结果

| 线上结果 | 与之前 LLM 流水线相比的变化 | 衡量内容 |
| --- | --- | --- |
| 按仓库所有者加权的接受率 | 提高 11.5% | 客户对检测发现的接受程度 |
| 推送后扫描执行时间中位数 | 降低 86% | 生产扫描执行时间 |
| 服务成本 | 降低超过 98% | 紧凑分类器与远程 LLM 调用相比的成本 |

我们在生产环境中分两个阶段评估了新流水线的影响:首先在相同的公共流量上与生产基线对比,然后通过客户 A/B 实验进行验证。

  • 离线评估:在推送后扫描中,新流水线在相同公共流量上评估时,相比之前的 LLM 流水线实现了 13% 更高的精确率和 19% 更高的召回率。

  • 在线评估:随后我们通过针对之前 LLM 流水线的 A/B 实验,验证这些质量改进是否转化为客户成果。按仓库所有者加权的接受率提高了 11.5%。我们按仓库所有者对接受率进行加权,以减少一次性批量解决大量告警的客户带来的影响,否则这可能会扭曲简单平均值。

带走这些经验

最好的安全工具是开发者足够信任并愿意使用的工具。更高的精确率意味着更少分散注意力的告警。更高的召回率意味着捕获更多真实密钥。更低的成本意味着我们可以持续改进覆盖范围,而不会让扫描成本高得不可接受。

对于开发者和安全团队来说,这应转化为更少的误报,以及在最可能引入密钥的地方获得更快的反馈:提交、拉取请求和日常开发工作流。

混合系统很强大。Regex 为我们带来速度、透明度和广泛的候选覆盖。ModernBERT 为我们带来学习到的上下文理解能力和误报减少。在这一产品约束下,两者的组合优于单独使用任一方法。

我们还了解到,模型大小并不等同于模型有用性。当任务范围较窄、决策边界可衡量且服务效率至关重要时,更小的微调分类器可能是正确答案。

这是让机密扫描更准确、更具可扩展性且更易于使用的一步。展望未来,我们专注于两个领域:

  • 构建持续改进的飞轮。我们将利用生产反馈循环来识别新的漏报和误报,将真实世界的信号转化为更高质量的训练和评估数据。

  • 探索新的模型架构。我们正在研究能够在单一步骤中执行机密检测和提取的方法,在保持准确性和规模的同时降低流水线复杂性。



转载声明:本文为转载整理,原文版权归原作者及原站点所有。

原文来源:GitHub Blog

原创地址:https://github.blog/ai-and-ml/githubs-model-for-secret-detection-finding-more-secrets-with-less-noise/

原文作者:Batu Ozturkler, Shengyu Fu;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-11-21

  • 博文量
    1148
  • 访问量
    548126