Как Git обработает столкновение SHA-1 с BLOB-объектом?

Вероятно, этого никогда не происходило в реальном мире, и, возможно, никогда не произойдет, но давайте рассмотрим следующее: допустим, у вас есть репозиторий git, сделайте фиксацию и вам очень-очень не повезло: один из блобов в конечном итоге имеет тот же SHA-1 как другой, который уже есть в вашем репозитории. Вопрос в том, как Git справится с этим? Просто потерпеть неудачу? Найти способ связать два больших двоичных объекта и проверить, какой из них требуется в соответствии с контекстом?

Скорее головоломка, чем реальная проблема, но проблема мне показалась интересной.


person Gnurou    schedule 22.02.2012    source источник
comment
Когда-то это была головоломка, а теперь потенциально реальная проблема .   -  person    schedule 23.02.2017
comment
@Toby Этот вопрос касался атаки с использованием предварительного изображения; то, что продемонстрировал Google, - это коллизионная атака - похожая, но немного отличающаяся. Вы можете узнать больше о разнице здесь.   -  person Saheed    schedule 23.02.2017
comment
@Saheed Я не понимаю, какая часть этого вопроса конкретно относится к атаке с предварительным изображением, поскольку поставленный вопрос касается как раз столкновения в репозитории git, а не его эксплуатации.   -  person    schedule 24.02.2017
comment
@Toby Первоначальный тизер был не об атаке (ни прообразе, ни о столкновении), а о случайном столкновении, которое настолько невероятно маловероятно, что не стоит его рассматривать. Я думаю, что Сахид правильно пытался сказать, что это все еще не актуальная проблема. Однако вы правы в том, что атака столкновения Google потенциально создала проблему безопасности в зависимости от того, как используется Git.   -  person Andrew W. Phillips    schedule 25.02.2017
comment
Вот вторая коллизия размером всего 320 байт privacylog.blogspot.com/ 12 декабря 2019 г. / the-second-sha-collision.html   -  person William Entriken    schedule 31.12.2019
comment
С развитием выбранной префиксной атаки для SHA-1; это переходит в сферу возможного. arstechnica.com/information-technology/2020/01/   -  person Dan Is Fiddling By Firelight    schedule 07.01.2020
comment
Почему git не только проверяет наличие сговора SHA-1? Все проблемы решатся.   -  person Prihex    schedule 22.07.2020


Ответы (6)


Я провел эксперимент, чтобы выяснить, как именно Git будет вести себя в этом случае. Это версия 2.7.9 ~ rc0 + next.20151210 (версия Debian). Я просто уменьшил размер хэша со 160 до 4 бит, применив следующий diff и перестроив git:

--- git-2.7.0~rc0+next.20151210.orig/block-sha1/sha1.c
+++ git-2.7.0~rc0+next.20151210/block-sha1/sha1.c
@@ -246,6 +246,8 @@ void blk_SHA1_Final(unsigned char hashou
    blk_SHA1_Update(ctx, padlen, 8);

    /* Output hash */
-   for (i = 0; i < 5; i++)
-       put_be32(hashout + i * 4, ctx->H[i]);
+   for (i = 0; i < 1; i++)
+       put_be32(hashout + i * 4, (ctx->H[i] & 0xf000000));
+   for (i = 1; i < 5; i++)
+       put_be32(hashout + i * 4, 0);
 }

Затем я сделал несколько коммитов и заметил следующее.

  1. Если большой двоичный объект с таким же хешем уже существует, вы вообще не получите никаких предупреждений. Кажется, все в порядке, но если вы нажмете кнопку, кто-то клонирует или вернетесь назад, вы потеряете последнюю версию (в соответствии с тем, что описано выше).
  2. Если объект дерева уже существует и вы создаете blob-объект с тем же хешем: все будет казаться нормальным, пока вы не попытаетесь отправить или кто-то клонирует ваш репозиторий. Тогда вы увидите, что репо повреждено.
  3. Если объект фиксации уже существует, и вы создаете большой двоичный объект с тем же хешем: то же, что и # 2 - поврежден
  4. Если большой двоичный объект уже существует, и вы создаете объект фиксации с тем же хешем, при обновлении «ref» произойдет сбой.
  5. Если большой двоичный объект уже существует, и вы создаете объект дерева с тем же хешем. Это не удастся при создании фиксации.
  6. Если объект-дерево уже существует, и вы делаете объект фиксации с тем же хешем, при обновлении «ref» произойдет сбой.
  7. Если объект-дерево уже существует, и вы создаете объект-дерево с тем же хешем, все будет в порядке. Но когда вы делаете коммит, весь репозиторий будет ссылаться на неправильное дерево.
  8. Если объект фиксации уже существует, и вы создаете объект фиксации с тем же хешем, все будет в порядке. Но при фиксации фиксация никогда не будет создана, а указатель HEAD будет перемещен в старую фиксацию.
  9. Если объект фиксации уже существует, и вы создаете объект-дерево с тем же хешем, при создании фиксации произойдет сбой.

