Git 3.0 с SHA-256 по умолчанию: в блоге GitButler видят в этом дорогую ошибку

Git 3.0 с SHA-256 по умолчанию: в блоге GitButler видят в этом дорогую ошибку

В блоге GitButler вышел авторский текст-рант (в тексте к автору обращаются «Scott»). Его тезис: готовящийся релиз Git 3.0 собирается сменить хеш-алгоритм по умолчанию с SHA-1 на SHA-256, и это обернётся огромной, дорогой, глобальной миграцией «почти без практической ценности». По словам автора, о том, что надвигается, почти никто не знает.

Автор напоминает базу. Git, это контентно-адресуемая база данных: хеш содержимого служит ключом, одинаковое содержимое всегда получает одинаковый хеш, а коммит включает хеш предыдущего коммита, поэтому целостность распространяется по цепочке. SHA-1 выбрал Линус в 2005 году, когда создавался Git, и он, по оценке автора, неплохо работал 20 лет. Случайная коллизия при 160-битном выходе SHA-1 требует по границе дней рождения порядка 1,4 септиллиона случайных файлов в одном проекте; насколько известно автору, в истории Git такого ни разу не случалось.

Проблема в том, что SHA-1 считается «полусломанным»: опубликованы атаки на коллизии (SHAttered в 2017 году, «SHA-1 is a Shambles» в 2020-м). Автор оговаривается, что на практике их нельзя эксплуатировать в каком-либо продемонстрированном виде, но теоретически они возможны: по его прочтению работ, целенаправленные коллизии на современных GPU-фермах обходятся порядка нескольких десятков тысяч долларов. Именно поэтому Git 3.0 собирается перейти на SHA-256.

Дальше автор разбирает два типа атак. «Атака на коллизии», злоумышленник заранее генерирует два файла с одинаковым хешем (безобидный и вредоносный), сначала раздаёт безобидный, набирает доверие, а потом подменяет. «Атака на второй прообраз», под уже существующий чужой файл подбирается вредоносный с тем же хешем; это опаснее, но, по словам автора, к ней почти не уязвима ни одна широко используемая хеш-функция. Git мог бы использовать даже MD5 (считающийся сильно сломанным) и оставаться практически неуязвимым к такой атаке. Мысленный эксперимент: если бы каждый из примерно 3 миллиардов GPU на Земле заменили на RTX 5090 и они занимались только MD5, ожидаемое время подбора конкретного прообраза составило бы около 16 миллиардов лет (медиана, около 11 миллиардов), то есть примерно возраст Вселенной.

Даже если допустить, что второй прообраз создаётся за час, остаются вопросы без ответа: как заставить незнакомых людей, никогда не тянувших прошлую версию, скачать этот файл, и как заставить их запустить его с пользой для атакующего. Хеширование, настаивает автор, не механизм доверия в мире систем контроля версий. Он даёт целостность, но доверие строится на вопросе «откуда вы забираете код?», и, как утверждает автор, об этом спорил ещё Линус при рождении Git.

Реальные атаки устроены иначе: кто-то социальной инженерией получает права записи в популярный npm-пакет, и вредоносным становится каждый файл зависимости у всех, кто её подтягивает. Автор оценивает такой путь как «примерно в миллиард раз» проще, дешевле и вероятнее, чем брутфорс коллизии (это его грубая оценка, а не измерение). Он также предполагает, что усталый мейнтейнер непопулярного, но широко используемого проекта может передать его за разовые 40 тысяч долларов, это его гипотетический пример, а не реальный случай. Вывод: атаки через хеш-коллизии, «пожалуй, самый глупый способ» доставить недоверенный код в систему.

Поэтому, считает автор, если рассматривать SHA-1 как достаточно быстрый и достаточно хороший способ порождать уникальные ключи в доверенном репозитории, заменять его незачем; по его словам, MD5 «честно говоря, наверное, тоже сошёл бы». Случайные коллизии практически невозможны, а остальное закрывают подписанное содержимое, внешняя аутентификация и социальные механизмы доверия. Иначе, предупреждает он, индустрия застрянет в цикле миграций при каждой новой теоретической работе по коллизиям, и после перехода на SHA-256 «квантовые компьютеры сломают и 256».

