
Colisiones de hash y sus explotaciones
TL;DR conseguir una colisión MD5 de estas dos imágenes ahora es(*) trivial e instantáneo.
⟷
<a href=http://gunshowcomic.com/648>
No juegues con fuego, no confíes en MD5.
(*) Colisionar cualquier par de archivos ha sido posible durante muchos años, pero lleva varias horas cada vez, sin atajos.
Esta página proporciona trucos específicos para formatos de archivo y prefijos de colisión precomputados para hacer la colisión instantánea.
git clone. Ejecuta el script. Listo.
Por Ange Albertini y Marc Stevens.
El objetivo es explorar ampliamente los ataques existentes - y mostrar de paso lo débil que es MD5 (colisiones instantáneas de cualquier JPG, PNG, PDF, MP4, PE...) - y también explorar en detalle los formatos de archivo comunes para determinar cómo pueden ser explotados con ataques presentes o futuros.
De hecho, el mismo truco de formato de archivo puede usarse en varios hashes (los mismos trucos JPG se usaron para MD5, malicious SHA-1 y SHA1), siempre que las colisiones sigan los mismos patrones de bytes.
Este documento no trata sobre nuevos ataques (el más reciente fue documentado en 2012), sino sobre nuevas formas de explotación de los ataques existentes.
Estado actual - a diciembre de 2018 - de los ataques conocidos:
obtener un archivo que tenga el hash de otro archivo o un hash dado: imposible
obtener dos archivos diferentes con el mismo MD5: instantáneo
hacer que dos archivos arbitrarios tengan el mismo MD5: unas pocas horas (72 horas.núcleo)
hacer que dos archivos arbitrarios de formatos de archivo específicos (PNG, JPG, PE...) tengan el mismo MD5: instantáneo
obtener dos archivos diferentes con el mismo SHA1: 6500 años.núcleo
(*) ejemplo con crypt - gracias Sven!```
import crypt crypt.crypt("5dUD&66", "br") 'brokenOz4KxMc' crypt.crypt("O!>',%$", "br") 'brokenOz4KxMc'
# Ataques
MD5 y SHA1 trabajan con bloques de 64 bytes.
Si dos contenidos A y B tienen el mismo hash, entonces añadir el mismo contenido C a ambos mantendrá el mismo hash.``` text
hash(A) = hash(B) -> hash(A + C) = hash(B + C)
Las colisiones funcionan insertando en un límite de bloque un número de bloques de colisión calculados que depende de lo que haya antes en el archivo. Estos bloques de colisión tienen una apariencia muy aleatoria con algunas diferencias menores (que siguen un patrón específico para cada ataque) e introducirán pequeñas diferencias mientras que, finalmente, se logra que los hashes tengan el mismo valor después de estos bloques.
Estas diferencias se aprovechan para crear archivos válidos con propiedades específicas.
Los formatos de archivo también funcionan de arriba hacia abajo, y la mayoría funcionan por fragmentos a nivel de bytes.
Algunos fragmentos 'comentario' pueden insertarse para alinear los fragmentos del archivo con los límites de bloque, para alinear estructuras específicas con las diferencias de los bloques de colisión, para ocultar el resto de la aleatoriedad de los bloques de colisión de los analizadores del archivo, y para ocultar contenido por lo demás válido del analizador (de modo que vea otro contenido).
Estos fragmentos 'comentario' a menudo no son comentarios oficiales reales: solo se utilizan como contenedores de datos que el analizador ignora (por ejemplo, los fragmentos PNG con un ID que comienza en minúscula son auxiliares, no críticos).
La mayoría de las veces, una diferencia en los bloques de colisión se usa para modificar la longitud de un fragmento comentario,
que normalmente se declara justo antes de los datos de este fragmento:
en el espacio entre la versión más corta y la más larga de este fragmento,
se declara otro fragmento comentario para saltar sobre el contenido A de un archivo.
Después de este contenido A, simplemente añade otro contenido B.

Dado que los formatos de archivo suelen definir un terminador que hará que los analizadores se detengan después de él,
A terminará el análisis, lo que hará que el contenido añadido B se ignore.
Así que normalmente se necesitan al menos dos comentarios - a menudo tres: