Dies ist wahrscheinlich noch nie in der realen Welt passiert und wird vielleicht auch nie passieren, aber lassen Sie uns Folgendes bedenken: Angenommen, Sie haben ein Git-Repository, machen ein Commit und haben sehr, sehr viel Pech: Einer der Blobs hat am Ende den gleichen SHA-1 als eine andere, die bereits in Ihrem Repository ist. Die Frage ist, wie würde Git damit umgehen? Einfach scheitern? Finden Sie einen Weg, um die beiden Blobs zu verknüpfen und zu überprüfen, welcher für den jeweiligen Kontext benötigt wird?
Eher ein Rätsel als ein eigentliches Problem, aber ich fand das Problem interessant.
git
hash-collision
Gnurou
quelle
quelle
Antworten:
Ich habe ein Experiment durchgeführt, um herauszufinden, wie sich Git in diesem Fall genau verhalten würde. Dies ist mit Version 2.7.9 ~ rc0 + next.20151210 (Debian-Version). Ich habe im Grunde nur die Hash-Größe von 160-Bit auf 4-Bit reduziert, indem ich das folgende Diff angewendet und Git neu erstellt habe:
Dann habe ich ein paar Commits gemacht und Folgendes bemerkt.
Für # 2 wird normalerweise ein Fehler wie der folgende angezeigt, wenn Sie "git push" ausführen:
oder:
Wenn Sie die Datei löschen und dann "git checkout file.txt" ausführen.
Bei # 4 und # 6 wird normalerweise ein Fehler wie der folgende angezeigt:
beim Ausführen von "git commit". In diesem Fall können Sie normalerweise einfach "git commit" erneut eingeben, da dadurch ein neuer Hash erstellt wird (aufgrund des geänderten Zeitstempels).
Bei # 5 und # 9 wird normalerweise ein Fehler wie der folgende angezeigt:
beim Ausführen von "git commit"
Wenn jemand versucht, Ihr beschädigtes Repository zu klonen, sieht er normalerweise Folgendes:
Was mich "beunruhigt" ist, dass in zwei Fällen (2,3) das Repository ohne Warnungen beschädigt wird, und in drei Fällen (1,7,8) scheint alles in Ordnung zu sein, aber der Repository-Inhalt unterscheidet sich von dem, was Sie erwarten sein. Menschen, die klonen oder ziehen, haben einen anderen Inhalt als Sie. Die Fälle 4,5,6 und 9 sind in Ordnung, da sie mit einem Fehler beendet werden. Ich nehme an, es wäre besser, wenn es zumindest in allen Fällen mit einem Fehler fehlschlagen würde.
quelle
Ursprüngliche Antwort (2012) (siehe
shattered.io
SHA1-Kollision 2017 unten)Diese alte Antwort (2006) von Linus könnte immer noch relevant sein:
Die Frage der Verwendung von SHA-256 wird regelmäßig erwähnt, aber vorerst nicht behandelt (2012).
Hinweis: Ab 2018 und Git 2.19 wird der Code für die Verwendung von SHA-256 überarbeitet.
Hinweis (Humor): Mit dem Projekt gitbrute von Brad Fitzpatrick ( ) können Sie ein Commit für ein bestimmtes SHA1- Präfix erzwingen .
bradfitz
Beispiel: https://github.com/bradfitz/deadbeef
Daniel Dinnyes weist in den Kommentaren zu 7.1 Git Tools - Revisionsauswahl darauf hin , dass:
Noch in jüngerer Zeit (Februar 2017) wurde
shattered.io
die Möglichkeit einer SHA1-Kollision aufgezeigt:(Weitere Informationen finden Sie in meiner separaten Antwort , einschließlich des Google+ Posts von Linus Torvalds.)
Weitere Informationen finden Sie unter " Lebensdauern kryptografischer Hash-Funktionen " von Valerie Anita Aurora .
Auf dieser Seite stellt sie fest:
Weitere Informationen finden Sie in meiner separaten Antwort unten .
quelle
/* This line added to avoid collision */
: D Sie können die Lotterie zweimal gewinnen: P/* This line added to avoid collision of the avoid collision line */
Laut Pro Git :
Es würde also nicht scheitern, aber es würde auch Ihr neues Objekt nicht speichern.
Ich weiß nicht, wie das in der Kommandozeile aussehen würde, aber das wäre sicherlich verwirrend.
Etwas weiter unten versucht dieselbe Referenz, die Wahrscheinlichkeit einer solchen Kollision zu veranschaulichen:
quelle
Um meine vorherige Antwort aus dem Jahr 2012 zu ergänzen , gibt es jetzt (Februar 2017, fünf Jahre später) ein Beispiel für eine tatsächliche SHA-1-Kollision mit shattered.io , bei der Sie zwei kollidierende PDF-Dateien erstellen können: das heißt, Sie erhalten eine SHA- 1 digitale Signatur in der ersten PDF-Datei, die auch als gültige Signatur in der zweiten PDF-Datei missbraucht werden kann.
Siehe auch " Seit Jahren vor der Tür des Todes ist die weit verbreitete SHA1-Funktion jetzt tot " und diese Abbildung .
Update 26. Februar: Linus hat die folgenden Punkte in einem Google+ Beitrag bestätigt :
Bezüglich dieses Übergangs siehe die Q1 2018 Git 2.16 , in dem eine Struktur hinzugefügt wird, die den Hash-Algorithmus darstellt. Die Umsetzung dieses Übergangs hat begonnen.
Ab Git 2.19 (Q3 2018) hat Git ausgewählt SHA-256 als NewHash ausgewählt und ist dabei, es in den Code zu integrieren (was bedeutet, dass SHA1 immer noch die Standardeinstellung ist (Q2 2019, Git 2.21), aber SHA2 wird der Nachfolger sein).
Ursprüngliche Antwort (25. Februar) Aber:
Es gibt jedoch einige
git-svn
Probleme . Oder besser gesagt mit svn selbst als hier zu sehen .git fsck
, wie Linus Torvalds heute erwähnt.git fsck
würde vor einer Festschreibungsnachricht mit undurchsichtigen Daten warnen, die nach a ausgeblendet werdenNUL
(obwohl diesNUL
in einer betrügerischen Datei nicht immer vorhanden ist ).Nicht jeder schaltet sich ein
transfer.fsck
, GitHub jedoch: Jeder Push wird abgebrochen, wenn ein fehlerhaftes Objekt oder ein defekter Link vorhanden ist. Obwohl ... es gibt eine Grund dies nicht standardmäßig aktiviert .Das eigentliche Problem beim Erstellen von zwei Git-Repositorys mit demselben Head-Commit-Hash und unterschiedlichen Inhalten. Und selbst dann bleibt der Angriff verwickelt .
Joey Hess probiert diese PDFs in einem Git-Repo aus und fand :
Der Hauptangriffsvektor (Schmieden eines Commits) wäre also :
Außerdem können Sie bereits kryptoanalytische Kollisionsangriffe gegen SHA-1 erkennen, die in jeder Datei mit vorhanden sind
cr-marcstevens/sha1collisiondetection
Das Hinzufügen einer ähnlichen Prüfung in Git selbst würde einige Berechnungskosten verursachen .
Beim Ändern des Hashs kommentiert Linux :
Ein Übergangsplan (von SHA1 zu einer anderen Hash-Funktion) wäre immer noch komplex , würde aber aktiv untersucht.
Eine
convert-to-object_id
Kampagne ist im Gange :Update 20. März: GitHub beschreibt einen möglichen Angriff und seinen Schutz :
Schutz:
Siehe "
sha1collisiondetection
" von Marc StevensMit dem Hinzufügen einer Struktur, die den Hash-Algorithmus darstellt, im ersten Quartal 2018, Git 2.16 , wurde erneut die Implementierung eines Übergangs zu einem neuen Hash gestartet.
Wie oben erwähnt, wird der neue unterstützte Hash SHA-256 sein .
quelle
git-svn
obwohl" bezieht sich darauf, wenn auch indirekt)Ich denke, Kryptographen würden feiern.
Zitat aus dem Wikipedia-Artikel zu SHA-1 :
quelle
y
so dassh(x) ==
h (y) ` , die für beliebige Daten wie SSL - Zertifikate ernsthafte Bedrohung ist dies jedoch nicht Git beeinflussen , welche auf dem zweiten Urbild Angriff anfällig sein würde , was bedeutet , dass mit Meldungx
können Sie es auf die Nachricht ändern ,x'
dassh(x) == h(x')
. Dieser Angriff schwächt Git also nicht. Außerdem hat Git aus Sicherheitsgründen SHA-1 nicht ausgewählt.Es gibt verschiedene Angriffsmodelle für Hashes wie SHA-1, aber das normalerweise diskutierte ist die Kollisionssuche, einschließlich des HashClash- Tools von Marc Stevens .
Wie die Leute betonten, könnten Sie eine Hash-Kollision mit git erzwingen, aber dadurch werden die vorhandenen Objekte in einem anderen Repository nicht überschrieben. Ich würde mir sogar vorstellen
git push -f --no-thin
dass die vorhandenen Objekte nicht überschrieben werden, aber nicht 100% sicher sind.Das heißt, wenn Sie sich in ein Remote-Repository hacken, können Sie Ihr falsches Objekt dort zum älteren machen und möglicherweise gehackten Code in ein Open-Source-Projekt auf Github oder ähnlichem einbetten. Wenn Sie vorsichtig waren, könnten Sie vielleicht eine gehackte Version einführen, die neue Benutzer heruntergeladen haben.
Ich vermute jedoch, dass viele Dinge, die die Entwickler des Projekts tun könnten, Ihren millionenschweren Hack entweder aufdecken oder versehentlich zerstören könnten. Insbesondere ist das eine Menge Geld, wenn ein Entwickler, den Sie nicht gehackt haben, jemals das oben Genannte ausführt,
git push --no-thin
nachdem er die betroffenen Dateien geändert hat, manchmal sogar ohne die--no-thin
Abhängigkeit.quelle