Escáner de secretos filtrados

Un escáner de secretos filtrados comprueba si los archivos y credenciales que nunca deberían ser públicos pueden ser obtenidos por cualquiera desde tu sitio web: un archivo .env con contraseñas de bases de datos, una carpeta .git que entrega todo tu historial de código, un archivo de copia dejado en la raíz web, o una clave API real dentro de un paquete JavaScript. Introduce una URL y este escáner sondea las rutas de exposición conocidas, verifica el contenido de lo que responda y analiza la página y sus scripts en busca de patrones de secretos conocidos, mostrando solo valores enmascarados, nunca el secreto en sí. La guía complementaria, archivos .env expuestos y claves filtradas, explica cómo ocurren estas exposiciones y por qué borrar el archivo nunca basta por sí solo. Combínalo con la comprobación de cabeceras de seguridad para el endurecimiento de respuestas y la auditoría de scripts de terceros para los scripts que cargas de otros.

Última actualización:

¿Quieres vigilarlo sin parar? Vigílalo gratis con myeventwatch — alertas de caducidad y caídas, sin tarjeta.

Qué cuenta como expuesto — y qué no

El escáner sondea una lista publicada de rutas conocidas —/.env y sus variantes habituales, /.git/HEAD y /.git/config, archivos de configuración, archivos de copia y archivos de claves— con simples peticiones GET públicas, exactamente las que podría hacer un atacante, un buscador o un visitante curioso. Una ruta solo cuenta como expuesta cuando el contenido de la respuesta coincide con lo que ese archivo debería ser: un archivo env debe poder analizarse como líneas clave–valor, un HEAD de Git debe parecer una referencia de Git. Muchos servidores responden 200 a cada ruta —respaldo de aplicaciones de una página, páginas de error personalizadas, reescrituras comodín— y un 200 con el HTML de tu portada no es una filtración. Esas rutas se listan aparte en el resultado como respondieron pero sin confirmar, para que juzgues tú mismo; esta herramienta nunca llama filtración a un 200 sin confirmar, y ningún escáner que uses debería hacerlo.

Además de los sondeos de archivos, el escáner obtiene la propia página y hasta unas quince de sus paquetes JavaScript y los busca en forma de secretos conocidos: identificadores de claves de acceso a la nube, cabeceras de clave privada, asignaciones genéricas de claves API y tokens, cadenas de conexión a bases de datos y patrones similares de alta señal. El código del lado del cliente es público por definición —todo lo que se envía a un navegador puede leerlo cada visitante—, así que una credencial real hallada en un paquete está expuesta aunque ningún archivo estuviera mal configurado. Los hallazgos se informan por tipo, por archivo de origen y por número de apariciones, con el valor enmascarado hasta un máximo de sus cuatro primeros caracteres: suficiente para que reconozcas qué clave es, nunca suficiente para que quien lea el informe la use. El secreto completo nunca se obtiene, se almacena ni se muestra en este informe.

Límites, dichos con claridad

Esto es un sondeo público y de solo lectura de rutas conocidas, y sus límites forman parte del resultado. Solo pide las rutas de la lista publicada: un secreto en un archivo con un nombre inusual no será encontrado. Analiza la página de aterrizaje y unos quince paquetes de scripts, no cada recurso de un sitio grande, y no inicia sesión, no rastrea tras una autenticación, no fuerza nombres de archivo ni prueba nada que no sea ya alcanzable con un GET sin autenticar. Los escaneos están limitados a 5 por hora y visitante y los resultados se guardan en caché 10 minutos, así que un nuevo escaneo dentro de esa ventana puede mostrar el veredicto en caché. Un escaneo también tiene un presupuesto de tiempo: cuando un objetivo lento lo agota, el resultado se marca como parcial y lo dice — trata un resultado limpio parcial como «no comprobado del todo», no como «limpio».

Si el escaneo encuentra algo, el orden del trabajo importa más que la rapidez al borrar. Rota primero la credencial —revoca la clave expuesta y emite una nueva— porque puede haber ya copias en cachés, archivos y manos ajenas; borrar el archivo detiene las descargas nuevas pero no hace nada con una clave que ya salió. Después retira o bloquea el archivo en el servidor, purga las cachés de CDN y proxies que puedan guardar una copia y revisa tus registros de acceso en busca de peticiones anteriores a la misma ruta. El artículo complementario, archivos .env expuestos y claves filtradas, recorre el manual de la primera hora que usan los atacantes y la secuencia completa de recuperación en orden.

