Bugul din scanerul nostru de secrete pe care canarii nu l-au găsit
Livrare
Înainte ca orice kit pe care îl vindem să fie arhivat, un mecanism de siguranță îl scanează după valorile reale ale propriilor noastre secrete. Fiecare scanare începe prin plantarea de canari, câte unul din fiecare tip, și refuză să ruleze dacă nu îi prinde pe toți. I-a prins întotdeauna. Totuși, avea un bug.
Cum citește mecanismul de siguranță secretele
Mecanismul de siguranță nu caută doar elemente care au forma unor chei. Citește fișierele în care se află secretele noastre (fișiere env, configurații JSON, fișiere de chei), preia fiecare valoare al cărei nume indică faptul că este secretă și apoi caută în ceea ce urmează să livrăm acele valori exacte, atât în forma scrisă, cât și codificate base64.
Bugul
Pentru o linie precum aceasta:
DB_PASSWORD='Tr0ub4dor-and-3' # rotit în mai
cititorul elimina ghilimelele din jurul valorii doar dacă aceasta începea și se termina cu un caracter de ghilimele. Cu un comentariu după valoare, linia se termină cu o literă, deci ghilimelele rămâneau. Comentariul era tăiat în pasul următor, iar mecanismul de siguranță continua să caute 'Tr0ub4dor-and-3', cu ghilimele incluse. Un kit care conținea parola fără acele ghilimele ar fi trecut.
De ce nu l-au observat niciodată canarii
Un canar testează o plasă: plantezi o valoare pe care scanerul o cunoaște deja și verifici dacă este găsită. Valorile noastre canar erau transmise direct scanerului, deci nu treceau niciodată prin codul care citește o linie de configurare. Fiecare plasă a fost testată, dar parserul din fața lor nu.
Cum l-am găsit
Transformam mecanismul de siguranță într-un produs propriu și am scris un test care îi oferea un fișier de configurare în formatele pe care oamenii le scriu de fapt: export, ghilimele, comentarii la final. Testul a eșuat pe linia cu ghilimele și comentariu. Remedierea citește o valoare între ghilimele până la ghilimeaua de închidere și ignoră tot ce urmează.
A avut importanță?
Am verificat înainte de a schimba orice. Pe mașina noastră de build, mecanismul de siguranță citește 133 de valori secrete din cele 59 de fișiere primite, iar pe o a doua mașină 499; niciuna nu avea acea formă. Niciun verdict anterior nu se schimbă: fiecare kit pe care l-am lansat a fost scanat după aceleași valori pentru care ar fi scanat și acum. Am remediat mecanismul de siguranță pe toate cele trei mașini oricum.
Concluzia
Dacă un scaner extrage ceea ce caută, testează extragerea cu date reale, nu doar căutarea cu valori植入. Un canary dovedește că plasa funcționează; nu spune nimic despre faptul că peștii potriviți ajung vreodată la ea. Testele pentru Secret Gate acoperă acum ambele aspecte, iar înainte de lansare am verificat că citește exact aceleași 133 de valori ca și build gate-ul nostru.