Для №2 вы обычно получаете такую ​​ошибку при запуске «git push»:

error: object 0400000000000000000000000000000000000000 is a tree, not a blob
fatal: bad blob object
error: failed to push some refs to origin

or:

error: unable to read sha1 file of file.txt (0400000000000000000000000000000000000000)

если вы удалите файл, а затем запустите "git checkout file.txt".

Для №4 и №6 вы обычно получите такую ​​ошибку:

error: Trying to write non-commit object
f000000000000000000000000000000000000000 to branch refs/heads/master
fatal: cannot update HEAD ref

при запуске "git commit". В этом случае вы обычно можете просто набрать «git commit» еще раз, так как это создаст новый хэш (из-за измененной метки времени).

Для # 5 и # 9 вы обычно получите такую ​​ошибку:

fatal: 1000000000000000000000000000000000000000 is not a valid 'tree' object

при запуске "git commit"

Если кто-то попытается клонировать ваш поврежденный репозиторий, он обычно увидит что-то вроде:

git clone (one repo with collided blob,
d000000000000000000000000000000000000000 is commit,
f000000000000000000000000000000000000000 is tree)

Cloning into 'clonedversion'...
done.
error: unable to read sha1 file of s (d000000000000000000000000000000000000000)
error: unable to read sha1 file of tullebukk
(f000000000000000000000000000000000000000)
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

Что меня "беспокоит", так это то, что в двух случаях (2,3) репозиторий становится поврежденным без каких-либо предупреждений, а в 3 случаях (1,7,8) все выглядит нормально, но содержимое репозитория отличается от того, что вы ожидаете быть. Люди, которые клонируют или извлекают информацию, будут иметь другой контент, чем у вас. Случаи 4, 5, 6 и 9 в порядке, так как он будет остановлен с ошибкой. Полагаю, было бы лучше, если бы он не сработал с ошибкой, по крайней мере, во всех случаях.

person Ruben    schedule 04.01.2016
comment
Замечательный ответ: уменьшить размер хэша, чтобы увидеть, как он на самом деле ведет себя, - отличная идея. - person Gnurou; 19.01.2016
comment
@Gnurou Я согласен и тогда поддержал этот ответ. Были ли эти случаи упомянуты в списке рассылки git? - person VonC; 19.01.2016
comment
Насколько вероятно, что это действительно произойдет без уменьшения размера хэша? - person Mathias Bader; 13.12.2016
comment
Чтобы добавить к qts Матиаса: я предполагаю, что эта вероятность зависит от # или коммитов. Это правда? - person Pete; 13.12.2016
comment
Кроме того, каковы планы, если таковые имеются, по переходу на другой алгоритм хеширования. - person Pete; 13.12.2016
comment
@MathiasBader, предполагая, что вы добавляете капли, состоящие из равномерно распределенных случайных байтов, тогда вы столкнетесь с парадоксом дня рождения, и это будет около 2^-80, однако мы могли бы предположить, что в случае репозитория Git этого никогда не будет (поскольку это было бы в основном код, который не является равномерно распределенным вектором байтов), поэтому вероятность еще ниже. @Pete это так, но все еще совсем маленькое. И AFAIK нет планов перехода на другую хэш-функцию (я думаю, что это было бы довольно сложно выполнить), поскольку в этом нет необходимости. - person Hauleth; 02.02.2017
comment
@lapo Пока это может относиться только к трем случаям, когда содержимое репозитория отличается от того, что вы ожидаете (где объекты одного типа), два разных действительных коммита должны отличаться только в сообщении фиксации (и будут иметь либо очень странные сообщения фиксации или функционально идентичные) и два разных действительных объекта дерева должны (я думаю, я мог ошибаться) должны отличаться только именами файлов (которые были бы странными двоичными именами файлов). Две капли с одинаковым хешем все еще могут быть проблемой. Другие атаки, конечно, могут быть изобретены позже. - person Daniel H; 27.02.2017
comment
Обязательно прочтите - объяснения Линуса Торвала: plus.google.com/+LinusTorvalds/posts/7tp2gYWQugL - person phil_lgr; 01.03.2017
comment
Я согласен, что это хороший ответ с технической точки зрения. Но даже не прочитав заявление Торвальда, каждый разработчик, достойный этой должности, должен немного знать о хэш-функциях в целом и о том, для каких целей они используются в Git в частности. Тогда легко сделать вывод, что поставленный здесь вопрос явно относится к проблеме первого мира. Я просто пожал плечами, когда прочитал вопрос, думая: да, может быть, отличное упражнение, чтобы подумать, но не практическая проблема. OP говорит то же самое, я просто хочу подтвердить. Всего два цента. - person kriegaex; 02.03.2017
comment
@phil_lgr были ли комментарии Линуса подкреплены где-нибудь, когда G + был закрыт? - person Dan Is Fiddling By Firelight; 07.01.2020

