CI — Continuous integration или непрерывная интеграция, это практика, которая подразумевает постоянное слияние рабочих копий в общую основную ветвь разработки, а также проведение автоматических сборок, тестирований и запусков. Все это позволяет быстро выявлять всевозможные ошибки и баги, исправляя их как можно скорее, прежде чем проблемы успеют «прорасти» в код.
Одним из наиболее известных CI-сервисов является Travis CI, поддерживающий интеграцию с GitHub, но существуют и другие решения, такие как Circle CI и GitLab CI. Как и любые другие веб-приложения, CI-сервисы ведут журналы всего происходящего, а одним из важнейших среди них является build-лог. Так как во время процесса сборки необходимо взаимодействие с различными удаленными серверами и API, требуется использование самых разных паролей, ключей SSH или токенов API, которые в итоге могут оседать в логах.
Несколько лет назад ИБ-специалисты уже обнаруживали проблему, связанную с логами Travis CI: находили в журналах ключи API и прочие закрытые данные, а злоумышленники пользовались случаем и тоже искали забытые в логах секреты. В итоге разработчики Travis CI предприняли меры против таких утечек, например, запустили в работу шаблоны, которые обнаруживают пароли или токены API и заменяют их в логах на [secure].
Теперь, спустя несколько лет, сводная группа из семи ИБ-специалистов обнаружила, что, невзирая на все усилия разработчиков и защитные меры, в журналах Travis CI, Circle CI и GitLab CI по-прежнему можно найти не предназначенную для широкой публики информацию.
Исследователи несколько месяцев сканировали build-логи CI, и в итоге обнаружили утечки конфиденциальных данных у таких компаний, как Grammarly, Discourse и неназванной криптовалютной программы. Преимущественно эксперты обнаруживали в журналах токены GitHub.
Кроме того, аналитики отмечают, что теперь злоумышленники могут применять другую тактику: искать в CI-логах такие словосочетания, как «is not in the npm registry», «No matching distribution», «Could not find a valid gem». Все перечисленное — это ошибки, возникающие после удаления библиотек из npm, PyPI или RubyGems. Таким образом атакующие могут узнавать имена «мертвых» пакетов, которые, тем не менее, все еще используются в активных проектах.