Hooks

Hook secrets: detecta secretos incrustados en el código

Analiza un proyecto en busca de credenciales incrustadas en el código, desde la línea de comandos.

El hook secrets señala las credenciales incrustadas en el código fuente en lugar de leídas del entorno. Se fija en la procedencia (un literal frente a una lectura del entorno), no en el contenido del valor, así que no necesita un catálogo exhaustivo de prefijos de proveedores y apenas produce falsos positivos. Es el motor determinista en el que se apoya la especialización secrets.

Las firmas con el formato de un proveedor, las credenciales en cadenas de conexión y los literales asignados a un identificador con nombre de secreto son independientes del lenguaje: la misma cadena se lee igual en cualquier archivo. Las dos heurísticas que dependen de la sintaxis, una lectura del entorno con un valor por defecto incrustado y un secreto que acaba en un sink de logs, tienen en cuenta el lenguaje, así que un console.log de JavaScript nunca se busca en un archivo de Rust y el os.getenv("X", "default") de Python se reconoce por sí mismo.

Cómo ejecutarlo​

npx lagune read secrets # scans the whole project
npx lagune read secrets --dir src # scans a directory
npx lagune read secrets --file config.ts # scans a single file

El análisis muestra hasta dos secciones. Hardcoded secrets found es el conjunto de hallazgos (un valor por defecto incrustado para una variable de entorno con nombre de secreto, una credencial incluida en una cadena de conexión o un valor que coincide con uno de los formatos de proveedor seleccionados), así que el hook termina con un código de salida distinto de cero. Secret handling to review manually es un conjunto de indicios: un literal simple asignado a un identificador con nombre de secreto (su procedencia se puede determinar, pero no si el valor es un secreto real) y un valor con nombre de secreto que acaba en un sink de logs o de respuesta. Si no encuentra nada, muestra no hardcoded secrets found.

Opciones de la CLI​

OpciónValorDescripción
--dirun directorioLimita el análisis a un directorio. Se puede repetir y combinar con --file.
--fileun archivoLimita el análisis a un solo archivo. Se puede repetir y combinar con --dir.

Sin ninguna opción, analiza todo el proyecto.

Cobertura de lenguajes​

El hallazgo del valor por defecto del entorno y el indicio del sink de logs leen un conjunto de formas propio de cada lenguaje, así que cubren los lenguajes de abajo y no señalan nada en los demás. Las otras tres señales se ejecutan en todos los archivos.

SeñalLenguajes
Valor por defecto del entornoJavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (cmp.Or), Rust, C#
Sink de logs o de respuestaJavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C#
¿Esto incumple alguna política?

No. Detectar el formato de un secreto para avisar de que se ha incluido en un commit es una práctica habitual de las herramientas defensivas, la misma operación que hacen gitleaks, trufflehog y la push protection de GitHub. El hook incluye firmas de detección (formatos públicos de tokens), nunca un secreto activo, y audita y explica en lugar de exfiltrar.

Preguntas frecuentes

Se fija en la procedencia, no en el contenido del valor. Los formatos de alta confianza (tokens de proveedores, valores por defecto del entorno, cadenas de conexión) son hallazgos que terminan con un código de salida distinto de cero. Un literal simple asignado a un identificador con nombre de secreto es un indicio que hay que confirmar, y ese mismo identificador leído de process.env no se señala en absoluto.