Помилка в нашому сканері секретів, яку не змогли знайти канарі
Доставка
Перш ніж будь-який набір, який ми продаємо, буде запакований, шлюз сканує його на наявність фактичних значень наших власних секретів. Кожне сканування починається з розміщення канарі, по одному кожного типу, і не запускається, якщо не знайде всі вони. Вони завжди знаходилися. Але помилка все одно була.
Як шлюз читає секрети
Шлюз шукає не лише те, що має форму ключів. Він читає файли, де зберігаються наші секрети (env-файли, конфіги JSON, файли ключів), бере кожне значення, назва якого вказує на секретність, і потім шукає в тому, що ми збираємося відправити, ці точні значення, як у записаному вигляді, так і в кодуванні base64.
Помилка
Для рядка на кшталт цього:
DB_PASSWORD='Tr0ub4dor-and-3' # оновлено в травні
зчитувач видаляв лапки навколо значення лише тоді, коли значення починалося і закінчувалося символом лапок. Якщо після значення йшов коментар, рядок закінчувався літерою, тому лапки залишалися. Коментар обрізали наступним кроком, і шлюз продовжував шукати 'Tr0ub4dor-and-3', разом із лапками. Набір, що містив пароль без цих лапок, пройшов би перевірку.
Чому канарі нічого не помітили
Канарі перевіряє мережу: розміщуємо значення, яке сканер уже знає, і перевіряємо, чи воно знайдене. Наші значення канарі передавалися сканеру напряму, тому вони не проходили через код, що читає рядок конфігурації. Кожну мережу перевірили, а парсер перед ними — ні.
Як ми це виявили
Ми перетворювали шлюз на окремий продукт і написали тест, який подавав йому конфігураційний файл у форматах, які люди насправді пишуть: export, лапки, кінцеві коментарі. Тест не пройшов на рядку з лапками та коментарем. Виправлення читає значення в лапках до закритої лапки та ігнорує все, що йде далі.
Чи мало це значення?
Ми перевірили, перш ніж щось змінювати. На нашій машині збірки шлюз зчитує 133 секретні значення з 59 наданих файлів, а на другій машині — 499; жодне з них не мало такої форми. Жоден попередній висновок не змінився: кожен випущений нами набір сканувався на ті самі значення, на які сканувався б зараз. Ми все одно виправили шлюз на всіх трьох машинах.
Головний висновок
Якщо сканер вилучає те, що шукає, перевіряйте вилучення на реалістичних вхідних даних, а не лише пошук на закладених значеннях. Канарейка доводить, що сітка працює, але нічого не каже про те, чи потрапляють до неї потрібні риби. Тести Secret Gate тепер охоплюють обидва випадки, і перед релізом ми переконались, що він зчитує ті самі 133 значення, що й наш контрольний шлюз.