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+ :
(1) Primero, el cielo no se está cayendo. Hay una gran diferencia entre usar un hash criptográfico para cosas como la firma de seguridad y usar uno para generar un "identificador de contenido" para un sistema direccionable por contenido como git.
(2) En segundo lugar, la naturaleza de este ataque SHA1 en particular significa que en realidad es bastante fácil mitigarlo, y ya se han publicado dos conjuntos de parches para esa mitigación.
(3) Y finalmente, en realidad hay una transición razonablemente sencilla a otro hash que no romperá el mundo, o incluso los viejos repositorios de git.
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:
- Esto permite forjar un blob, sin embargo, el SHA-1 del árbol seguiría cambiando ya que el tamaño del blob forjado podría no ser el mismo que el original: consulte " ¿Cómo se calcula el hash git? "; un blob SHA1 se calcula en función del contenido y el tamaño .
Se tiene algún problema para git-svn
pesar . O más bien con svn en sí , como se ve aquí .
- Como mencioné en mi respuesta original , el costo de tal intento todavía es prohibitivo por ahora (6.500 años de CPU y 100 años de GPU). Véase también Valerie Anita Aurora en " Vidas de funciones hash criptográficas ".
- Como se comentó anteriormente, no se trata de seguridad o confianza, sino de integridad de datos (desduplicación y detección de errores) que puede ser fácilmente detectada por un
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 un NUL
(aunque NUL
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 .
- un archivo pdf puede tener datos binarios arbitrarios que puede cambiar para generar un SHA-1 en colisión, en oposición al código fuente falsificado.
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 .
- Linus agrega :
El objetivo de un SCM es que no se trata de un evento único, sino de un historial continuo. Eso también significa fundamentalmente que un ataque exitoso debe funcionar con el tiempo y no ser detectable.
Si puede engañar a un SCM una vez, inserte su código, y se detectará la próxima semana, en realidad no hizo nada útil. Solo te quemaste a ti mismo.
Joey Hess prueba esos pdf en un repositorio de Git y encontró :
Eso incluye dos archivos con el mismo SHA y tamaño, que obtienen diferentes blobs gracias a la forma en que git antepone el encabezado al contenido.
joey@darkstar:~/tmp/supercollider>sha1sum bad.pdf good.pdf
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a bad.pdf
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a good.pdf
joey@darkstar:~/tmp/supercollider>git ls-tree HEAD
100644 blob ca44e9913faf08d625346205e228e2265dd12b65 bad.pdf
100644 blob 5f90b67523865ad5b1391cb4a1c010d541c816c1 good.pdf
Si bien agregar datos idénticos a estos archivos en colisión genera otras colisiones, los datos anteriores no lo hacen.
Entonces, el vector principal de ataque (forjar un commit) sería :
- Generar un objeto de confirmación regular;
- use todo el objeto commit + NUL como el prefijo elegido, y
- use el ataque de colisión de prefijo idéntico para generar los objetos buenos / malos colisionantes.
- ... y esto es inútil porque los objetos de confirmación buenos y malos todavía apuntan al mismo árbol.
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 :
El tamaño del hash y la elección del algoritmo hash son cuestiones independientes.
Lo que probablemente haría es cambiar a un hash de 256 bits, usarlo internamente y en la base de datos nativa de git y, de forma predeterminada, solo
mostrar el hash como una cadena hexadecimal de 40 caracteres (algo así como cómo abreviamos las cosas en muchas situaciones)
De esa manera, las herramientas alrededor de git ni siquiera ven el cambio a menos que se lo pase en algún " --full-hash
" argumento especial (o " --abbrev=64
" o lo que sea - el valor predeterminado es que abreviamos a 40).
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 :
A los nombres SHA-1 se les puede asignar confianza a través de varios mecanismos. Por ejemplo, Git le permite firmar criptográficamente una confirmación o etiqueta. Al hacerlo, solo se firma el objeto commit o tag, que a su vez apunta a otros objetos que contienen los datos reales del archivo utilizando sus nombres SHA-1. Una colisión en esos objetos podría producir una firma que parece válida, pero que apunta a datos diferentes de los que pretendía el firmante. En tal ataque, el firmante solo ve la mitad de la colisión, y la víctima ve la otra mitad.
Proteccion:
El reciente ataque utiliza técnicas especiales para explotar las debilidades en el algoritmo SHA-1 que encuentran una colisión en mucho menos tiempo. Estas técnicas dejan un patrón en los bytes que se puede detectar al calcular el SHA-1 de cualquier mitad de un par colisionante.
GitHub.com ahora realiza esta detección para cada SHA-1 que calcula, y aborta la operación si hay evidencia de que el objeto es la mitad de un par colisionante. Eso evita que los atacantes usen GitHub para convencer a un proyecto de que acepte la mitad "inocente" de su colisión, así como evitar que alojen la mitad maliciosa.
Ver " sha1collisiondetection
" por Marc Stevens
Nuevamente, 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 .