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