Исходный ответ (2012 г.) (см. shattered.io Конфликт SHA1 2017 г. ниже)

Этот старый (2006 г.) ответ Линуса все еще может быть актуальным:

Неа. Если у него такой же SHA1, это означает, что когда мы получаем объект с другого конца, мы не перезаписываем уже имеющийся у нас объект.

Итак, происходит следующее: если мы когда-либо увидим коллизию, «более ранний» объект в любом конкретном репозитории всегда будет иметь приоритет. Но обратите внимание, что «раньше», очевидно, для каждого репозитория, в том смысле, что сеть объектов git генерирует DAG, который не полностью упорядочен, поэтому, хотя разные репозитории согласятся о том, что «раньше» в случае прямого происхождения, если объект поступил через отдельные и не связанные напрямую ветки, очевидно, что два разных репозитория получили два объекта в разном порядке.

Тем не менее, «ранее будет переопределено» - это то, что вам нужно с точки зрения безопасности: помните, что модель git заключается в том, что вы должны в первую очередь доверять только своему собственному репозиторию.
Итак, если вы делаете «git pull», новые входящие объекты по определению менее надежны, чем объекты, которые у вас уже есть, и поэтому было бы неправильно разрешать новому объекту заменять старый.

Итак, у вас есть два случая столкновения:

  • непреднамеренного, когда вам почему-то очень-очень не повезло, и два файла в конечном итоге имеют один и тот же SHA1.
    В этот момент происходит следующее: когда вы фиксируете этот файл (или выполняете операцию " git-update-index ", чтобы переместить его в индекс, но еще не зафиксировано), SHA1 нового содержимого будет вычислен, но поскольку он соответствует старому объекту, новый объект не будет создан, и фиксация-или -index указывает на старый объект.
    Вы не заметите этого сразу (поскольку индекс будет соответствовать старому объекту SHA1, а это значит, что что-то вроде "git diff" будет использовать извлеченную копию), но если вы когда-нибудь выполните сравнение на уровне дерева (или выполните клонирование, извлечение или принудительную проверку), вы внезапно заметите, что этот файл изменился на что-то полностью < / em> отличается от того, что вы ожидали.
    Таким образом, вы обычно замечаете такой вид столкновения довольно быстро.
    В связанных новостях вопрос в том, что делать с непреднамеренным столкновением ..
    Во-первых, позвольте меня напомните людям, что непреднамеренное столкновение действительно действительно чертовски маловероятно, поэтому мы, скорее всего, никогда не увидим его за всю историю Вселенной.
    Но если бывает, это не конец света: что вам, скорее всего, нужно сделать, это просто изменить файл, в котором произошел небольшой конфликт, и просто принудительно выполнить новую фиксацию с измененным содержимым (добавить комментарий "/* This line added to avoid collision */"), а затем научите git магическому SHA1, который оказался опасным.
    Итак, через пару миллионов лет, возможно, нам придется добавить одно или два "отравленных" значения SHA1 в мерзавец. Маловероятно, что это будет проблема с обслуживанием;)

  • Конфликт злоумышленника из-за того, что кто-то сломал (или произвел перебор) SHA1.
    Очевидно, что это много более вероятно, чем непреднамеренное, но по определению всегда «удаленный» репозиторий. Если бы у злоумышленника был доступ к локальному репозиторию, у него были бы гораздо более простые способы обмануть вас.
    Итак, в этом случае коллизия совершенно не проблема: вы получите "плохой" репозиторий, который отличается от того, что задумал злоумышленник, но поскольку вы никогда не будете использовать его объект столкновения, он буквально ничем не отличается от того, что злоумышленник просто не обнаружил столкновение в все, но просто используя уже имеющийся у вас объект (т.е. он на 100% эквивалентен «тривиальному» столкновению идентичного файла, генерирующего тот же SHA1).

