На GitHub нашли 543 тысячи ещё действующих токенов и паролей
Компания Truffle Security подвела итоги разбора открытых репозиториев GitHub на забытые учётные данные. В поле зрения попали 224 млн репозиториев и 58 млрд файлов. Среди них нашлось 543 тысячи уникальных токенов, ключей и паролей, которые к повторной проверке всё ещё принимались удалёнными службами.
Снимок платформы исследователи взяли на 7 августа прошлого года, а живость секретов проверяли в конце июля нынешнего — пробными обращениями к API, сетевым сервисам и хостам. Между архивным срезом и этой проверкой прошёл почти год, поэтому каждый подтверждённый секрет пролежал в открытом виде как минимум двенадцать месяцев. Медианное время, пока такие данные оставались доступны любому, кто открыл репозиторий, оценили в 784 дня.
Отдельные ещё рабочие ключи датированы 2009 годом: доступ, выданный на раннем этапе массового GitHub, так и не отозвали, хотя файл с ним давно мог уйти из поля зрения автора. Около 200 тысяч из найденных живых записей попали в репозитории уже после того, как GitHub по умолчанию включил блокировку утечек конфиденциальных данных и токенов на этапе push. Механизм смотрит отправляемые изменения и должен останавливать знакомые секреты до того, как они осядут в истории.
Значительная доля всё же прошла, потому что данные лежали в форматах, которые встроенная проверка не разбирает. Само включение фильтров примерно вдвое сократило утечки тех учётных данных, которые механизм умеет узнавать. Вывод отчёта не в том, что проверка бесполезна, а в том, что она закрывает узкий набор шаблонов.
Разработчики оставляют доступ в строках подключения, файлах конфигурации и ключах нестандартного вида, и именно этот остаток фильтр не видит. Платформа уверенно замечает токены распространённых служб — GitHub, AWS, Slack, SendGrid, Stripe и GCP. Мимо проходят параметры подключения к базам, ключи к API Google и закрытые ключи.
Для параметров баз и закрытых ключей остановку по умолчанию не включают намеренно: слишком высок риск принять за секрет безобидную строку и заблокировать обычную отправку кода. Ключи Google API не режут по другой причине. У них префикс AIzaSy, тот же, что у открытых ключей Google Maps, рассчитанных на встраивание в веб-страницы.
Фильтр по этому префиксу начал бы мешать обычной вёрстке карт, и секретные ключи того же семейства остаются вне автоматической остановки на push. Там, где у сервиса есть отзыв, мёртвых секретов в выборке гораздо больше, чем живых. Из 101886 токенов NPM действующим оказался один, 0,001%.
Из 73048 токенов GitHub работали 260, или 0,35%. Из 30437 токенов Hugging Face — 15, то есть 0,05%. Доля выживших ключей Stripe составила 4%, AWS и GCP — по 8%, Slack — 2%, GitLab — 0,64%.
Иная картина у данных, которые трудно погасить одной кнопкой. Из 12985 найденных параметров подключения к PostgreSQL активными остались 11465, 88%. У MySQL из 2421 строк живыми были 1806, 74%.
Из 126963 сервисных аккаунтов Google Cloud работали 69041, 54%. Из 3790 токенов Docker Hub — 1244, 33%, а из 22800 ключей SendGrid — 9189, 40%. Именно эти классы и дают основной остаток из 543 тысяч.
Ранее та же группа разобрала около 7,5 ПБ данных для обучения моделей, выложенных через Hugging Face, и нашла там 221 тысячу ещё действующих учётных данных. Два среза показывают одну дыру: секрет, однажды попавший в открытый файл, живёт дольше, чем рассчитана защита на этапе отправки, а автоматический фильтр не заменяет отзыв ключа и смену пароля у самого сервиса.