Щоб додати до моєї попередньої відповіді з 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 (Q3 2018) , Git вибрав SHA-256 як NewHash , і він перебуває в процесі інтеграції його до коду (мається на увазі, SHA1 все ще є за замовчуванням (Q2 2019, Git 2.21), але SHA2 стане наступником)
Оригінальна відповідь (25 лютого) Але:
- Це дозволяє підробляти крапку, однак SHA-1 дерева все одно зміниться, оскільки розмір кованої краплі може бути не таким, як початковий: див. " Як обчислюється хеш-гіт? "; блоб SHA1 обчислюється на основі змісту і розміру . Однак у
нього є певне питанняgit-svn
. А точніше із самим svn , як це видно тут .
- Як я вже згадував у своїй оригінальній відповіді , вартість такої спроби поки що непомітна (6 500 років процесора та 100 GPU років) Дивіться також Валері Аніту Аврору в " Життях криптографічних хеш-функцій ".
- Як зазначалося раніше, мова йде не про безпеку чи довіру, а про цілісність даних (дедуплікація та виявлення помилок), яку легко виявити
git fsck
, як згадує Лінус Торвальдс сьогодні. git fsck
попередить про повідомлення про фіксацію з непрозорими даними, прихованими після NUL
(хоча NUL
вони не завжди містяться в шахрайському файлі ).
Не всі включаютьсяtransfer.fsck
, але GitHub робить: будь-який натиск буде перервано у випадку неправильного об'єкта або пошкодженого зв’язку. Хоча ... є причина, що вона за замовчуванням не активована .
- pdf-файл може мати довільні двійкові дані, які ви можете змінити, щоб створити зіштовхується SHA-1, на відміну від підробленого вихідного коду.
Справжня проблема у створенні двох сховищ Git з однаковою головою здійснюють хеш і різний вміст. І навіть тоді напад залишається розгорнутим .
- Лінус додає :
Вся суть СКМ полягає в тому, що йдеться не про разові події, а про суцільну історію. Це також принципово означає, що для успішної атаки потрібно працювати з часом, а не бути виявленим.
Якщо ви можете один раз обдурити SCM, вставте свій код, і він буде виявлений на наступному тижні, ви насправді не зробили нічого корисного. Ви тільки спалили себе.
Joey Hess пробує ці файли у форматі PDF у Git repo та він знайшов :
Це включає два файли з однаковим розміром і 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
Додаємо аналогічний чек у самому Git , виникла б якась обчислення .
Щодо зміни хешу, коментарі Linux :
Розмір хеша та вибір алгоритму хешу - це незалежні питання.
Що ви, мабуть, зробите, це перейти на 256-бітний хеш, використовувати це внутрішньо і в нативній базі даних git, а потім за замовчуванням
показувати хеш як шістнадцяткову шістнадцяткову рядок (на кшталт того, як ми вже скорочуємо речі в багато ситуацій).
Таким чином, інструменти навколо 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
" Марка Стівенса
Знову ж таки, з першого кварталу 2018 року Git 2.16 додав структуру, що представляє хеш-алгоритм, розпочато реалізацію переходу до нового хешу.
Як було сказано вище, новим підтримуваним Hash буде SHA-256 .