Cela n'est probablement jamais arrivé dans le monde réel et ne se produira peut-être jamais, mais considérons ceci: disons que vous avez un référentiel git, faites un commit et obtenez très très malchanceux: l'un des blobs finit par avoir le même SHA-1 comme un autre qui est déjà dans votre référentiel. La question est de savoir comment Git gérerait cela? Tout simplement échouer? Trouver un moyen de lier les deux blobs et vérifier lequel est nécessaire en fonction du contexte?
Plus un casse-tête qu'un problème réel, mais j'ai trouvé le problème intéressant.
git
hash-collision
Gnurou
la source
la source
Réponses:
J'ai fait une expérience pour savoir exactement comment Git se comporterait dans ce cas. C'est avec la version 2.7.9 ~ rc0 + next.20151210 (version Debian). J'ai simplement réduit la taille de hachage de 160 bits à 4 bits en appliquant le diff suivant et en reconstruisant git:
Puis j'ai fait quelques commits et j'ai remarqué ce qui suit.
Pour # 2, vous obtiendrez généralement une erreur comme celle-ci lorsque vous exécutez "git push":
ou:
si vous supprimez le fichier, puis exécutez "git checkout file.txt".
Pour # 4 et # 6, vous obtiendrez généralement une erreur comme celle-ci:
lors de l'exécution de "git commit". Dans ce cas, vous pouvez généralement taper à nouveau "git commit" car cela créera un nouveau hachage (en raison de l'horodatage modifié)
Pour # 5 et # 9, vous obtiendrez généralement une erreur comme celle-ci:
lors de l'exécution de "git commit"
Si quelqu'un essaie de cloner votre référentiel corrompu, il verra généralement quelque chose comme:
Ce qui "m'inquiète", c'est que dans deux cas (2,3) le référentiel devient corrompu sans aucun avertissement, et dans 3 cas (1,7,8), tout semble correct, mais le contenu du référentiel est différent de ce que vous attendez être. Les personnes clonant ou tirant auront un contenu différent de ce que vous avez. Les cas 4,5,6 et 9 sont corrects, car cela s'arrêtera avec une erreur. Je suppose que ce serait mieux s'il échouait avec une erreur au moins dans tous les cas.
la source
Réponse originale (2012) (voir
shattered.io
collision SHA1 2017 ci-dessous)Cette ancienne réponse (2006) de Linus pourrait toujours être pertinente:
La question de l'utilisation de SHA-256 est régulièrement évoquée, mais pas pour l'instant (2012).
Remarque: à partir de 2018 et Git 2.19 , le code est en cours de refactorisation pour utiliser SHA-256.
Remarque (Humour): vous pouvez forcer un commit sur un préfixe SHA1 particulier , avec le projet gitbrute de Brad Fitzpatrick (
bradfitz
) .Exemple: https://github.com/bradfitz/deadbeef
Daniel Dinnyes souligne dans les commentaires de 7.1 Git Tools - Revision Selection , qui comprend:
Encore plus récemment (février 2017) a
shattered.io
démontré la possibilité de forger une collision SHA1:(voir beaucoup plus dans ma réponse séparée , y compris le post Google+ de Linus Torvalds)
Voir " Durée de vie des fonctions de hachage cryptographiques " de Valerie Anita Aurora pour plus d'informations.
Dans cette page, elle note:
Voir plus dans ma réponse séparée ci-dessous .
la source
/* This line added to avoid collision */
: D vous pouvez gagner la loterie deux fois: P/* This line added to avoid collision of the avoid collision line */
Selon Pro Git :
Donc, cela n'échouera pas, mais cela ne sauvera pas non plus votre nouvel objet.
Je ne sais pas à quoi cela ressemblerait sur la ligne de commande, mais ce serait certainement déroutant.
Un peu plus loin, cette même référence tente d'illustrer la probabilité d'une telle collision:
la source
Pour ajouter à ma réponse précédente de 2012 , il y a maintenant (février 2017, cinq ans plus tard), un exemple de collision SHA-1 réelle avec shattered.io , où vous pouvez créer deux fichiers PDF en collision: c'est-à-dire obtenir un SHA- 1 signature numérique sur le premier fichier PDF qui peut également être utilisée comme signature valide sur le deuxième fichier PDF.
Voir aussi « À la porte de la mort pendant des années, la fonction SHA1 largement utilisée est maintenant morte », et cette illustration .
Mise à jour du 26 février: Linus a confirmé les points suivants dans un post Google+ :
Concernant cette transition, voir le Git 2.16 du T1 2018 ajoutant une structure représentant l'algorithme de hachage. La mise en œuvre de cette transition a commencé.
À partir de Git 2.19 (Q3 2018) , Git a choisi SHA-256 comme NewHash et est en train de l'intégrer au code (ce qui signifie que SHA1 est toujours la valeur par défaut (Q2 2019, Git 2.21), mais SHA2 sera le successeur)
Réponse originale (25 février) Mais:
Il ne une question pour
git-svn
bien . Ou plutôt avec svn lui - même , comme on le voit ici .git fsck
, comme l'a mentionné Linus Torvalds aujourd'hui.git fsck
avertirait d'un message de validation avec des données opaques cachées après unNUL
(bien qu'ilNUL
ne soit pas toujours présent dans un fichier frauduleux ).Tout le monde ne s'allume pas
transfer.fsck
, mais GitHub le fait: toute poussée serait abandonnée dans le cas d'un objet mal formé ou d'un lien rompu. Bien que ... il y a une raison pour laquelle ce n'est pas activé par défaut .Le problème réel de la création de deux référentiels Git avec le même hachage de validation de tête et un contenu différent. Et même alors, l' attaque reste alambiquée .
Joey Hess essaie ces pdf dans un repo Git et il a trouvé :
Ainsi, le principal vecteur d'attaque (falsification d'un commit) serait :
De plus, vous pouvez déjà détecter et détecter les attaques par collision cryptanalytique contre SHA-1 présentes dans chaque fichier avec
cr-marcstevens/sha1collisiondetection
L'ajout d'une vérification similaire dans Git lui - même aurait un coût de calcul .
À propos du changement de hachage, Linux commente :
Pourtant, un plan de transition (de SHA1 à une autre fonction de hachage) serait toujours complexe , mais activement étudié.
Une
convert-to-object_id
campagne est en cours :Mise à jour du 20 mars: GitHub détaille une éventuelle attaque et sa protection :
Protection:
Voir "
sha1collisiondetection
" de Marc StevensEncore une fois, avec Qit 2018 Git 2.16 ajoutant une structure représentant un algorithme de hachage, l'implémentation d'une transition vers un nouveau hachage a commencé.
Comme mentionné ci-dessus, le nouveau hachage pris en charge sera SHA-256 .
la source
git-svn
cela" y fait référence, bien qu'indirectement)Je pense que les cryptographes feraient la fête.
Citation d'un article de Wikipedia sur SHA-1 :
la source
y
tel queh(x) ==
h (y) `qui constitue une menace sérieuse pour des données arbitraires comme les certificats SSL, mais cela n'affecte pas Git qui serait vulnérable à une deuxième attaque pré-image, ce qui signifie que ayant un messagex
vous pouvez le modifier au messagex'
queh(x) == h(x')
. Cette attaque n'affaiblit donc pas Git. Git n'a pas non plus choisi SHA-1 pour des raisons de sécurité.Il existe plusieurs modèles d'attaque différents pour les hachages comme SHA-1, mais celui généralement discuté est la recherche de collision, y compris l' outil HashClash de Marc Stevens .
Comme les gens l'ont souligné, vous pouvez forcer une collision de hachage avec git, mais cela n'écrasera pas les objets existants dans un autre référentiel. J'imagine même
git push -f --no-thin
ne pas écraser les objets existants, mais pas sûr à 100%.Cela dit, si vous pirater un dépôt distant , vous pouvez alors faire votre faux objet le plus ancien il y a , peut - être intégrer le code piraté dans un projet open source sur GitHub ou similaire. Si vous faites attention, vous pouvez peut-être introduire une version piratée téléchargée par les nouveaux utilisateurs.
Je soupçonne cependant que de nombreuses choses que les développeurs du projet pourraient faire pourraient exposer ou détruire accidentellement votre hack de plusieurs millions de dollars. En particulier, cela coûte beaucoup d'argent si un développeur, que vous n'avez pas piraté, exécute jamais ce qui précède
git push --no-thin
après avoir modifié les fichiers concernés, parfois même sans le--no-thin
dépendre.la source