La clave que se fue en un commit
Para probar rápido, la clave de pagos acaba en el código. Se sube en un commit, y desde ese momento está en el historial de todo el que clone el repo, y en el navegador de todo el que cargue la app. Borrarla después no la borra de ahí. Vibethia la encuentra sin enseñarla: su valor nunca sale de tu GitHub.
Se sube en un segundo. Se queda para siempre
Una clave en el código no es un descuido pequeño: es la puerta abierta. Quien la tenga puede cobrar con tu cuenta de pagos, leer tu base de datos o levantar servidores a tu nombre. Y hay programas que recorren GitHub buscándolas en cuanto se suben.
En el historial, aunque la borres.
Git recuerda. El commit donde estaba sigue ahí, y cualquiera con acceso al repo lo puede leer. Por eso una clave que se subió se cambia, no se borra.
En el navegador de tus usuarios.
Si la clave está en código que se manda al navegador, cada visitante la tiene. Con abrir las herramientas de desarrollo.
Con la IA pasa más.
Le pegas la clave para que «lo haga funcionar», y la IA la escribe donde le parece. El código funciona. La clave se queda.
La encuentra sin verla
En cada subida busca en tu código lo que tiene forma de clave o contraseña: las de los proveedores conocidos, por su formato; y las variables con nombre de secreto y un valor que parece aleatorio. Antes de que nada salga de tu GitHub, la tapa.
- El valor nunca sale de GitHub. Lo que llega a Vibethia es «AKIA…[20]»: cuatro letras, el tipo y la longitud. Ni en la base, ni en el panel, ni en la conversación con el analista.
- Distingue una clave de un ejemplo. «changeme», «your_key», «xxx» o una clave en un fichero de test son avisos que se descartan solos. Una con formato de proveedor real, no: esa la confirma una persona.
- Te dice qué hacer. Rotarla en el proveedor, sacarla a una variable de entorno y comprobar que no se usó. El prompt para tu IA lleva los tres pasos; el primero lo tienes que hacer tú.
- Solo lo que hay ahora. Mira el código tal como está, no todo el historial. Una clave que se subió hace un año y se borró no la ve. Lo decimos.
Seis de seis
En nuestro repo de pruebas sembramos seis secretos con la forma de los de verdad, generados para la ocasión. Vibethia encontró los seis; el plan gratuito de Xygeni, cinco.
- Secretos sembrados encontrados 6 de 6.
Ninguno de los seis llegó a la base con su valor.
- Y los que no eran secretos Fuera.
Los marcadores y ejemplos sembrados como falsas alarmas se descartaron en el triaje.
Gitleaks con --redact, y seis capas detrás
El escáner es solo la primera capa. Lo que de verdad protege el valor es que se enmascara en el runner, antes de salir, y que la API vuelve a comprobarlo al recibir.
- Escáner
- Gitleaks sobre el árbol actual, con
--redact: su SARIF no lleva el valor. - Enmascarado en el runner
preparar_enviotapa el tramo exacto de cada resultado en los fragmentos: hasta 4 caracteres de prefijo, elipsis y longitud (AKIA…[20]). Después pasa a todo fragmento los formatos de alta confianza y las asignaciones con nombre de secreto y valor de entropía ≥ 3,5.- Lo que calcula para el analista
- Entropía de Shannon, si encaja con el formato de un proveedor (AWS, GitHub, Stripe,
Slack, claves privadas…) y si parece un marcador (
xxx,changeme,<…>, ruta de test o.example). - La API repite
- Borra
snippetycontextRegionde Gitleaks y pasa su propio detector a todo lo recibido. Si algo encaja, se enmascara y queda el eventosecreto_enmascarado_en_servidor: señal de que el workflow tiene un fallo. - Huella
- Se calcula sobre la línea ya enmascarada, y el SARIF se guarda solo tras el saneado. Nada de fragmentos en los registros: solo recuentos e ids.
- Guardarraíl
- Un secreto con formato de proveedor, que no parece marcador y está fuera de rutas de test, no se descarta sin una persona: Revisar.
Lo que esta capa no hace
- No Historial de git
Solo el árbol actual. Un secreto que se subió y se borró no se ve. Está documentado como trabajo futuro.
- No Validar si la clave está activa
No llama al proveedor para comprobarla: eso sería usar vuestra clave. Se trata como activa hasta que la rotéis.
- No Rotarla por vosotros
La rotación la hacéis en el proveedor. El prompt la pone como primer paso.
- Todavía no Hook de pre-commit
Pararla antes del commit, en la máquina de cada uno. En estudio.
- Medido Repo de pruebas
6 de 6 secretos sembrados (Xygeni gratuito: 5 de 6). El repo publicado no lleva secretos: se generan al grabar y nadie los imprime. La tabla.
Lo demás que revisa
- El código que te escribe la IA SAST
- Las librerías que no elegiste SCA
- El paquete que no es el que parece Malware en dependencias
- Tu infraestructura y tus contenedores IaC · Container scanning · SBOM
- Tu CI y tu pipeline CI/CD security
- Alguien lee cada aviso AI triage · Reachability
Del ruido a la decisión
Conecta un repo y mira qué hay que corregir. Sin hablar con nadie.