Баг в нашем сканере секретов, который не нашли канарейки

Доставка

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

Как шлюз читает секреты

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

Баг

Для строки вида:

DB_PASSWORD='Tr0ub4dor-and-3'  # обновлён в мае

парсер удалял окружающие кавычки, только если значение начиналось и заканчивалось символом кавычки. Если после значения шёл комментарий, строка заканчивалась буквой, поэтому кавычки оставались. Затем отрезался комментарий, и шлюз продолжал искать 'Tr0ub4dor-and-3', включая кавычки. Набор, содержащий пароль без этих кавычек, прошёл бы проверку.

Почему канарейки этого не заметили

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

Как мы это нашли

Мы превращали шлюз в отдельный продукт и написали тест, который подавал ему конфиг-файл в тех форматах, в которых люди реально пишут: export, кавычки, комментарии в конце строки. Тест упал на строке с кавычками и комментарием. Исправление читает значение в кавычках до закрывающей кавычки и игнорирует всё, что идёт после.

Имело ли это значение?

Мы проверили это до внесения изменений. На нашей сборочной машине шлюз считывает 133 секретных значения из 59 переданных ему файлов, а на второй машине — 499; ни одно из них не имело такой формы. Ни один из предыдущих вердиктов не изменился: каждый выпущенный нами набор был просканирован на те же значения, что и сейчас. Тем не менее мы исправили шлюз на всех трёх машинах.

Главный вывод

Если сканер извлекает то, что ищет, проверяйте извлечение на реалистичных данных, а не только поиск на заранее подставленных значениях. Канарейка доказывает, что сеть работает, но ничего не говорит о том, попадают ли в неё нужные рыбы. Тесты Secret Gate теперь покрывают оба аспекта, и перед релизом мы убедились, что он считывает ровно те же 133 значения, что и наш контрольный шлюз сборки.

Обновлено: