Aikido

Para mejorar detección de secretos genérica detección de secretos identificar lo que no son secretos

Escrito por
Zach Rice

Este artículo ha sido escrito en colaboración con Zach Rice y Joe Leon, ambos de Aikido Security.

En resumen: algunas credenciales están pensadas para ser públicas, pero los escáneres de secretos siguen marcándolas como secretos genéricos. Hemos creado reglas de supresión para las más comunes y hemos reducido los falsos positivos en aproximadamente un 2 %. Estas reglas ahora se incluyen de forma predeterminada en Betterleaks.

Los escáneres de secretos se basan en expresiones regulares. Cada patrón se centra en un tipo específico de credencial, como una clave de acceso secreta de AWS, una PAT de GitHub o un token de Stripe. Una vez que el escáner identifica un posible secreto, realiza una comprobación de validez, por ejemplo, enviando una solicitud HTTP para verificar si la credencial está activa.

Este flujo de trabajo falla cuando los escáneres de secretos intentan identificar secretos genéricos. Los secretos genéricos son las claves de API y las credenciales que no tienen una firma única o conocida. Los escáneres pueden seguir utilizando una expresión regular para encontrarlos, pero en lugar de buscar coincidencias con un formato de credencial conocido, utilizan un patrón genérico para recopilar cualquier elemento que parezca que podría ser un secreto.

Reducción del ruido en escaneo de secretos el problema con las expresiones regulares

Muestra dos secciones: una es para «un tipo de regla para cada uno» y, debajo, AWS, GitHub, Stripe y Slack. En los otros recuadros aparece «genérico»: «una regla general» con largas cadenas de números aleatorios que coinciden con los tipos de clave.

Es bastante fácil escribir una expresión regular sofisticada para detectar cadenas en el código (y en otros lugares) que parezcan secretos. Pero sin una comprobación de vigencia predefinida, el escáner no puede afirmar con certeza si un secreto genérico es realmente un secreto vigente.

Este enfoque obliga a los usuarios a revisar manualmente los falsos positivos. Pero eso no es nada divertido. Por eso, a lo largo de los próximos meses, vamos a lanzar una serie de capas de reducción de ruido:

  1. Filtrado por eficiencia de tokens (última publicación)
  2. Lista negra de credenciales publicables (esta entrada)
  3. Lista de exclusión de secretos públicos
  4. División de las reglas genéricas en dos tipos: tokens y nombres de usuario/contraseñas
  5. Triaje asistido por aprendizaje automático

Queremos seguir este orden concreto porque nuestro objetivo es eliminar el mayor número posible de falsos positivos con el menor coste posible y, a continuación, utilizar operaciones de aprendizaje automático más costosas para resolver la ambigüedad restante. Nunca será perfecto, pero creemos que los secretos genéricos son donde reside la mayor oportunidad en escaneo de secretos. Es el mejor ámbito para que los investigadores descubran hallazgos novedosos y para que los defensores se adelanten a los autores de amenazas. El objetivo de esta serie es hacer que las reglas predeterminadas de Betterleaks sean lo suficientemente buenas como para permitir a los investigadores y analistas clasificar los resultados de secretos genéricos a gran escala. 

¿Por qué se considera que algunas claves son «publicables» (es decir, no tan secretas)?

Muchos proveedores de SaaS y de servicios en la nube generan credenciales para los usuarios que están pensadas para ser públicas. Stripe, el procesador de pagos, ofrece a los usuarios varios tipos de claves, entre ellas una «clave API publicable». Estas claves están pensadas para «incluirse en el código front-end».

El título es «Tipos de claves». Es la parte superior de una captura de pantalla en la que se muestran las claves creadas en Stripe. La fila visible corresponde a la clave de API publicable, que indica que es seguro darla a conocer.

Es probable que una regla genérica de detección de secretos identifique esto como un posible secreto. Tiene una entropía elevada, se encuentra cerca de palabras clave como «api_key» y, en general, parece una credencial. Pero no es un secreto real. Está destinado a ser público y no es algo en lo que un investigador o analista deba perder el tiempo revisando manualmente.

Así que escribimos una expresión regular para eliminar este tipo de clave de los resultados genéricos de secretos de Betterleak.

Imagen: Diseñada para su publicación, con una captura de pantalla del archivo frontend/checkout.js en la que se ve una variable `const` que contiene una clave de Stripe y, debajo, un cuadro de verificación que indica que se ha eliminado de los resultados genéricos.

Pero Stripe es solo un tipo de clave. Necesitábamos ampliar este proceso. Investigamos los tipos de credenciales «públicas por diseño» más populares y creamos manualmente firmas de detección para cada una de ellas. Sí, manualmente. La IA resultó ser sorprendentemente inútil para esta tarea.

Reducción de las tasas de falsos positivos entre los secretos genéricos

Tras pasar horas añadiendo estas expresiones manualmente, queríamos comprobar si merecía la pena. Para evaluar el cambio, descargamos 100 GB de Common Crawl y los analizamos dos veces con Betterleaks: una vez con las nuevas firmas y otra sin ellas.

Las nuevas firmas de credenciales publicables reducen los falsos positivos en un 2,37 %. En nuestro conjunto de datos, eso supuso 27 886 secretos menos que revisar manualmente.

