Esto probablemente nunca sucedió en el mundo real todavía, y puede que nunca suceda, pero consideremos esto: digamos que tiene un repositorio git, realice una confirmación y tenga mucha mala suerte: uno de los blobs termina teniendo el mismo SHA-1 como otro que ya está en su repositorio. La pregunta es, ¿cómo manejaría Git esto? ¿Simplemente fallar? ¿Encontrar una manera de vincular los dos blobs y verificar cuál se necesita según el contexto?
Es más un desafío para la mente que un problema real, pero el problema me pareció interesante.
git
hash-collision
Gnurou
fuente
fuente
Respuestas:
Hice un experimento para descubrir exactamente cómo se comportaría Git en este caso. Esto es con la versión 2.7.9 ~ rc0 + next.20151210 (versión Debian). Básicamente, reduje el tamaño del hash de 160 bits a 4 bits aplicando el siguiente diff y reconstruyendo git:
Luego hice algunas confirmaciones y noté lo siguiente.
Para el n. ° 2, normalmente obtendrá un error como este cuando ejecute "git push":
o:
si elimina el archivo y luego ejecuta "git checkout file.txt".
Para # 4 y # 6, generalmente obtendrá un error como este:
cuando se ejecuta "git commit". En este caso, normalmente puede volver a escribir "git commit", ya que esto creará un nuevo hash (debido a la marca de tiempo modificada)
Para los n. ° 5 y n. ° 9, generalmente obtendrá un error como este:
cuando se ejecuta "git commit"
Si alguien intenta clonar su repositorio corrupto, normalmente verá algo como:
Lo que me "preocupa" es que en dos casos (2,3) el repositorio se corrompe sin advertencias, y en 3 casos (1,7,8), todo parece estar bien, pero el contenido del repositorio es diferente de lo que espera ser - estar. La clonación o extracción de personas tendrá un contenido diferente al que usted tiene. Los casos 4,5,6 y 9 están bien, ya que se detendrá con un error. Supongo que sería mejor si fallara con un error al menos en todos los casos.
fuente
Respuesta original (2012) (ver
shattered.io
colisión SHA1 2017 a continuación)Esa vieja respuesta (2006) de Linus aún podría ser relevante:
La cuestión del uso de SHA-256 se menciona regularmente, pero no se actúa por ahora (2012).
Nota: a partir de 2018 y Git 2.19 , el código se está refactorizando para usar SHA-256.
Nota (Humor): puede forzar una confirmación a un prefijo SHA1 particular , con el proyecto gitbrute de Brad Fitzpatrick (
bradfitz
) .Ejemplo: https://github.com/bradfitz/deadbeef
Daniel Dinnyes señala en los comentarios a 7.1 Git Tools - Revision Selection , que incluye:
Incluso el más reciente (febrero de 2017)
shattered.io
demostró la posibilidad de forjar una colisión SHA1:(vea mucho más en mi respuesta por separado , incluida la publicación de Google+ de Linus Torvalds)
Consulte " Duración de las funciones hash criptográficas " de Valerie Anita Aurora para obtener más información.
En esa página, ella nota:
Vea más en mi respuesta separada a continuación .
fuente
/* This line added to avoid collision */
: D puedes ganar la lotería dos veces: P/* This line added to avoid collision of the avoid collision line */
De acuerdo con Pro Git :
Por lo tanto, no fallaría, pero tampoco salvaría su nuevo objeto.
No sé cómo se vería eso en la línea de comando, pero eso ciertamente sería confuso.
Un poco más abajo, esa misma referencia intenta ilustrar la probabilidad de tal colisión:
fuente
Para agregar a mi respuesta anterior de 2012 , ahora hay (febrero de 2017, cinco años después), un ejemplo de colisión SHA-1 real con shattered.io , donde puede crear dos archivos PDF en colisión: obtener un SHA- 1 firma digital en el primer archivo PDF que también se puede abusar como una firma válida en el segundo archivo PDF.
Consulte también " A las puertas de la muerte durante años, la función SHA1 ampliamente utilizada ahora está muerta ", y esta ilustración .
Actualización 26 de febrero: Linus confirmó los siguientes puntos en una publicación de Google+ :
Con respecto a esa transición, vea el Q1 2018 Git 2.16 agregando una estructura que representa el algoritmo hash. La implementación de esa transición ha comenzado.
A partir de Git 2.19 (Q3 2018) , Git eligió SHA-256 como NewHash y está en el proceso de integrarlo al código (lo que significa que SHA1 sigue siendo el predeterminado (Q2 2019, Git 2.21), pero SHA2 será el sucesor)
Respuesta original (25 de febrero) Pero:
Se tiene algún problema para
git-svn
pesar . O más bien con svn en sí , como se ve aquí .git fsck
, como lo menciona Linus Torvalds hoy.git fsck
advertiría sobre un mensaje de confirmación con datos opacos ocultos después de unNUL
(aunqueNUL
no siempre está presente en un archivo fraudulento ).No todo el mundo se enciende
transfer.fsck
, pero GitHub sí: cualquier impulso sería abortado en el caso de un objeto malformado o un enlace roto. Aunque ... hay una razón por la cual esto no está activado por defecto .El problema real en la creación de dos repositorios Git con el mismo hash head commit y diferentes contenidos. E incluso entonces, el ataque sigue siendo complicado .
Joey Hess prueba esos pdf en un repositorio de Git y encontró :
Entonces, el vector principal de ataque (forjar un commit) sería :
Además, ya puede detectar ataques de colisión criptoanalíticos contra SHA-1 presente en cada archivo con
cr-marcstevens/sha1collisiondetection
Agregar un cheque similar en Git en sí mismo tendría un costo de cálculo .
Al cambiar el hash, Linux comenta :
Aún así, un plan de transición (de SHA1 a otra función hash) aún sería complejo , pero se estudiaría activamente.
Una
convert-to-object_id
campaña está en progreso :Actualización 20 de marzo: GitHub detalla un posible ataque y su protección :
Proteccion:
Ver "
sha1collisiondetection
" por Marc StevensNuevamente, con Q1 2018 Git 2.16 agregando una estructura que representa el algoritmo hash, ha comenzado la implementación de una transición a un nuevo hash.
Como se mencionó anteriormente, el nuevo Hash compatible será SHA-256 .
fuente
git-svn
aunque" se refiere a él, aunque indirectamente)Creo que los criptógrafos lo celebrarían.
Cita del artículo de Wikipedia sobre SHA-1 :
fuente
y
tal queh(x) ==
h (y) `, que es una amenaza grave para datos arbitrarios como certificados SSL, sin embargo, esto no afecta a Git, que sería vulnerable a un segundo ataque previo a la imagen, lo que significa que teniendo el mensajex
se puede modificar el mensajex'
queh(x) == h(x')
. Entonces este ataque no debilita a Git. Además, Git no ha elegido SHA-1 por razones de seguridad.Hay varios modelos de ataque diferentes para hashes como SHA-1, pero el que generalmente se discute es la búsqueda de colisiones, incluida la herramienta HashClash de Marc Stevens .
Como la gente señaló, podría forzar una colisión de hash con git, pero hacerlo no sobrescribirá los objetos existentes en otro repositorio. Me imagino que incluso
git push -f --no-thin
no sobrescribirá los objetos existentes, pero no estoy 100% seguro.Dicho esto, si piratea un repositorio remoto, entonces podría convertir su objeto falso en el más antiguo allí , posiblemente incrustando código pirateado en un proyecto de código abierto en github o similar. Si fue cuidadoso, entonces podría presentar una versión pirateada que los nuevos usuarios descargaron.
Sin embargo, sospecho que muchas cosas que los desarrolladores del proyecto podrían hacer podrían exponer o destruir accidentalmente su truco multimillonario. En particular, eso es una gran cantidad de dinero por el desagüe si algún desarrollador, a quien no hackeaste, alguna vez ejecuta lo mencionado
git push --no-thin
después de modificar los archivos afectados, a veces incluso sin la--no-thin
dependencia.fuente