Błąd w naszym tajnym skanerze, którego kanarki nie wykryły
Wysyłka
Zanim jakikolwiek sprzedawany przez nas zestaw zostanie spakowany, bramka skanuje go pod kątem rzeczywistych wartości naszych własnych sekretów. Każdy skan zaczyna się od umieszczenia kanarek, po jednej każdego rodzaju, i nie uruchamia się, dopóki nie wykryje wszystkich. Zawsze je wykrywała. Mimo to zawierał błąd.
Jak bramka odczytuje sekrety
Bramka nie szuka tylko rzeczy przypominających kształtem klucze. Odczytuje pliki, w których znajdują się nasze sekrety (pliki env, konfiguracje JSON, pliki kluczy), pobiera każdą wartość, której nazwa wskazuje, że jest sekretem, a następnie przeszukuje to, co zamierzamy wysłać, pod kątem tych dokładnych wartości, zarówno w postaci zapisanej, jak i zakodowanej w base64.
Błąd
Dla linii takiej jak ta:
DB_PASSWORD='Tr0ub4dor-and-3' # rotacja w maju
czytnik usuwał otaczające cudzysłowy tylko wtedy, gdy wartość zaczynała się i kończyła znakiem cudzysłowu. Gdy po wartości znajdował się komentarz, linia kończyła się literą, więc cudzysłowy pozostały. Komentarz został następnie odcięty, a bramka przeszukiwała dalej 'Tr0ub4dor-and-3', wraz z cudzysłowami. Zestaw zawierający hasło bez tych cudzysłowów przeszedłby kontrolę.
Dlaczego kanarki nigdy tego nie zauważyły
Kanarka testuje sieć: umieszcza wartość, którą skaner już zna, i sprawdza, czy zostanie ona wykryta. Nasze wartości kanarkowe były przekazywane bezpośrednio do skanera, więc nigdy nie przechodziły przez kod odczytujący linię konfiguracji. Każda sieć była testowana, ale parser przed nią – nie.
Jak to znaleźliśmy
Przekształcaliśmy bramkę w samodzielny produkt i napisaliśmy test, który podawał jej plik konfiguracyjny w formatach, które ludzie faktycznie piszą: export, cudzysłowy, komentarze na końcu. Test nie powiódł się dla linii z cudzysłowami i komentarzem. Poprawka polega na odczytywaniu wartości w cudzysłowach do zamykającego cudzysłowu i ignorowaniu wszystkiego, co następuje po nim.
Czy to miało znaczenie?
Sprawdziliśmy to przed wprowadzeniem jakichkolwiek zmian. Na naszej maszynie budującej bramka odczytuje 133 wartości sekretów z 59 plików, które jej podano, a na drugiej maszynie 499; żadna z nich nie miała takiego kształtu. Żadna wcześniejsza decyzja się nie zmienia: każdy zestaw, który wydaliśmy, był skanowany pod kątem tych samych wartości, które byłyby skanowane teraz. Mimo to naprawiliśmy bramkę na wszystkich trzech maszynach.
Wniosek
Jeśli skaner wyciąga to, czego szuka, przetestuj wyciąganie na realistycznych danych wejściowych, a nie tylko wyszukiwanie z podstawionymi wartościami. Kanarek dowodzi, że sieć działa; nic nie mówi o tym, czy właściwe ryby w ogóle do niej trafiają. Testy Secret Gate obejmują teraz oba aspekty, a przed wydaniem sprawdziliśmy, że odczytuje dokładnie te same 133 wartości co nasza bramka kompilacji.