Prawdopodobnie nigdy się to nie zdarzyło w prawdziwym świecie i może się nigdy nie wydarzyć, ale zastanówmy się nad tym: powiedzmy, że masz repozytorium git, dokonaj zatwierdzenia i otrzymaj bardzo pecha: jedna z kropek kończy się tym samym SHA-1 jako kolejny, który jest już w twoim repozytorium. Pytanie brzmi, jak Git sobie z tym poradzi? Po prostu zawieść? Znajdź sposób na połączenie dwóch obiektów blob i sprawdzenie, który jest potrzebny zgodnie z kontekstem?
Bardziej łamigłówka niż rzeczywisty problem, ale uważam ten problem za interesujący.
git
hash-collision
Gnurou
źródło
źródło
Odpowiedzi:
Zrobiłem eksperyment, aby dowiedzieć się, jak Git zachowałby się w tym przypadku. Dotyczy to wersji 2.7.9 ~ rc0 + next.20151210 (wersja Debian). Zasadniczo właśnie zmniejszyłem rozmiar skrótu ze 160-bitowego do 4-bitowego, stosując następujący diff i przebudowując git:
Potem zrobiłem kilka zmian i zauważyłem następujące.
W przypadku nr 2 zazwyczaj pojawia się taki błąd, gdy uruchomisz polecenie „git push”:
lub:
jeśli usuniesz plik, a następnie uruchom „git checkout file.txt”.
W przypadku # 4 i # 6 zazwyczaj pojawia się taki błąd:
podczas uruchamiania „git commit”. W takim przypadku zazwyczaj możesz po prostu ponownie wpisać „git commit”, ponieważ spowoduje to utworzenie nowego skrótu (z powodu zmienionego znacznika czasu)
W przypadku nr 5 i nr 9 zazwyczaj występuje taki błąd:
podczas uruchamiania „git commit”
Jeśli ktoś spróbuje sklonować twoje uszkodzone repozytorium, zwykle zobaczy coś takiego:
Martwi mnie to, że w dwóch przypadkach (2,3) repozytorium ulega uszkodzeniu bez ostrzeżeń, aw 3 przypadkach (1,7,8) wszystko wydaje się w porządku, ale zawartość repozytorium jest inna niż się tego spodziewasz być. Ludzie klonujący lub ciągnący będą mieć inną zawartość niż to, co masz. Przypadki 4,5,6 i 9 są w porządku, ponieważ zatrzyma się z błędem. Przypuszczam, że lepiej by było, gdyby błąd zawiódł co najmniej we wszystkich przypadkach.
źródło
Oryginalna odpowiedź (2012) (patrz
shattered.io
kolizja SHA1 2017 poniżej)Ta stara odpowiedź Linusa (2006) może być nadal aktualna:
Kwestia korzystania SHA-256 jest regularnie wspomniano, ale nie działają na Dotychczas (2012).
Uwaga: od 2018 r. I Gita 2.19 kod jest refaktoryzowany do użycia SHA-256.
Uwaga (humor): możesz wymusić zatwierdzenie określonego prefiksu SHA1 za pomocą projektu gitbrute z Brada Fitzpatricka (
bradfitz
) .Przykład: https://github.com/bradfitz/deadbeef
Daniel Dinnyes zwraca uwagę w komentarzach do 7.1 Git Tools - Wybór wersji , który obejmuje:
Nawet ostatnio (luty 2017 r.)
shattered.io
Zademonstrowano możliwość sfałszowania zderzenia SHA1:(zobacz więcej w mojej osobnej odpowiedzi , w tym postu Linusa Torvaldsa w Google+)
Aby uzyskać więcej informacji, zobacz „ Żywotność kryptograficznych funkcji mieszających ” autorstwa Valerie Anita Aurora .
Na tej stronie zauważa:
Zobacz więcej w mojej osobnej odpowiedzi poniżej .
źródło
/* This line added to avoid collision */
: D możesz wygrać na loterii dwa razy: P/* This line added to avoid collision of the avoid collision line */
Według Pro Git :
Więc nie zawiedzie, ale też nie uratuje twojego nowego obiektu.
Nie wiem, jak by to wyglądało w wierszu poleceń, ale z pewnością byłoby to mylące.
Nieco dalej ta sama referencja próbuje zilustrować prawdopodobieństwo takiej kolizji:
źródło
Aby dodać do mojej poprzedniej odpowiedzi z 2012 r. , Jest teraz (luty 2017 r., Pięć lat później) przykład rzeczywistej kolizji SHA-1 z shattered.io , w której można stworzyć dwa kolidujące pliki PDF: uzyskać SHA- 1 podpis cyfrowy na pierwszym pliku PDF, który może być również wykorzystany jako ważny podpis na drugim pliku PDF.
Zobacz także „ U drzwi śmierci od wielu lat powszechnie używana funkcja SHA1 jest już martwa ” i ta ilustracja .
Aktualizacja 26 lutego: Linus potwierdził następujące punkty w poście Google+ :
Jeśli chodzi o to przejście, zobacz Git 2.16 z pierwszego kwartału 2018 r., Dodając strukturę reprezentującą algorytm mieszania. Rozpoczęto wdrażanie tego przejścia.
Począwszy od Gita 2.19 (III kwartał 2018 r.) , Git wybrał SHA-256 jako NewHash i jest w trakcie integracji go z kodem (co oznacza, że SHA1 jest nadal domyślny (Q2 2019, Git 2.21), ale SHA2 będzie następcą)
Oryginalna odpowiedź (25 lutego) Ale:
To ma jakiś problem dla
git-svn
chociaż . A raczej z samym svn , jak widać tutaj .git fsck
, jak wspominał dziś Linus Torvalds .git fsck
ostrzegałby przed komunikatem zatwierdzenia z nieprzezroczystymi danymi ukrytymi poNUL
(chociażNUL
nie zawsze jest obecny w fałszywym pliku ).Nie wszyscy się włączają
transfer.fsck
, ale GitHub tak: każde wypychanie zostanie przerwane w przypadku źle sformułowanego obiektu lub przerwanego łącza. Chociaż ... istnieje powód, dla którego domyślnie nie jest aktywowany .Rzeczywisty problem z tworzeniem dwóch repozytoriów Git z tym samym hasłem zatwierdzania głowy i inną zawartością. I nawet wtedy atak pozostaje zawiły .
Joey Hess wypróbowuje te pliki pdf w repozytorium Git i znalazł :
Zatem głównym wektorem ataku (fałszowanie zatwierdzenia) byłoby :
Dodatkowo możesz już wykryć kryptoanalityczne ataki zderzeniowe przeciwko SHA-1 obecnemu w każdym pliku z
cr-marcstevens/sha1collisiondetection
Dodanie podobnego czeku w samym Gicie wiązałoby się z pewnymi kosztami obliczeniowymi .
Podczas zmiany skrótu Linux komentuje :
Mimo to plan przejścia (z SHA1 na inną funkcję skrótu) byłby nadal złożony , ale aktywnie badany. Kampania jest w toku :
convert-to-object_id
Aktualizacja 20 marca: GitHub szczegółowo opisuje możliwy atak i jego ochronę :
Ochrona:
Zobacz „
sha1collisiondetection
” autorstwa Marc StevensaPonownie, wraz z dodaniem przez Git 2.16 struktury Q1 2018 reprezentującej algorytm mieszania, rozpoczęto wdrażanie przejścia na nowy skrót.
Jak wspomniano powyżej, nowym obsługiwanym hashem będzie SHA-256 .
źródło
git-svn
Chociaż ma to jakiś problem ”, choć odnosi się do tego, choć pośrednio)Myślę, że kryptografowie świętowaliby.
Cytat z artykułu w Wikipedii na temat SHA-1 :
źródło
y
taki, żeh(x) ==
h (y) `jest poważnym zagrożeniem dla dowolnych danych, takich jak certyfikaty SSL, jednak nie wpływa to na Git, który byłby podatny na drugi atak przed obrazem, co oznacza, że posiadające wiadomościx
można zmodyfikować go do wiadomościx'
tegoh(x) == h(x')
. Więc ten atak nie osłabia Gita. Również Git nie wybrał SHA-1 ze względów bezpieczeństwa.Istnieje kilka różnych modeli ataku dla skrótów, takich jak SHA-1, ale najczęściej omawianym jest wyszukiwanie kolizji, w tym narzędzie HashClash Marca Stevensa .
Jak zauważyli ludzie, możesz wymusić kolizję skrótu z git, ale nie spowoduje to zastąpienia istniejących obiektów w innym repozytorium. Wyobrażam sobie, że nawet
git push -f --no-thin
nie nadpisze istniejących obiektów, ale nie jestem w 100% pewien.Powiedział, że jeśli włamać się do zdalnego repozytorium, a następnie można dokonać fałszywe obiekt starszy tam , ewentualnie osadzania kodu włamał się do projektu open source na github lub podobnym. Jeśli byłeś ostrożny, być może mógłbyś wprowadzić zhakowaną wersję, którą pobrali nowi użytkownicy.
Podejrzewam jednak, że wiele rzeczy, które mogliby zrobić programiści projektu, mogą albo ujawnić, albo przypadkowo zniszczyć hack o wartości wielu milionów dolarów. W szczególności jest to dużo pieniędzy, jeśli jakiś programista, którego nie zhakowałeś, kiedykolwiek uruchomił wspomniane wyżej
git push --no-thin
po zmodyfikowaniu plików, czasem nawet bez--no-thin
zależności.źródło