Las comprobaciones vecinas completan el panorama: la auditoría de scripts de terceros cubre los scripts externos que cargan tus páginas —un riesgo de cadena de suministro distinto del de tus propios archivos filtrados— y la comprobación de cabeceras de seguridad califica las protecciones de navegador que llevan tus respuestas. Una nota sobre el método: un resultado limpio significa que ninguna de las rutas sondeadas respondió con contenido coincidente y que ningún patrón de secreto conocido apareció en los archivos analizados, en el momento del escaneo y desde la posición de red del comprobador. Es evidencia sobre esas rutas y archivos, no una garantía sobre todo el servidor: mantén los archivos fuera de la raíz web desde el principio y vuelve a escanear tras cada cambio de despliegue que toque lo que tu servidor publica.

La lista de sondeo, publicada

/.env y variantesArchivos de entorno (.env, .env.local, .env.production y similares) con contraseñas de bases de datos, credenciales de correo y claves API. Se confirma solo cuando el cuerpo se analiza como líneas clave–valor.
/.git/HEAD y /.git/configUna carpeta .git servida revela el repositorio: HEAD prueba la estructura, config suele nombrar el remoto. Con ambos, el historial completo del código suele poder reconstruirse.
Archivos de configuraciónRutas de configuración conocidas (por ejemplo copias de wp-config, de config.php y archivos de configuración de frameworks) que llevan credenciales en texto plano.
Archivos de copia y archivoVolcados de bases de datos, archivos .zip / .tar.gz del sitio y copias de editor dejadas en la raíz web: a menudo una copia completa del sitio, credenciales incluidas.
Archivos de claves y certificadosArchivos con forma de clave privada (.pem, .key, nombres tipo id_rsa) que nunca deberían ser accesibles por web; una clave privada servida es por sí sola un hallazgo crítico.
Paquetes JavaScriptLa página más hasta unos 15 paquetes de scripts, buscados en busca de identificadores de claves en la nube, cabeceras de clave privada, asignaciones de tokens y cadenas de conexión. Los valores se enmascaran hasta un máximo de cuatro caracteres iniciales.
Regla de confirmaciónUn sondeo solo cuenta como expuesto cuando el contenido de la respuesta coincide con la forma esperada del archivo. Un 200 desnudo se lista como respondido-sin-confirmar y nunca se informa como filtración.
Presupuesto y cachéSolo sondeos GET públicos, de solo lectura, 5 escaneos por hora y visitante, resultados en caché 10 minutos. Un escaneo que agota su presupuesto de tiempo se marca parcial.

Preguntas frecuentes

El escaneo dice que una ruta «respondió pero sin confirmar». ¿Es una filtración?

Con esta evidencia, no. Significa que la ruta respondió con HTTP 200 pero el contenido no coincidió con la forma del archivo sondeado: la causa habitual es una ruta comodín o una página de respaldo que responde a cada URL con tu portada o tu aplicación. Abre tú mismo la ruta en una ventana privada y mira qué vuelve en realidad: si ves el contenido real del archivo, trátalo como expuesto; si ves tu sitio normal, es el respaldo.

El escáner encontró una de mis claves. ¿Qué hago primero?

Rótala: revoca la credencial expuesta y emite una de reemplazo, antes que cualquier otra cosa. Las copias de un archivo público escapan rápido a cachés, archivos y bases de datos de escáneres, así que borrar el archivo no «desfiltra» una clave. Después retira o bloquea el archivo, purga las cachés de CDN y proxies, revisa los registros de acceso de la ruta y comprueba dónde más se usó la misma credencial.

¿El escáner guarda o muestra los secretos completos que encuentra?

No. El comprobador informa del tipo de secreto, el archivo donde se halló y un recuento de apariciones, con el valor enmascarado hasta un máximo de sus cuatro primeros caracteres: suficiente para identificar qué credencial es, nunca suficiente para usarla. El informe no contiene nada que merezca la pena robar, a propósito: un informe de filtración no debería convertirse en una segunda filtración.

¿Puede escanear mi sitio de pruebas o una página tras un inicio de sesión?

No. El escáner solo hace peticiones GET públicas sin autenticar, así que todo lo que esté tras un inicio de sesión, una VPN o una lista de IPs permitidas queda fuera de alcance, a propósito, porque la pregunta que responde es qué puede obtener un extraño en internet. Los objetivos bloqueados, incluidas las direcciones de infraestructura de este propio sitio, se rechazan directamente.

¿Por qué mi resultado está en caché o es parcial?

Los resultados se guardan en caché 10 minutos para que las comprobaciones repetidas sean baratas y para ser un invitado educado en el servidor objetivo; el resultado indica cuándo está en caché. Un resultado parcial significa que el escaneo alcanzó su presupuesto de tiempo —normalmente un objetivo lento o muchos paquetes grandes— antes de terminar cada sondeo; el aviso lo dice, y un resultado limpio parcial debería repetirse en lugar de fiarse de él como totalmente limpio.