вопрос использования SHA- 256 регулярно упоминается, но пока не используется (2012 г.).
Примечание: начиная с 2018 г. и Git 2.19 выполняется рефакторинг кода для использования SHA-256.


Примечание (юмор): вы можете принудительно выполнить фиксацию определенного префикса SHA1 с помощью проекта < strong> gitbrute от Брэда Фитцпатрика (bradfitz).

gitbrute перебирает пару временных меток автор + коммиттер, чтобы полученный коммит git имел желаемый префикс.

Пример: https://github.com/bradfitz/deadbeef.


Дэниел Диннес указывает на в комментариях к 7.1 Инструменты Git - Выбор редакции, который включает:

Существует более высокая вероятность того, что каждый член вашей команды программистов будет атакован и убит волками в не связанных между собой инцидентах в одну и ту же ночь.


Даже совсем недавно (февраль 2017 г.) shattered.io продемонстрирована возможность создания коллизии SHA1: < br> (подробнее см. в моем отдельном ответе, включая сообщение Линуса Торвальдса в Google+)

  • a / по-прежнему требует более 9 223 372 036 854 775 808 вычислений SHA1. Для этого потребовалась вычислительная мощность, эквивалентная 6500 годам вычислений на одном процессоре и 110 годам вычислений на одном графическом процессоре.
  • b / создаст один файл (с тем же SHA1), но с дополнительным ограничением его содержимое и size создаст идентичный SHA1 (коллизия только по содержимому не достаточно): см. "Как рассчитывается хеш git?"): a BLOB-объект SHA1 вычисляется на основе и размера содержимого.

См. "Срок службы криптографических хэш-функций" в Валери Анита Аврора, чтобы узнать больше.
На этой странице она отмечает:

Google потратил 6500 лет на CPU и 110 лет на GPU, чтобы убедить всех, что нам нужно прекратить использовать SHA-1 для приложений, критически важных для безопасности.
Также потому, что это было круто

Подробнее см. В моем отдельном ответе ниже.

