Le bug de notre scanner de secrets que les canaris n'ont pas détecté

Livraison

Avant de compresser chaque Kit que nous vendons, une passerelle le scanne à la recherche des valeurs réelles de nos propres secrets. Chaque scan commence par placer des canaris, un de chaque type, et refuse de s'exécuter s'il ne les détecte pas tous. Il les a toujours détectés. Il avait quand même un bug.

Comment la passerelle lit les secrets

La passerelle ne cherche pas seulement des éléments ayant la forme de clés. Elle lit les fichiers où résident nos secrets (fichiers env, configurations JSON, fichiers de clés), extrait chaque valeur dont le nom indique qu'elle est secrète, puis recherche ces valeurs exactes, telles qu'écrites et encodées en base64, dans ce que nous sommes sur le point de livrer.

Le bug

Pour une ligne comme celle-ci :

DB_PASSWORD='Tr0ub4dor-and-3'  # rotation en mai

le lecteur retirait les guillemets environnants uniquement lorsque la valeur commençait et finissait par un caractère de guillemet. Avec un commentaire après la valeur, la ligne se termine par une lettre, donc les guillemets restaient. Le commentaire était ensuite supprimé, et la passerelle continuait à rechercher 'Tr0ub4dor-and-3', guillemets inclus. Un Kit contenant le mot de passe sans ces guillemets aurait été validé.

Pourquoi les canaris ne l'ont jamais remarqué

Un canari teste un filet : placer une valeur que le scanner connaît déjà, vérifier qu'elle est trouvée. Nos valeurs de canaris étaient transmises directement au scanner, elles ne passaient donc jamais par le code qui lit une ligne de configuration. Chaque filet était testé, mais pas l'analyseur syntaxique situé devant eux.

Comment nous l'avons trouvé

Nous transformions la passerelle en produit à part entière et avons écrit un test qui lui soumettait un fichier de configuration dans les formats que les gens écrivent réellement : export, guillemets, commentaires en fin de ligne. Le test a échoué sur la ligne entre guillemets avec un commentaire. La correction lit une valeur entre guillemets jusqu'à son guillemet fermant et ignore tout ce qui suit.

Est-ce que cela comptait ?

Nous avons vérifié avant de modifier quoi que ce soit. Sur notre machine de build, la passerelle lit 133 valeurs secrètes parmi les 59 fichiers qu'elle reçoit, et sur une seconde machine 499 ; aucune n'avait cette forme. Aucun verdict antérieur ne change : chaque Kit que nous avons publié a été scanné pour les mêmes valeurs qu'il le serait maintenant. Nous avons quand même corrigé la passerelle sur les trois machines.

À retenir

Si un scanner extrait ce qu’il recherche, testez l’extraction avec des entrées réalistes, et pas seulement la recherche avec des valeurs plantées. Un canari prouve que le filet fonctionne ; il ne dit rien sur le fait que les bons poissons y parviennent réellement. Les tests de Secret Gate couvrent désormais les deux, et avant sa sortie, nous avons vérifié qu’il lit exactement les mêmes 133 valeurs que notre porte de build.

Mis à jour: