De bug in onze geheime scanner die canaries niet konden vinden

Verzending

Voordat een kit die we verkopen wordt ingepakt, scant een gate deze op de werkelijke waarden van onze eigen secrets. Elke scan begint met het plaatsen van canaries, één van elk type, en weigert te draaien tenzij hij ze allemaal vangt. Dat lukte altijd. Toch zat er een bug in.

Hoe de gate secrets leest

De gate zoekt niet alleen naar dingen die op sleutels lijken. Hij leest de bestanden waar onze secrets staan (env-bestanden, JSON-configuraties, sleutelbestanden), neemt elke waarde waarvan de naam zegt dat het een secret is, en zoekt vervolgens in wat we gaan leveren naar die exacte waarden, zoals ze zijn en base64-gecodeerd.

De bug

Voor een regel als deze:

DB_PASSWORD='Tr0ub4dor-and-3'  # geroteerd in mei

verwijderde de lezer de omringende aanhalingstekens alleen als de waarde zowel begon als eindigde met een aanhalingsteken. Met een commentaar achter de waarde eindigt de regel op een letter, dus bleven de aanhalingstekens staan. Het commentaar werd daarna afgekapt, en de gate ging door met zoeken naar 'Tr0ub4dor-and-3', inclusief aanhalingstekens. Een kit met het wachtwoord zonder die aanhalingstekens zou zijn doorgekomen.

Waarom de canaries het nooit merkten

Een canary test een net: plant een waarde die de scanner al kent, en controleer of die wordt gevonden. Onze canary-waarden werden rechtstreeks aan de scanner gegeven, dus gingen ze nooit door de code die een configuratieregel leest. Elk net werd getest, maar de parser ervoor niet.

Hoe we het vonden

We maakten van de gate een eigen product en schreven een test die hem een configuratiebestand voerde in de vormen die mensen echt schrijven: export, aanhalingstekens, commentaar op de laatste regel. De test faalde op de regel met aanhalingstekens en commentaar. De fix leest een waarde tussen aanhalingstekens tot het sluitende aanhalingsteken en negeert wat er daarna komt.

Maakte het uit?

We controleerden dit voordat we iets veranderden. Op onze buildmachine leest de gate 133 secret-waarden uit de 59 bestanden die hij krijgt, en op een tweede machine 499; geen enkele had die vorm. Geen enkel eerder oordeel verandert: elke kit die we hebben uitgebracht is gescand op dezelfde waarden als nu. We hebben de gate op alle drie de machines toch gerepareerd.

De conclusie

Als een scanner precies dat vindt waar hij op zoekt, test dan de extractie met realistische invoer, niet alleen de zoekopdracht met vooraf ingevoerde waarden. Een canary bewijst dat het net werkt; het zegt niets over of de juiste vissen er ooit in terechtkomen. De tests van Secret Gate dekken nu beide aspecten, en vóór de release hebben we gecontroleerd of het precies dezelfde 133 waarden leest als onze build-gate.

Bijgewerkt: