6 mar 2020

¿A quién le cuentan los desarrolladores sus secretos?

Es muy común que durante el proceso de una auditoria externa de los sistemas, durante la realización de un ejercicio de Red Team o simplemente si nos encontramos participando en un programa de Bug Bounty, una de las principales acciones a llevar a cabo, sino la más relevante de todas ellas, es la de hacer un correcto reconocimiento de los activos dentro del alcance.

Este reconocimiento no debe limitarse a los dominios, IPs o activos a auditar, sino que tiene que incluir toda aquella información que de manera pública pueda ser encontrada. Mucha de esta información, ya sea por despiste, mala praxis o simple desconocimiento, puede ser encontrada en repositorios de código públicos. Aunque pueda parecer anecdótico, es mucho más común de lo se podría imaginar encontrar según qué información (contraseñas, api keys, certificados, direccionamiento interno…) publicada en repositorios de GitHub, Bitbucket o Gitlab.


Para comprobarlo basta con realizar una búsqueda en GitHub con palabras clave ligadas al término “password”, como por ejemplo buscando “removed password” podremos encontrar más de 41.000 commits con este texto, simplemente seleccionando cualquiera de ellos nos encontramos que es información que no debería estar ahí:

Figura 1: Ejemplo de API TOKEN encontrado en un repositorio en GitHub

Aunque realizando estas búsquedas a mano puede ayudar a encontrar información, lo interesante es realizar búsquedas delimitando un scope concreto, por ejemplo, una serie de dominios o repositorios. Para esto, ya existen multitud de herramientas que nos pueden ayudar en esta búsqueda como por ejemplo gitleaks, git-secrets o gitGrabber. También existen plataformas como shhgit que escanean en tiempo real los cambios realizados en repositorios, algunos incluso generan issues en GitHub reportando a los desarrolladores qué se ha encontrado y cómo arreglarlo, y es aquí donde quería llegar en este post.

Queridos desarrolladores, tenemos que hablar.

Si alguna vez os equivocáis y por error se ha subido, por ejemplo, vuestra contraseña a un repositorio remoto, no basta con eliminar dicha contraseña y volver a subir el archivo. Puestos a hacerlo mal, tampoco ayuda que el mensaje del commit sea “He borrado la contraseña” que eso es como poner un neón enorme de que se ha cometido un error.

Es importante entender que git no funciona así y que aunque esa contraseña no aparezca, sigue habiendo algún momento en el código donde si lo estuvo. Ese momento se muestra en forma de commit en alguna parte del repositorio y por lo tanto, querido desarrollador… ¡Tu contraseña sigue ahí!

¿Cómo borrar secretos de un repositorio git?

Para eliminar un dato de un repositorio git necesitamos que desaparezca de la cadena de commits, para ello y sí el secreto se ha subido y nos hemos dado cuenta inmediatamente, se puede deshacer el último commit con:
git reset --soft HEAD~1.
Este comando nos va a permitir guardar los cambios hechos, con lo que bastaría eliminar de esos cambios el secreto, realizar de nuevo el commit y subirlo.

Pero, ¿qué pasa si ese secreto llevaba ya tiempo subido? Para ello no queda mas remedio que reconstruir la cadena de commits con git filter-branch. Este comando realiza una serie de operaciones en cada uno de los commits en los que encuentre el path dado, en este caso se podría usar para eliminar el archivo completo.
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch /path/al/archivo" HEAD
Tras esta ejecución necesitaremos commitear el archivo, ya sin el secreto, y volver a subirlo.

No hace falta ser un genio para darse cuenta que esto último es como matar moscas a cañonazos, es por ello que existen herramientas como BFG-Repo Cleaner que permiten de una manera sencilla, en base a unos parámetros dados que en este caso serían el listado de secretos que se desean eliminar y en tiempo récord lo sustituirá en nuestro repositorio por la cadena ***REMOVED***. Os recomiendo que le echéis un ojo.

En cualquiera de los casos, será necesario subir de nuevo el repositorio completo utilizando la opción --force que no es nada recomendado y que en muchos casos se deshabilita por seguridad, por lo que necesitaremos privilegios de administración en los repositorios. Si no lo sois y la liasteis, poneos en contando con el administrador del repositorio y mandadle estos sencillos pasos.


Así que ya sabéis, si alguna vez se os escapa algo en algún commit que no debería… quedará en secreto entre nosotros ;)

Ánimo con el viernes!

No hay comentarios:

Publicar un comentario