Buggen i vår hemliga skanner som canaries inte kunde hitta
Leverans
Innan något verktygspaket vi säljer zippas, skannar en grind de faktiska värdena på våra egna hemligheter. Varje skanning börjar med att plantera canaries, en av varje sort, och vägrar köra om den inte fångar alla. Den fångade alltid alla. Den hade fortfarande en bugg.
Hur grinden läser hemligheter
Grinden letar inte bara efter saker som är formade som nycklar. Den läser filerna där våra hemligheter finns (env-filer, JSON-konfigurationer, nyckelfiler), tar varje värde vars namn säger att det är hemligt, och söker sedan i det vi är på väg att skicka efter exakt dessa värden, så som de är skrivna och base64-kodade.
Buggen
För en rad som denna:
DB_PASSWORD='Tr0ub4dor-and-3' # roterad i maj
läsaren tog bort de omgivande citattecknen bara om värdet både började och slutade med ett citattecken. Med en kommentar efter värdet slutar raden på en bokstav, så citattecknen kvarstod. Kommentaren klipptes bort därefter, och grinden fortsatte att söka efter 'Tr0ub4dor-and-3', inklusive citattecken. Ett verktygspaket som innehöll lösenordet utan dessa citattecken hade klarat sig igenom.
Varför canaries aldrig märkte det
En canary testar ett nät: plantera ett värde skannern redan känner till, kontrollera att det hittas. Våra canary-värden skickades direkt till skannern, så de gick aldrig igenom koden som läser en konfigurationsrad. Varje nät testades, men inte parsaren framför dem.
Hur vi hittade den
Vi höll på att göra grinden till en egen produkt och skrev ett test som matade den med en konfigurationsfil i de former folk faktiskt skriver: export, citattecken, efterföljande kommentarer. Testet misslyckades på den citerade raden med en kommentar. Fixen läser ett citerat värde upp till dess avslutande citattecken och ignorerar vad som än följer.
Spelade det någon roll?
Vi kontrollerade innan vi ändrade något. På vår byggmaskin läser grinden 133 hemliga värden från de 59 filer den får, och på en andra maskin 499; inte ett enda hade den formen. Inget tidigare utlåtande ändras: varje verktygspaket vi har släppt skannades efter samma värden som det skulle skannas efter nu. Vi fixade grinden på alla tre maskiner ändå.
Slutsatsen
Om en skanner extraherar det den söker efter, testa extraktionen med realistisk indata, inte bara sökningen med inplanterade värden. En varningsfågel bevisar att nätet fungerar; den säger ingenting om rätt fiskar någonsin når det. Testerna av Secret Gate täcker nu båda, och innan lanseringen kontrollerade vi att den läser exakt samma 133 värden som vår byggkontroll.