La porta abans del commit
Un secret que arriba a un remot és públic. Rotar-lo és l'únic arranjament de debò, i cada hora entre el push i la rotació és exposició que ja no pots retirar…
Un secret que arriba a un remot és públic. Rotar-lo és l'únic arranjament de debò, i cada hora entre el push i la rotació és exposició que ja no pots retirar. Així que el lloc útil per a un escàner no és la CI, ni un hook que instal·les per màquina: és dins de la comanda que escriu el commit.
On se situa
torii save escaneja el contingut indexat abans de crear l'objecte commit. Quan hi ha una troballa no s'escriu res: la comanda avorta i imprimeix el fitxer i la línia. No hi ha hook a instal·lar, ni configuració per repositori, ni manera d'acabar en una màquina nova amb la protecció apagada sense assabentar-te'n.
torii scan --history passa els mateixos patrons per tots els commits ja escrits, per a la pregunta «això va arribar a ser cert mai?».
La forma que s'escolava
Fins a 0.13.0, els patrons de token casaven amb una clau que aparegués com a paraula solta delimitada per espais. Aquesta és la forma que té una clau en prosa, i gairebé mai la que té dins d'un fitxer.
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxAquí l'assignació sencera és una sola paraula, i no comença per ghp_. Cada fitxer .env, cada argument -e KEY=value d'un contenidor i cada variable de CI enganxada en un compose era invisible. El mateix forat cobria claus d'AWS, tokens de GitLab, Stripe i SendGrid.
Es va trobar escrivint la forma lletja i provant-la, no llegint la llista de patrons i concloent que semblava completa. Aquesta és tota la llçó: una regla de detecció val el que val l'entrada real més lletja contra la qual l'hagis provada.
Els marcadors de posició, i per què se'n va anar la llista de paraules
La regla de cadenes de connexió se saltava qualsevol contrasenya que fos password, pass, changeme, xxx o yourpassword, amb la teoria que són exemples.
També són contrasenyes que la gent fa servir de debò. Una regla que se salta les credencials més febles del corpus és pitjor que no tenir-ne cap. Ara només s'exclouen els marcadors sintàctics — ${VAR}, $VAR, <placeholder> — que són formes que cap contrasenya pot tenir.
El cost és que un exemple de documentació amb user:pass@localhost ara salta. És l'intercanvi correcte: un fals positiu costa un --yes; un fals negatiu costa una rotació i un incident.
Dues més que estaven malament
Un scheme://user@host pelat —sense cap contrasenya, la URL a l'estil SSH— es reportava com a credencial filtrada. Ara comprova que el userinfo porti de debò user:password@.
I a la llista d'esquemes li faltaven postgres:// i mongodb+srv://, així que una credencial real escrita en qualsevol de les dues grafies més comunes era invisible sense importar-ne la longitud.
Quan la troballa no és real
torii save -am "docs: example" --yesO, de manera permanent, una entrada d'allowlist a .toriignore, o // torii:allow-secret a la línia. --yes també cal quan stdin no és un terminal: a CI o sota un agent l'escàner no pot preguntar, i falla ràpid assenyalant l'opció en comptes de penjar-se esperant una resposta que ningú pot donar.