Imagen con un texto que dice: «27 886 falsos positivos menos que revisar»

Supone un aumento del tiempo de análisis de aproximadamente un 5 %, pero evitar tantos falsos positivos merece mucho la pena.

Tu tasa de reducción variará en función de los datos que escanees. Common Crawl se centra principalmente en el HTML y el JavaScript del front-end, que es precisamente donde se encuentran las credenciales publicables, por lo que es probable que esto exagere nuestros resultados. En cualquier caso, cada clave publicable que el filtro elimina es una que un investigador o analista nunca tendrá que evaluar.

Que algo sea público no siempre significa que sea seguro

El problema de adoptar este enfoque es que el hecho de que las credenciales sean públicas no significa necesariamente que no haya riesgo. Cada tipo de clave requiere una revisión manual de su estructura y del acceso que se le concede en el contexto de la plataforma SaaS. Al elaborar esta lista, nos hemos encontrado con cinco casos que merece la pena analizar, sobre todo para quienes estén pensando en enviar una solicitud de incorporación de cambios (¡por favor, hacedlo!) para añadir más.

Forma única: fácil

Esto es sencillo. La credencial publicable tiene una forma única e inconfundible. Escribimos una expresión regular única y estamos seguros de que esto no excluirá ningún secreto genérico que pueda ser válido. 

No tiene una forma concreta: depende del contexto

Se trata de cadenas que, literalmente, podrían aparecer en cualquier parte. Puede tratarse de un UUID o simplemente de cualquier secuencia de 32 caracteres hexadecimales. El formato por sí solo no permite identificar esta cadena como un tipo de credencial publicable. En estos casos, nos basamos en una palabra clave cercana que confirme que pertenece a una plataforma SaaS o a un proveedor de servicios en la nube concretos.

Este enfoque no es nuevo. Lo hacemos constantemente con las credenciales secretas.

Tiene la misma forma que un secreto: hay que comprobar que sigue activo

Esto es complicado. Algunos proveedores de SaaS deciden generar credenciales secretas y públicas con exactamente el mismo formato. Sinceramente, preferiríamos que no lo hicieran. Dificulta la detección de credenciales secretas y confunde a los usuarios. Pero nos hemos encontrado con muchos casos así.

Diagrama de flujo para dos claves que coinciden con la misma expresión regular. Su casilla apunta a una comprobación de integridad que realiza una llamada GET para verificar si afecta a algún dato sensible, lo que da lugar a dos casillas de resultado diferentes: «Publicable» (eliminada) y «Secreta» (conservada).

En estos casos, la única forma de eliminar de forma segura el tipo de clave punible es añadir una firma de detección (mediante una solicitud de comprobación de actividad HTTP) para la credencial secreta

Dado que las claves publicables y secretas tienen la misma estructura, la firma de detección del tipo de clave secreta detectaría ambas y, tras una comprobación de vitalidad, determinaría que la clave publicable no es secreta y la descartaría. 

Solo es vulnerable si está mal configurado: requiere una comprobación de estado activo

Hay algunos tipos de claves que generan los proveedores de SaaS y de servicios en la nube en los que, dependiendo de si un usuario ha añadido un permiso concreto, la clave puede ser sensible o no presentar ningún riesgo. He escrito bastante sobre las claves de la API de Google y su capacidad para acceder a Gemini. Ese es un caso. Pero he observado este patrón con las claves de Algolia y otras.

En estas situaciones, el mejor procedimiento a seguir es similar al que seguimos cuando se producen conflictos de formato entre las claves de publicación y las claves secretas: enviamos una comprobación de actividad para determinar si puede acceder a información confidencial.

Credenciales de prueba: requieren una evaluación manual

Algunas plataformas SaaS, como Stripe, ofrecen a los usuarios un entorno de prueba o «sandbox». Al principio, nos planteamos eliminar por completo estos resultados de los resultados generales de detección de secretos. 

Sin embargo, al analizarlo más detenidamente, quedó claro que algunas organizaciones introducen datos de producción en sus entornos de prueba. Y aunque es posible que una clave de Stripe filtrada en un entorno de pruebas no permita enviar miles de dólares a la cuenta de un actor malintencionado, sí podría proporcionarle acceso a la información de identificación personal (PII) de los clientes u otros datos internos importantes. Dado que no podemos saber si una credencial de prueba da acceso a datos internos confidenciales, incluimos estos resultados en las conclusiones y nos basamos en una clasificación manual.

Solucionar detección de secretos genérica detección de secretos a paso

La detección genérica de secretos es un problema de filtrado, y el filtrado se consigue mediante una serie de pequeños avances que se van sumando unos a otros. Empezamos por eliminar aquello de lo que estamos seguros. Esperamos que algunos de estos pequeños cambios permitan una detección genérica de secretos eficaz a gran escala.

La versión actual de Betterleaks filtra, de forma predeterminada, las claves que se pueden publicar de entre los resultados genéricos. ¡Pruébala!

Compartir:

https://www.aikido.dev/blog/better-generic-secrets-detection-non-secrets

Suscríbete para recibir noticias

4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.