person VonC    schedule 22.02.2012
comment
twist: хеши остались прежними после добавления /* This line added to avoid collision */: D вы можете выиграть в лотерею дважды: P - person Janus Troelsen; 18.05.2013
comment
@JanusTroelsen, конечно, но это все еще лотерея, не так ли?;) ( как указано в этом коротком примечании о SHA1) - person VonC; 18.05.2013
comment
@VonC относительно этой ссылки: вспышка глобальной эпидемии оборотней, уничтожившая все человечество и приведшая к ужасной смерти всех моих разработчиков в одну ночь, даже если они были географически распределены, считается несвязанным инцидентом ?? Конечно, если предположить, что это произошло в полнолуние, очевидно. Теперь такой сценарий изменит ситуацию. Даже думать об этом - безумие! Это совершенно другая шкала вероятности! Это будет означать, что мы должны ... ПРЕКРАТИТЬ ИСПОЛЬЗОВАНИЕ GIT! В НАСТОЯЩЕЕ ВРЕМЯ!!! ВСЕМ РУУУУУН !!!!!!! - person Daniel Dinnyes; 26.03.2014
comment
Обратите внимание, что gitbrute не заставляет конкретный SHA1, а только префикс (т.е. часть всего SHA1). Форсирование всего SHA1 (то есть с префиксом полной длины ключа), вероятно, займет слишком много времени. - person mb14; 01.03.2015
comment
@ mb14 Согласен. Вот почему в моем недавнем ответе stackoverflow.com/a/28792805/6309 я выделил префикс слова . Я соответствующим образом отредактировал этот ответ. - person VonC; 01.03.2015
comment
ссылка в моем предыдущем комментарии была перемещена: эта ссылка. Также цитата из абзаца: Существует более высокая вероятность того, что каждый член вашей команды программистов будет атакован и убит волками в не связанных между собой инцидентах в одну и ту же ночь. - person Daniel Dinnyes; 02.04.2015
comment
@DanielDinnyes Хороший. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 02.04.2015
comment
@JanusTroelsen Тогда вы бы добавили: /* This line added to avoid collision of the avoid collision line */ - person smg; 23.06.2015
comment
Сегодня было дальнейшее обсуждение между Линусом и другими разработчиками. Он продолжает думать, что в этом нет ничего страшного, но я не утверждаю, что люди не должны работать над расширением git до нового (и более крупного) хэша. Я думаю, что это простая задача, и мы действительно хотим иметь возможность, в конечном итоге, перейти к SHA3-256 или чему-то еще. - person Jeremy; 24.02.2017
comment
@jer, что означает больший хэш, требующий большей вычислительной мощности. Это изменение определенно не бесплатное ... - person VonC; 24.02.2017
comment
@VonC Я не ожидал такого возражения. Хранение и вычисление хэшей должно быть бесконечно малой частью хранения и вычислений, необходимых для типичных операций Git. (но, вероятно, это будет дорогостоящее изменение, потому что оно заменяет часть протокола, которая не была предназначена для изменения) - person Jeremy; 24.02.2017
comment
Вот вторая коллизия: privacylog.blogspot.com/2019/12 /the-second-sha-collision.html - person William Entriken; 31.12.2019

Согласно Pro Git:

Если вам случится зафиксировать объект, хэш которого соответствует тому же значению SHA-1, что и предыдущий объект в вашем репозитории, Git увидит предыдущий объект уже в вашей базе данных Git и предположит, что он уже был записан. Если в какой-то момент вы попытаетесь снова проверить этот объект, вы всегда получите данные первого объекта.

Так что он не потерпит неудачу, но и не спасет ваш новый объект.
Я не знаю, как это будет выглядеть в командной строке, но это определенно сбивает с толку.

Чуть ниже эта же ссылка пытается проиллюстрировать вероятность такого столкновения:

Вот пример, чтобы дать вам представление о том, что нужно сделать, чтобы получить коллизию SHA-1. Если бы все 6,5 миллиардов людей на Земле занимались программированием, и каждую секунду каждый из них создавал бы код, эквивалентный всей истории ядра Linux (1 миллион объектов Git), и помещал бы его в один огромный репозиторий Git, то потребовалось бы 5 лет, пока этот репозиторий содержал достаточно объектов, чтобы иметь 50% вероятность столкновения одного объекта SHA-1. Существует более высокая вероятность того, что каждый член вашей команды программистов будет атакован и убит волками в не связанных между собой инцидентах в одну и ту же ночь.

