Sbgodin

Ce site ne comporte aucune information d’intérêt, sauf pour celui qui la cherche — Ĉi-retejo ne enhavas informon interesan, krom por iu kiu ĝin serĉas — This website doesn’t have any information of interest, except for who looks for it

SHAdow.py

Rédigé par Sbgodin Aucun commentaire
La collision Shattered expliquée en Python. L'attaque consiste en la fabrication de deux fichiers PDF produisant le même condensat SHA1, mais pouvant contenir n'importe quelle image. Ici, on applique le principe à deux simples programmes Python.

J'ai lu avec intérêt l'article du blog de Om concernant la collision trouvée sur SHA1. La nouveauté est qu'il ne s'agit pas d'une collision trouvée par hasard. Dans un tel cas, les deux fichiers produisant le même condensat seraient probablement illisibles.

La collision trouvée par l'équipe de Google, et expliquée sur shattered.io, a permis de produire deux fichiers PDF avec le même condensat et ayant du sens.

Om exploite la méthode avec deux autres images au choix (JPEG de moins de 64Kio). L'article détaille la méthode appliquée aux fichiers PDF. Si on fait abstraction de ce cas particulier, l'explication est en fait simple.

Le concept

Ajouter le même contenu C à deux fichiers A et B de même SHA1 produit deux fichiers ayant le même SHA1 :
SHA1(A) = SHA1(B) ⇒ SHA1(A∥C) = SHA1(B∥C). On peut réaliser ceci en ligne de commande :

(cat shattered-1.pdf ; echo -n "truc") | sha1sum
(cat shattered-2.pdf ; echo -n "truc") | sha1sum
Les deux condensats sont identiques pourvu que A et B aient le même condensat, sans forcément être identiques. Pour tester, on peut récuperer shattered-1.pdf et shattered-2.pdf. Les deux commandes sus-citées fournissent le condensat c19c06bdcca0a070afc1f5678c10228231414bde. À l'origine, les deux fichiers téléchargés fournissent 38762cf7f55934b34d179ae6a4c80cadccbb7f0a.

La collision repose sur deux débuts de fichiers différents, que j'appellerai ici amorces, et ayant donc le même condensat. L'ajout d'une partie fixe commune aux deux fichiers, la charge permettra de présenter l'une ou l'autre des parties en fonction de l'amorce.

Preuve de concept en Python

Soient deux amorces en Python ayant le même condensat SHA1. Naturellement, les amorces présentées ici n'ont pas le même condensat. Mais on va faire comme si.

Voici l'amorce A, elle affiche la variable a :

def p(a,b): print(a) # Cette ligne est l'amorce A

Voici l'amorce B, elle affiche la variable b :

def p(a,b): print(b) # Cette ligne est l'amorce B

Ces deux amorces produisent, par hypothèse, le même condensat. Voici la charge (C), elle est identique pour les deux programmes :

a='un'
b='deux'
p(a,b)
Le premier programme est obtenu en concaténant l'amorce A avec la charge C :
def p(a,b): print(a) # Cette ligne est l'amorce A
a='un'
b='deux'
p(a,b)
Le deuxième programme est obtenu en concaténant l'amorce B avec la charge C :
def p(a,b): print(b) # Cette ligne est l'amorce B
a='un'
b='deux'
p(a,b)

Ces deux programmes sont identiques, à l'exception du print(). Par hypothèse, les deux amorces ont le même condensat. La charge ajoutée aux deux amorces modifie les condensats, mais de manière identique. Le premier programme affiche «un» tandis que le deuxième programme affiche «deux», alors qu'ils ont le même condensat. On peut modifier la charge pour lui faire afficher ce qu'on veut.

Par hypothèse, SHA1(A) = SHA1(B) et ainsi SHA1(A∥C) = SHA1(B∥C)


Permesilo Krea Komunaĵo
Ĉi tiu verko estas disponebla laŭ la permesilo Krea Komunaĵo Atribuite-Samkondiĉe 4.0 Tutmonda.
http://sbgodin.fr/

Fil RSS des commentaires de cet article

Écrire un commentaire

Quelle est la troisième lettre du mot vjzjca ?