Безопасность

«11,5% принятых предупреждений и на 86% быстрее»: GitHub заменил LLM-конвейер поиска секретов на компактный ModernBERT-классификатор

GitHub раскрыл внутреннее устройство нового сканера секретов: широкий отбор кандидатов остаётся за регулярными выражениями, а решение «это настоящий секрет или похожая на него строка» принимает дообученный классификатор ModernBERT, который читает значение вместе с путём файла, именами переменных и окружающим кодом. По данным компании, принятие предупреждений владельцами репозиториев выросло на 11,5%, медианное время пост-пуш сканирования упало на 86%, а стоимость обслуживания — более чем на 98% по сравнению с прежним конвейером на удалённых вызовах языковой модели.

«11,5% принятых предупреждений и на 86% быстрее»: GitHub заменил LLM-конвейер поиска секретов на компактный ModernBERT-классификатор

Секрет, который не отличить от чека

Структурные учётные данные легко узнать по префиксу, длине, алфавиту или контрольной сумме, а обобщённые секреты — нет: их синтаксис пересекается с идентификаторами сборок, контрольными суммами, хешами ассетов и примерами значений, поэтому решающим сигналом становится контекст.

Одна и та же строка может быть настоящим паролем рядом с боевым адресом базы данных или безобидной заглушкой в тестовом примере, а похожее на ключ высокоэнтропийное значение — контрольной суммой или идентификатором сборки.

Такие строки в GitHub называют hard negatives: они совпадают с шаблоном учётных данных, но рабочими секретами не являются. Набор правил подавляет часть таких совпадений, однако каждое исключение рискует спрятать настоящий секрет — поэтому вместо правил компания обучила классификатор, который смотрит на путь к файлу, тип секрета, имена переменных и окружающий код.

Регулярные выражения — за кандидатов, модель — за решение

Новый сканер собран как двухэтапный конвейер: сначала регулярные выражения с высокой полнотой быстро и детерминированно ищут всё, что похоже на учётные данные, затем каждый кандидат вместе с контекстом оценивает дообученный классификатор ModernBERT, обученный отличать настоящие секреты от заглушек, примеров, фрагментов документации, сгенерированного контента и нечувствительных идентификаторов.

Модель не заменяет детерминированное сканирование, а дополняет его: регулярные выражения отвечают за скорость, прозрачность и широкий охват кандидатов, а машинное обучение — за понимание контекста и снижение ложных срабатываний.

Классификатор компактен и дешёв в обслуживании, и именно это позволило распространить поиск обобщённых секретов на push protection — проверку до того, как изменения приняты в репозиторий, а не только после коммита. Обученная модель экспортируется в формат ONNX с 8-битным квантованием, что даёт быстрый вывод.

Как собирали данные

Тренировочная выборка собиралась из трёх источников: примеров из репозиториев GitHub с обратной связью от самого продукта и ручной валидацией, кандидатов регулярных выражений из данных репозиториев с ручной разметкой и слабыми метками, а также синтетических примеров для редких и сложных случаев — секретов в документации, тестовых фикстур, публичных ключей, контрольных сумм и пар «почти секрет».

Синтетические строки проходят детерминированную проверку и модельный контроль качества, а до разделения данных строки с общим репозиторием, значением-кандидатом или примером группируются, чтобы почти-дубли не попадали одновременно в обучение и оценку.

Главный принцип обучения — показать модели именно сбивающие с толку примеры: рядом с «example», «dummy», «fake» или «replace-me» кандидат считается менее рискованным, чем значение, присвоенное переменной окружения в файле развёртывания.

Что показали цифры

Принятие предупреждений, взвешенное по владельцам репозиториев, выросло на 11,5%, медианное время пост-пуш сканирования снизилось на 86%, а стоимость обслуживания упала более чем на 98% по сравнению с конвейером на удалённых вызовах LLM.

Взвешивание по владельцу снижает влияние клиентов, которые массово закрывают большие объёмы предупреждений и иначе искажают простое среднее.

На офлайн-оценке, на том же публичном трафике, новый конвейер дал на 13% выше точность и на 19% выше полноту, чем прежний LLM-конвейер.

Почему это стало срочным

В сопроводительном эссе GitHub приводит масштаб, на фоне которого шла эта работа: сегодня каждый третий pull request на платформе создаётся с участием ИИ-агента, тогда как год назад таких было меньше одного из десяти.

Новый секрет появляется в публично видимом коде примерно раз в две секунды и удваивается каждый год последние три года, а между вторым кварталом 2024-го и вторым кварталом 2026-го число проверенных пушей выросло в 2,84 раза против 2,59 раза у пушей с учётными данными.

Там же сказано, что модель оценивает весь набор кандидатов меньше чем за две миллисекунды и может более чем удвоить число секретов, которые удаётся предотвратить.

Что дальше

GitHub называет два направления: построить контур непрерывного улучшения на продуктовой обратной связи, чтобы находить новые ложные пропуски и ложные срабатывания, и исследовать архитектуры, которые умеют находить и извлекать секрет за один шаг.

Отдельный вывод статьи — размер модели не равен её полезности: маленький дообученный классификатор оказывается верным ответом там, где задача узкая, граница решения измерима, а эффективность обслуживания критична.

Первоисточники

  1. The GitHub Blog — «GitHub’s model for secret detection: Finding more secrets with less noise» (Batu Ozturkler, Shengyu Fu, 13 октября 2026)
  2. The GitHub Blog — «Secret protection must scale with software» (Erin Havens, 7 октября 2026)