На вопрос, не преувеличение ли «крушение поезда», автор отвечает «возможно», но добавляет: как ни считай, миграция не будет ни дешёвой, ни простой. Он ссылается на недавний доклад Emily Shaffer о том, как Google готовится к этой проблеме, и называет картину «не слишком приятной». Раздел о том, как именно пройдёт выход Git 3.0 с новым значением по умолчанию, в доступной части текста обрывается на первых словах.

Ключевые факты

  • Git 3.0 планирует сменить хеш по умолчанию с SHA-1 (выбран Линусом в 2005 году) на SHA-256; автор поста в блоге GitButler называет это дорогой глобальной миграцией почти без практической пользы.
  • SHA-1 считается «полусломанным» после атак SHAttered (2017) и «SHA-1 is a Shambles» (2020); по прочтению автора, целенаправленные коллизии сегодня стоят порядка нескольких десятков тысяч долларов, но на практике не эксплуатировались.
  • Случайная коллизия SHA-1 требует около 1,4 септиллиона файлов в одном проекте; автору неизвестно, чтобы она хоть раз случалась в истории Git.
  • Главный довод: доверие в системах контроля версий определяется тем, откуда берётся код, а не хешем; реальные взломы идут через захват npm-пакетов и мейнтейнеров, что автор оценивает как примерно в миллиард раз проще.
  • Автор предупреждает о бесконечном цикле миграций при каждой новой теоретической работе и упоминает доклад Emily Shaffer о подготовке Google к переходу.

Почему это важно

Git используется практически везде, а смена хеш-функции по умолчанию затрагивает форматы репозиториев, инструменты и инфраструктуру вокруг них. Автор поста уверяет, что миграция пройдёт для всей индустрии дорого и неудобно, а выигрыш в безопасности, по его мнению, невелик. Это взгляд скептика на решение, в которое, по его же словам, вложено много работы «очень умных людей».

Кому это важно

Разработчикам и командам, которые хранят код в Git; мейнтейнерам инструментов вокруг Git и хостингам репозиториев; компаниям, которым предстоит миграция (автор упоминает, что Google уже готовится к миграции, ссылаясь на доклад Emily Shaffer). Также тем, кто занимается безопасностью цепочки поставок: основной упрёк автора в том, что целостность и доверие смешивают.

Как это применить

Как практическое руководство текст не подаётся: это мнение. Из него можно взять рамку для оценки рисков: проверять, откуда приходит код, кто имеет права записи в пакеты и репозитории, использовать подписи, внешнюю аутентификацию и социальные механизмы доверия, а не рассчитывать только на хеш-функцию. Сроков выхода Git 3.0 и инструкций по переходу в доступном тексте нет.

Можно ли доверять

Это авторское мнение с эмоциональной подачей («рант», «train wreck»), а не исследование или официальная позиция проекта Git. Технические факты (SHA-1 в Git с 2005 года, публикации SHAttered и Shambles, смысл границы дней рождения) согласуются с общеизвестной картиной, но оценки стоимости атак, «миллиарда раз проще» и выводы про MD5 принадлежат автору. Сценарии с $40 тысячами для мейнтейнера, часом на второй прообраз и 3 миллиардами GPU, его гипотетические примеры. Доступная часть статьи обрывается до описания того, как пройдёт миграция, поэтому конкретика о последствиях здесь не раскрыта.

Риски и подводные камни

Автор сам признаёт, что «крушение поезда» вероятно преувеличение, и не приводит денежной оценки миграции: «дорого», его характеристика. Аргумент «доверие строится на источнике» не отменяет того, что у авторов перехода на SHA-256 могут быть свои доводы, которые в доступном тексте не разобраны. Предложение оставить SHA-1 или даже взять MD5, позиция автора, а не рекомендация проекта Git. Предупреждение о бесконечных миграциях и о квантовых компьютерах, предположения, а не факты.

«Доверие основано на вопросе «откуда вы забираете код?», и так было всегда.»

— автор поста в блоге GitButler