person Mat    schedule 22.02.2012
comment
Я бы хотел увидеть источник чисел в последнем предложении ;-) - person Joachim Sauer; 22.02.2012
comment
@JoachimSauer Почему бы вам не перейти по указанной ссылке? - person Jasper; 07.01.2013
comment
@Jasper: эта ссылка является хорошей документацией, но она не содержит статистику вероятности того, что каждый член команды будет атакован и убит волками в несвязанных инцидентах в одну и ту же ночь. - person Joachim Sauer; 07.01.2013
comment
@JoachimSauer Мое плохое. Я думал, ты говоришь о пяти годах. Однако, говоря о волках, я хотел бы услышать, как вы спорите, что шанс быть съеденным волками составляет менее 1 из 10 ^ 20;) - person Jasper; 07.01.2013
comment
@Jasper: Ну, как я это читал, текст буквально утверждает, что вероятность того, что 6,5 миллиардов членов команды будут убиты волками в ту же ночь, выше 50%. Но мое главное возражение против его утверждения состоит в том, что такое событие должно стать всемирным явлением; невероятно, что это могло произойти из-за не связанных инцидентов. ;) - person Keith Robertson; 18.09.2013
comment
@KeithRobertson Я почти уверен, что в этом посте говорится о вероятности того, что все ваши настоящие члены команды будут съедены, по сравнению с шансом хеш-коллизии, если бы все в мире производили безумное количество кода вместе с время, необходимое при таких обстоятельствах, чтобы достичь 50% вероятности столкновения (т. е. инцидент с волками затронул не весь мир, а 50% произошли отдельно от волков). Однако вы поняли, что если такое событие немыслимо, то должно быть столкновение с хешем git. (Конечно, одна (почти) чисто случайная, а другая - нет, но все же.) - person Jasper; 19.09.2013
comment
@ Джаспер: О да, понятно; Я принял 6,5 миллиарда за убитую команду программистов. (О, хорошо.) Однако я не согласен с тем, что как написано, 50% отделены от Волки. Писал с большей вероятностью. Выше чего? Ранее упомянутая вероятность является типичным следствием. Какая вероятность была непосредственно предшествующей? 50%. Я знаю, что имел в виду автор, но при прямой интерпретации это не то, что он сказал, на что я указываю исключительно потому, что это забавно (по крайней мере, для меня). - person Keith Robertson; 20.09.2013
comment
Страшно видеть, что цитата человека, который явно не понимает нелинейный характер вероятности, используется для обоснования того, почему не выполняется обновление до более безопасных альтернатив (или, по крайней мере, предусмотрено в архитектуре, например, переключение существующего репозитория. в SHA1 + другой алгоритм хеширования). Желательно с математически не связанными алгоритмами хеширования. - person 0xC0000022L; 08.02.2014

Чтобы добавить к моему предыдущему ответу от 2012 г., сейчас (февраль 2017 г., пять лет спустя) пример действительного Конфликт SHA-1 с shattered.io, где вы можете создать два конфликтующих файла PDF: то есть получить цифровую подпись SHA-1 для первого файла PDF, которую также можно использовать в качестве действительной подписи для второго файла PDF.
См. также "На пороге смерти в течение многих лет широко используемая функция SHA1 теперь мертваэту иллюстрацию.

Обновление от 26 февраля: Линус подтвердил следующие моменты в своем сообщении в Google+:

(1) Во-первых, небо не падает. Существует большая разница между использованием криптографического хеша для таких вещей, как подпись безопасности, и его использованием для генерации «идентификатора содержимого» для адресуемой по содержимому системы, такой как git.

(2) Во-вторых, характер этой конкретной атаки SHA1 означает, что ее на самом деле довольно легко нейтрализовать, и для этого уже были опубликованы два набора патчей.

(3) И, наконец, есть достаточно простой переход к другому хешу, который не сломает мир - или даже к старым репозиториям git.

Относительно этого перехода см. Q1 2018 Git 2.16, в котором добавлена ​​структура, представляющая алгоритм хеширования. Реализация этого перехода началась.

Начиная с Git 2.19 (3 ​​квартал 2018 г.), Git выбрал SHA-256 как NewHash и в процессе интеграции в код (это означает, что SHA1 по-прежнему используется по умолчанию (2 квартал 2019, Git 2.21), но SHA2 будет преемником)


Оригинальный ответ (25 февраля) Но:

Джои Хесс пробует эти PDF-файлы в репозиторий Git и обнаружил:

Это включает в себя два файла с одинаковым SHA и размером, которые получают разные капли благодаря тому, как git добавляет заголовок к содержимому.

joey@darkstar:~/tmp/supercollider>sha1sum  bad.pdf good.pdf 
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a  bad.pdf
d00bbe65d80f6d53d5c15da7c6b4f0a655c5a86a  good.pdf
joey@darkstar:~/tmp/supercollider>git ls-tree HEAD
100644 blob ca44e9913faf08d625346205e228e2265dd12b65    bad.pdf
100644 blob 5f90b67523865ad5b1391cb4a1c010d541c816c1    good.pdf

В то время как добавление идентичных данных к этим конфликтующим файлам приводит к возникновению других конфликтов, добавление данных к ним - нет.

