El error en nuestro escáner de secretos que los canarios no encontraron

Envío

Antes de comprimir cualquier kit que vendemos, una barrera lo escanea en busca de los valores reales de nuestros propios secretos. Cada escaneo comienza sembrando canarios, uno de cada tipo, y se niega a ejecutarse si no los detecta a todos. Siempre los detectaba. Aun así, tenía un error.

Cómo lee la barrera los secretos

La barrera no solo busca cosas con forma de clave. Lee los archivos donde viven nuestros secretos (archivos env, configuraciones JSON, archivos de clave), toma cada valor cuyo nombre indique que es secreto y luego busca en lo que estamos a punto de enviar esos valores exactos, tal como están escritos y codificados en base64.

El error

Para una línea como esta:

DB_PASSWORD='Tr0ub4dor-and-3'  # rotada en mayo

el lector eliminaba las comillas circundantes solo cuando el valor comenzaba y terminaba con un carácter de comilla. Con un comentario después del valor, la línea termina en una letra, por lo que las comillas permanecían. El comentario se cortaba a continuación, y la barrera seguía buscando 'Tr0ub4dor-and-3', comillas incluidas. Un kit que contuviera la contraseña sin esas comillas habría pasado.

Por qué los canarios nunca lo notaron

Un canario prueba una red: sembrar un valor que el escáner ya conoce y comprobar que se encuentra. Nuestros valores de canario se pasaban directamente al escáner, por lo que nunca pasaban por el código que lee una línea de configuración. Se probó cada red, pero no el analizador que estaba delante de ellas.

Cómo lo encontramos

Estábamos convirtiendo la barrera en un producto propio y escribimos una prueba que le alimentaba un archivo de configuración con los formatos que la gente realmente escribe: export, comillas, comentarios finales. La prueba falló en la línea entrecomillada con un comentario. La corrección lee un valor entrecomillado hasta su comilla de cierre e ignora lo que sigue.

¿Importaba?

Comprobamos antes de cambiar nada. En nuestra máquina de compilación, la barrera lee 133 valores secretos de los 59 archivos que se le dan, y en una segunda máquina 499; ninguno tenía esa forma. Ningún veredicto anterior cambia: cada kit que hemos lanzado fue escaneado en busca de los mismos valores para los que se escanearía ahora. De todos modos, corregimos la barrera en las tres máquinas.

La conclusión

Si un escáner extrae lo que busca, prueba la extracción con entradas realistas, no solo la búsqueda con valores sembrados. Un canario demuestra que la red funciona; no dice nada sobre si los peces correctos llegan a ella. Las pruebas de Secret Gate ahora cubren ambos casos, y antes de su lanzamiento comprobamos que lee exactamente los mismos 133 valores que nuestra puerta de control de compilación.

Actualizado: