¿Qué tan fácil es ocultar el agregar un archivo a un repositorio de git?

3

Aquí está el escenario ...

Tengo un repositorio git en un servidor que puede haber sido comprometido. Mi equipo de desarrollo dice que pueden confiar en los archivos en el directorio que alberga el repositorio git porque todos los confirms (diffs) y los nuevos archivos que se agregan al repositorio están marcados y firmados por el "propietario" del repositorio y cualquier archivo nuevo se mostrará como nuevo en la versión local cuando se realiza un estado o extracción.

Sin embargo, creo que si una persona ha comprometido el servidor en el que se aloja el repositorio git, debe haber alguna forma de agregar un archivo a ese repositorio y cubrirlo de modo que cuando un desarrollador haga su próximo intento, el nuevo el archivo no aparece en su estado git. ¿Es este el caso?

    
pregunta David Scholefield 23.06.2015 - 19:57
fuente

2 respuestas

3

Sus desarrolladores tienen razón en que cualquier cambio en el repositorio se reflejará en un nuevo compromiso. Las confirmaciones anteriores no se pueden modificar sin que se notifique a todos los desarrolladores un conflicto grave al actualizar desde el repositorio remoto.

Dicho esto, sería trivial que un atacante agregue un nuevo compromiso al repositorio que se descargará automáticamente y se aplicará a los repositorios locales de los desarrolladores cuando se extraiga del servidor. Me parece extremadamente improbable que todas las confirmaciones en el repositorio se revisen manualmente a menos que este sea un proyecto muy poco utilizado. Incluso si se revisan, un atacante motivado podría realizar un cambio de apariencia inocua que tiene implicaciones de seguridad. Por ejemplo, en 2003, una persona desconocida agregó un compromiso al kernel de Linux que contenía una vulnerabilidad de escalada de raíz . Esto fue cuando Linux estaba usando CVS, pero la única protección real que tiene git contra este tipo de ataque es la confirmación firmada por gpg.

A menos que esté utilizando firmas criptográficas sólidas para proteger sus confirmaciones, no hay forma de saber realmente si un tercero modificó su repositorio sin realizar una auditoría completa de todas las confirmaciones por parte del desarrollador que supuestamente las creó desde la fecha de compromiso del servidor. Esta es la única forma de garantizar realmente que un atacante no haya forjado un compromiso por parte de uno de sus desarrolladores.

Depende de usted determinar si el riesgo de que el atacante haya hecho esto vale o no el esfuerzo que implica tratar de descubrirlo. Si usted es una pequeña empresa que crea software que no almacena, protege o accede a datos confidenciales y parece un compromiso típico de drive-by para convertir su servidor en un servidor de correo no deseado, probablemente no me molestaría. Si procesas grandes cantidades de dinero, probablemente lo haría.

Ahora también sería un buen momento para asegurarse de que no está almacenando ninguna credencial dentro de su repositorio. Cosas como las contraseñas de la base de datos, las claves API a otros servicios, las claves TLS y los secretos criptográficos utilizados para la autenticación de cookies de sesión nunca deben almacenarse junto con su código fuente, y debe tener en cuenta que se han comprometido y requieren rotación.     

respondido por el Stephen Touset 23.06.2015 - 20:48
fuente
2

Sobre la base de lo que se ha dicho, leer los registros de confirmación es todo, sin embargo, hay formas de engañar al usuario final y hacer que descarguen archivos que no son obvios para ellos.

Una forma es agregar archivos a la base de datos de objetos git directamente en lugar del repositorio (por lo tanto, usar el comando git hash-object en lugar del normal git add ). De esa manera, no aparecen cuando se escribe un comando de lista, por lo que no será obvio que se eliminen.

$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
83baae61804e65cc73a7201a7252750c76066a30

Su base de datos contiene el nuevo contenido:

$ find .git/objects -type f
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30

He visto que los proyectos utilizan este método para ocultar secretos y credenciales que no son seguros y son simplemente seguridad por oscuridad.

    
respondido por el channel 19.06.2017 - 21:06
fuente

Lea otras preguntas en las etiquetas