Итак, основной вектор атаки (подделка фиксации) будет:

  • Создать обычный объект фиксации;
  • использовать весь объект фиксации + NUL в качестве выбранного префикса и
  • используйте атаку столкновения с идентичным префиксом, чтобы сгенерировать сталкивающиеся хорошие / плохие объекты.
  • ... и это бесполезно, потому что хорошие и плохие объекты фиксации по-прежнему указывают на одно и то же дерево!

Кроме того, вы уже можете обнаруживать криптоаналитические коллизионные атаки против SHA-1, присутствующего в каждом файле, с помощью cr-marcstevens/sha1collisiondetection < / strong>

Добавление аналогичной проверки в самом Git потребует некоторых вычислений.

При изменении хеша Linux комментарии:

Размер хеша и выбор алгоритма хеширования являются независимыми вопросами.
Что вы, вероятно, сделали бы, так это переключились на 256-битный хеш, использовали его для внутренних целей и в собственной базе данных git, а затем по умолчанию только < em> показать
хеш в виде 40-символьной шестнадцатеричной строки (вроде того, как мы уже сокращаем вещи во многих ситуациях).
В этом случае инструменты git даже не видят изменения, если они не переданы каким-то специальным Аргумент «--full-hash» (или «--abbrev=64» или что-то еще - по умолчанию мы сокращаем до 40).

Тем не менее, план перехода (от SHA1 к другой хэш-функции) все равно будет сложным , но активно изучается.
convert-to-object_id кампания - это в процессе:


Обновление от 20 марта: GitHub подробно описывает возможную атаку и ее защита:

Именам SHA-1 можно назначить доверие с помощью различных механизмов. Например, Git позволяет криптографически подписывать фиксацию или тег. При этом подписывается только сам объект фиксации или тега, который, в свою очередь, указывает на другие объекты, содержащие фактические данные файла, используя их имена SHA-1. Конфликт в этих объектах может привести к появлению подписи, которая окажется действительной, но указывает на данные, отличные от предполагаемых подписавшим. В такой атаке подписывающая сторона видит только одну половину столкновения, а жертва видит другую половину.

Защита:

Недавняя атака использует специальные методы для использования слабых мест в алгоритме SHA-1, которые обнаруживают коллизию за гораздо меньшее время. Эти методы оставляют в байтах шаблон, который может быть обнаружен при вычислении SHA-1 любой половины конфликтующей пары.

GitHub.com теперь выполняет это обнаружение для каждого вычисляемого SHA-1 и прерывает операцию, если есть свидетельства того, что объект является половиной конфликтующей пары. Это не позволяет злоумышленникам использовать GitHub, чтобы убедить проект принять «невинную» половину их столкновения, а также не позволяет им размещать вредоносную половину.

См. "sha1collisiondetection" от Марк Стивенс


Опять же, с добавлением в Q1 2018 Git 2.16 структуры, представляющей алгоритм хеширования, началась реализация перехода к новому хешу.
Как упоминалось выше, новым поддерживаемым хешем будет SHA-256.

person VonC    schedule 25.02.2017
comment
Столкновение: 1. Попытка создать столкновение, а не случайное. 2. Из отчета в формате PDF: В общей сложности затраченные вычислительные усилия эквивалентны 2 ^ 63,1 сжатий SHA-1 и потребовали примерно 6 500 лет ЦП и 100 лет графического процессора. 3. Хотя мы должны перейти от MD5 и SHA-1, в целом они подходят для уникального использования файлов. - person zaph; 25.02.2017
comment
Стоит отметить, что WebKit проверил конфликтующие PDF-файлы для тестирования. Он нарушил их зеркальную инфраструктуру git-svn: bugs.webkit.org/show_bug.cgi ? id = 168774 # c24 - person dahlbyk; 25.02.2017
comment
@dahlbyk Действительно стоит отметить ... в том смысле, что я отметил это в ответе (ссылка позади него имеет некоторую проблему для git-svn, хотя и относится к ней, хотя и косвенно) - person VonC; 25.02.2017
comment
Хорошо ли рассмотрен вопрос, поднятый в исходном ответе? I suppose it would be better if it failed with an error at least in all cases. - теперь вылетает с ошибкой? Я полностью понимаю, насколько это невероятно, но правильность есть правильность - person Mr_and_Mrs_D; 19.03.2017
comment
@Mr_and_Mrs_D нет, он еще не завершился с ошибкой. Сейчас идет большой патч, который затем поможет облегчить обнаружение столкновений: marc.info/?l = git & m = 148987267504882 & w = 2 - person VonC; 19.03.2017
comment
@Mr_and_Mrs_D SEe отредактируйте 4 в stackoverflow.com/posts/42450327/revisions: сейчас он не работает, по крайней мере, при обновлении до GitHub. - person VonC; 21.03.2017
comment
Я бы добавил, что 100 лет на GPU для атаки на конкретный проект с помощью подмодулей - это не так уж и дорого. В целом это может быть запретительным, но не все проекты созданы равными: если он позволяет установить бэкдор в криптобиблиотеке, используемой кошельками и другими криптовалютными проектами, рентабельность инвестиций есть. Например, 100 лет работы на GPU стоит менее 500000 долларов на GCP. - person MonsieurNicolas; 02.03.2018

Думаю, криптографы обрадуются.

Цитата из статьи в Википедии о SHA-1:

В феврале 2005 года было объявлено о нападении Сяоюнь Ван, Ицюнь Лиза Инь и Хунбо Ю. Атаки могут обнаруживать коллизии в полной версии SHA-1, что требует менее 2 ^ 69 операций. (Для поиска методом перебора потребуется 2 ^ 80 операций.)

person Willem Hengeveld    schedule 22.02.2012
comment
Дело в том, что в SHA1 была обнаружена ошибка, и что это было примерно в то время, когда Git был представлен. Кроме того, вероятность нелинейна. Тот факт, что вы играете в лотерею пятьдесят лет, не означает, что у вас больше шансов на выигрыш. У вас просто каждый раз один и тот же шанс. Человек, играющий впервые, все равно может выиграть. - person 0xC0000022L; 08.02.2014
comment
Это только атака, которая обнаруживает коллизию, что означает, что вы можете найти y такой, что h(x) == h (y) `, который представляет серьезную угрозу для произвольных данных, таких как сертификаты SSL, однако это не влияет на Git, который будет уязвим для второй атаки с предварительным изображением, что означает что, имея сообщение x, вы можете изменить его на сообщение x', что h(x) == h(x'). Таким образом, эта атака не ослабляет Git. Также Git не выбрал SHA-1 из соображений безопасности. - person Hauleth; 02.02.2017
comment
Обнаружено столкновение, но оно пока не беспокоит git напрямую. stackoverflow .com / questions / 42433126 / - person Willem Hengeveld; 01.03.2017
comment
2 ^ 69 - это около 600 Exa-операций. Восемь лет спустя суперкомпьютер SaturnV от Nvidia, обновленный до A100, может выполнять 4,6 ExaOPS, так что потенциально он может решить эту проблему чуть более чем за 2 минуты или провести атаку методом грубой силы за несколько дней. - person qdin; 19.05.2020

Существует несколько различных моделей атаки для хэшей, таких как SHA-1, но обычно обсуждается поиск по коллизиям, в том числе Инструмент HashClash.

«По состоянию на 2012 год наиболее эффективной атакой против SHA-1 считается атака Марка. Стивенс [34] с оценочной стоимостью 2,77 миллиона долларов, чтобы взломать единичное хеш-значение за счет аренды мощности ЦП у облачных серверов ».

Как указали люди, вы можете вызвать столкновение хэша с помощью git, но это не приведет к перезаписи существующих объектов в другом репозитории. Я предполагаю, что даже git push -f --no-thin не перезапишет существующие объекты, но я не уверен на 100%.

Тем не менее, если вы взломаете удаленный репозиторий, вы можете сделать свой ложный объект более старым там, возможно, встроив взломанный код в проект с открытым исходным кодом на github или аналогичный. Если бы вы были осторожны, возможно, вы могли бы представить взломанную версию, которую загружали новые пользователи.

Однако я подозреваю, что многие вещи, которые могут сделать разработчики проекта, могут либо раскрыть, либо случайно уничтожить ваш многомиллионный взлом. В частности, это огромные деньги на ветер, если какой-нибудь разработчик, которого вы не взламывали, когда-либо запускает вышеупомянутый git push --no-thin после изменения затронутых файлов, иногда даже без --no-thin зависимости.

person Jeff Burdges    schedule 19.12.2014