Чи можна зловмисно змінити файл таким чином, щоб він підтримував свій оригінальний SHA-1 Hash?


33

Відповідно до цієї статті та багатьох інших, SHA-1 не є безпечним.

У моєму випадку я не переймаюся паролями чи цифровими сертифікатами. Мене хвилює цілісність файлів.

Чи обґрунтовано можливо, щоб файл (наприклад, зображення ISO або виконуваний файл) був зловмисно змінений таким чином, що:

  • Зберігає хеш SHA-1 оригінального файлу та
  • Зберігає загальний вміст файлу та функціонування (але, звичайно, тепер включає зловмисний вміст, який не був спочатку)

Як я бачу, зміна файлу таким чином, що він спричинить зіткнення SHA-1, зробить файл абсолютно марним. ISO був би повністю пошкодженим, або виконуваний файл був би настільки скремблирован, що навіть не буде виконуваним файлом більше.

Але, як я бачу, це цілком може бути неправильним. Поки що я не знайшов нічого в пошукових запитах Google щодо постійної придатності SHA-1 для перевірки файлів. Будь-які уявлення?


7
Відповідь "це залежить". Якщо ISO містить багато jpegs чи файлів фільмів - разом із цільовим виконуваним файлом, то це можливо. Ви можете досить швидко змінити файли jpeg, не змінюючи їх розмір чи візуальний вигляд. Зрештою, чим більший файл, тим більше вам доведеться грати, і тим більше шансів на неруйнівне зіткнення.
Павло

7
@cpast саме так, багато веб-сайтів перераховують хеші SHA-1, що дозволяють перевірити завантаження. Думаючи про це, здається набагато більш імовірним, що хакер зірве веб-сайт, змінивши вміст та опублікований хеш. Тоді ти справді накручений.
misha256

1
Щойно, моє запитання про SHA-1 конкретно, тому що це досить часто, особливо із завантаженнями з Microsoft / MSDN. Звичайно, деякі веб-сайти публікують хеші MD5, інші - SHA256 тощо
misha256

2
Питання в тому, чому ви хочете використовувати хеш, який має будь-які відомі вразливості, коли є такі ж швидкі, прості у використанні та широко доступні альтернативи, які не роблять (наприклад, SHA-256) ? Крім того, є причина, що криптографи оголошують хеш незахищеним після виявлення лише однієї вразливості: історія показала, що коли одного знайдено, інші швидко слідують. Знаменита цитата Брюса Шнейера - "Напади завжди стають кращими, вони ніколи не стають гіршими"
BlueRaja - Danny Pflughoeft

3
@ misha256 Ці шаші для sha1 - це ви перевірити на наявність корупції, а не на безпеку. Якщо ви хочете отримати безпеку, тоді використовуйте файли з підписом gpg
Daenyth

Відповіді:


41

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

Складніше створити файл із тим самим хешем SHA-1 як даний файл, ніж створити два файли самостійно з тим же хешем SHA-1. Наскільки ми знаємо, ще ніхто в світі ще не виконав навіть цього легшого завдання. Це не означає, що завтра не може статися.


Чи існує навіть відома атака на SHA-1 за зіткнення з заданим файлом? У мене було враження, що цього нападу не знайдено ні для MD5, ні для SHA-1 (є лише атака зіткнення, а не атака другої
передвиборної дії

@cpast зловмисне програмне забезпечення Flame використовувало зіткнення MD5, схоже, з боку Microsoft та викрадало оновлення Windows. У них, можливо, було набір сертів Microsoft, на вибір, але вони не просто намагалися знайти 2 файли з тим же MD5.
Арон Фостер

2
@Aron Ні, це не був приклад зіткнення із заданим файлом. У програмі Flame у Microsoft був сервер ліцензування, який підписував сертифікати X.509 відповідно до запиту на підписання сертифікату, а це означає, що зловмисник контролює те, що підписується в деяких межах. Не було попереднього свідоцтва, з яким вони виявили зіткнення; Microsoft підписала КСВ від клієнтів як частину активації, що дозволяє використовувати атаку зіткнення (що не є другою попередньою атакою).
cpast

2
@OlivierDulac Ні, це справді ніколи не робилося. Невідомих зіткнень SHA-1. За оцінками , вартість лише оцінка - це не те, що хтось - то зробив це , і це, як багато ми думаємо , що це варто, це те , що ніхто не зробив це , але ми думаємо , що це , скільки це буде коштувати.
cpast

4
@cpast Ми точно не знаємо, було зроблено чи ні, але напад на 3 мільйони доларів - це менше 0,03% від річного бюджету АНБ (насправді, атака повинна бути дешевшою, враховуючи, що вони вже володіють обладнанням і не доведеться здавати в оренду). Розумно зробити висновок, що, оскільки у них є засоби та мотивація для цього, то, ймовірно, вони вже були. Згадайте полум’я .
bain

26

Теоретично це можливо, але це ще не зроблено.

Те, що ви шукаєте, називається "хеш-зіткненням": два файли з однаковим хешем. Криптографічні хеш-коди типу SHA-1, як правило, розроблені для того, щоб ускладнити це. Оскільки SHA-1 - це 160-бітний код, в середньому знадобиться 2 ^ 159 грубої спроби знайти дублікат. Якщо буде знайдено алгоритм, який надійно робить краще, ніж алгоритм щодо криптографічного хешу, хеш вважається "зламаним".

MD-5 - приклад дуже зламаного хешу. Він повинен був мати міцність 128 біт, що вимагало в середньому 2 ^ 127 спроб. Таким чином, зловживаючи відомими вразливими місцями, реальна кількість необхідних спроб може бути не меншою, ніж 2 ^ 47. Це ЛОТ менше 2 ^ 127. Насправді це було зроблено за добу за сучасний обчислювальний кластер.

Я наводжу цей приклад, тому що це найближче до того, як ви шукаєте використовувати SHA-1. Однак це не найпоширеніший підхід використання криптоаналізу для того, щоб переконатися, що хеші не порушені. Зазвичай вони дозволяють зіткнутись між двома файлами, як обрав зловмисник, замість того, щоб вибрати один файл та зловмисника, який прагне його узгодити. Цей вид нападу має перевагу в тому, що він легше орієнтуватися. Якщо я вважаю, що "важко" зламати ваш файл, чи це означає, що ще один файл є таким же сильним? Ця атака, коли зловмисник отримує обидва файли, гарантує, що ми вловимо найгірше з найгірших.

Такий напад дозволяє цікавий трюк, відомий як " атака на день народження ". Короткий опис короткого оповідання: використання атаки на день народження вдвічі зменшує силу алгоритму, тому SHA-1 вимагає 2 ^ 80 спроб (в середньому), а MD5 вимагає 2 ^ 64 спроб (в середньому). Це половина 160 та 128 відповідно.

SHA-1 відомі напади, які знижують його силу з 2 ^ 80 до 2 ^ 69. Це для вас не матиме великого значення. 2 ^ 69 спроб - це тривалий час.

Однак з історії ми з’ясували, що алгоритми хешування не порушуються спонтанно, а з часом порушуються. Ніхто не зламає такий алгоритм, як MD-5, приймаючи його від 2 ^ 64 до 2 ^ 47 за ніч. Це трапляється з часом, оскільки багато людей публікують документи про математику, яку вони використовують проти цього. Зазвичай можна спостерігати, як складність атак повільно знижується з моменту створення алгоритму (де найкраща атака, як правило, є атакою на день народження).

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

Вам слід дійсно приймати такі рішення з точки зору моделі загрози. Скільки шкоди може нанести зловмисник, якщо отримає одне із цих зіткнень. Чи ваші діти-скрипти для зловмисників, які мають доступ до кількох ноутбуків, або уряди, що мають у своєму розпорядженні цілі кластери суперкомп'ютерів. Наскільки велике тимчасове вікно зловмисникові доводиться ламати хеш, перш ніж це не буде корисним (багато застосувань криптографії передбачають "зміну охорони", наприклад, обертання паролем). Все це вплине на те, наскільки серйозно вам доведеться розглянути зіткнення.


8
Щодо пункту нападу на день народження, 2 ^ 80 - квадратний корінь 2 ^ 160, а не половина його (що було б 2 ^ 159).
Ендрю Мортон

Питання - про атаки другого передбачення, але ваша відповідь - про зіткнення. Передмовні атаки проти SHA-1 & mdash; і навіть MD5 & mdash; є абсурдно непрактичними. (Є 2 ^ 123 попередня атака проти MD5, але за допомогою SHA-1 ви застрягли з грубою силою 2 ^ 160.)
Метт Нордхофф

"Оскільки SHA-1 - це 160-бітний код, в середньому знадобиться 2 ^ 159 грубої спроби знайти дублікат." Але код 2 ^ 2 займає 2 ^ 2 здогадів. Я не бачу, чому ти -1. "Довге оповідання коротке," ... "вдвічі зменшує силу алгоритму, тому для SHA-1 потрібно 2 ^ 80" ... "MD5 вимагає 2 ^ 64" ... "Це половини 160 і 128 відповідно". Тут ви повинні мати -1'ed. Біти додають сили експоненціально, тому вдвічі менша сила 160-бітного хешу розглядає його як 159-бітний хеш, а не 80-бітний хеш. Кожен біт подвоює виклик жорстокої атаки.
TOOGAM

@TOOGAM: Він сказав "в середньому"; протягом декількох випробувань в середньому потрібно шукати лише 50% ключового простору, щоб досягти успіху в грубій атаці. Що стосується половини коментаря, коментар Ендрю Мортона вище пояснює це; це має бути квадратний корінь, а не наполовину, складності.
Рейд

@AndrewMorton хороший пункт, я не був зрозумілий зі своїм формулюванням. Я досить часто знаходжу в літературі перемикання між кількістю станів і логарифмом кількості станів бази-2. Моє формулювання стосувалося скорочення вдвічі кількості бітів, оскільки люди, як правило, говорять про "силу" в кількості біт. Я настільки звик перемикатися туди-сюди, що робив це несвідомо. Я відредагую, щоб видалити плутанину.
Корт Аммон - Відновіть Моніку

8

Недоліки SHA-1, обговорені в цій статті, є дуже специфічними: вони дозволяють зловмисникам створювати дві речі, які мають хеш до одного значення (це називається "атака зіткнення"). Однак атака зіткнення вимагає, щоб зловмисник контролював обидва файли. Якщо зловмисник не контролює оригінальний файл, атака зіткнення не дозволяє їм знайти інший файл із таким же хеш-значенням.

Причина, яка має значення для TLS / SSL (і підписів взагалі), полягає в тому, що з ними злочинець часто може контролювати обидва файли. Сертифікат TLS здебільшого створюється особою, яка його вимагає (біти, які вони не контролюють, часто передбачувані), тому зіткнення дозволяють зробити законний та нелегітимний сертифікат, підписати законний та передати підпис.

Для файлів однакова ситуація не завжди стосується. Якщо ви турбуєтеся про те, що особа, яка створює файл, є зловмисницею (наприклад, вони отримають одне, незалежно перевірене як хороше, а потім надішлете вам злий корисний вантаж з тим же хешем), застосовується атака SHA-1, і ви повинні подивитися до поступового його припинення (хоча це ще не критично, як згадував Девід Шварц). Якщо довіряти оригінальному файлу, то зловмисник не може застосувати відомі в даний час атаки SHA-1, хоча ви все ще повинні подумати про його припинення, якщо зможете (якщо у вас є вибір, використовуйте хеш без відомих атак, таких як SHA- 2).


У відповідь на "зіткнення не буде корисним" - Хоча атака не вимагає, щоб зловмисник міг отримати корисне зіткнення, як правило, не все так важко перетворити "зіткнення" в "корисне зіткнення". Багато форматів файлів мають достатньо місця, в якому ви можете мати все, що завгодно, не впливаючи на функціональність файлу; Зловмисник може, як правило, модифікувати це для того, щоб отримати зіткнення (якщо зіткнення практично розбірливі), зберігаючи функціональну частину такою, якою вони хочуть. Розрив між "академічною атакою" та "практичною атакою" може бути великим; розрив між "будь-яким зіткненням" та "корисним зіткненням", як правило, значно менший.


Більш серйозна проблема, яка не пов'язана з вибором алгоритму, - це те, як ви отримуєте хеш. Все, що хеш - це перенести проблему з "отримати реальний файл" на "отримати реальне значення хешу"; значення хеша, надіслане з того самого сервера і над тим же типом з'єднання, що і файл, є абсолютно непридатним проти зловмисної модифікації (будь-який зловмисник, який може підробляти файл, може підробляти хеш). Хеши корисні для цього лише в тому випадку, якщо ви можете довіряти хешу більше, ніж ви можете довіряти файлу; хоча це іноді так (торренти, дзеркала), вони часто використовуються, коли це не так. Тому вам слід бути дуже обережними щодо цього, коли ви використовуєте хеші для перевірки цілісності.


5

Ви повинні розмежовувати атаку зіткнення та атаку передбачення . Пошук будь-яких двох повідомлень, які мають хеш-одинакові значення, є атакою зіткнення.
Заміна одного конкретного даного повідомлення (тут: виконуваний файл) іншим повідомленням, яке має той самий хеш, є (другою) попередньою атакою.

SHA-1 зламаний, якщо атака зіткнення може бути здійснена за 2 52 операції згідно зі статтею Вікіпедії, яка не дає цитування цього числа (найкраща атака, яку мені відомо, насправді є достовірною, - це Марк Стівенс , що займає 2 60 операцій). Але припустимо песимістичний випадок 2 52 .

Це викликає занепокоєння, оскільки атака в такому масштабі не тільки теоретично можлива, але й справді ідеально здійснена за добу за версією Multi-GPU. Звичайно, це проблема для додатків, де будуть працювати будь-які два повідомлення. Навіть цифра 2 60, надана Стівенсом (що в 256 разів більше роботи), цілком здійсненна, якщо ваш нападник готовий кинути на проблему додаткові гроші або готовий витратити рік часу.
Це саме та річ, яка не завадить комусь, причетному до шпигунства чи кібер-злочину, підробляти сертифікати.

Тепер у попередній атаці є показник, який вдвічі більший, тому припускаючи 2 52 для атаки зіткнення, це було б 2 104 операції, що є абсолютно іншим тером.

Це не тільки непрактично (машина, яка в мільярд разів швидша, ніж та, яку згадували у попередньому пункті, все-таки зайняла б приблизно 6 мільйонів або близько років), але з огляду на наші чудернацькі засоби отримання енергії, це абсолютно неможливо.

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

Ви реально розраховувати, що ви отримаєте що-небудь від 10 до 50 GFLOPS з одного Вт. Якщо припустити, що трапляється якесь диво, і процесори отримують в кілька разів більше енергоефективних за ніч, можна припустити 1 SHA ≈ 1 FLOP (досить оптимістично!). Це означає, що для виконання 2 104 хеш-розрахунків протягом 10 років вам потрібна електростанція потужністю 10 12 Вт. Для того, щоб запустити атаку протягом 1 року, вам потрібна електростанція потужністю 10 13 Вт. Це приблизно в 50 разів більше, ніж можуть виготовляти всі атомні електростанції США, Франції та Японії, лише для кування одного хешу.

Це не відбудеться , є набагато простіші способи досягнення тієї самої мети (експлуатування сервера, який зберігає оригінальний хеш, і заміна цього, шантаж когось тощо).


"... набагато простіші способи досягти того ж самого ..." Як показано в xkcd.com/538
Ralph J

2

Загальна точка статті refered в питанні: SHA1 є застарілим і має бути припинено , поки ще є час , щоб зробити це плавно. У деяких районах час закінчується, оскільки Google та Microsoft виконують строки.

Правило для застарілої технології:

  • Якщо ви робите новий дизайн або додаєте функції, не використовуйте його (SHA1).
  • Якщо ви підтримуєте щось старе, складіть план, коли його замінити (SHA1).

Підсумкова цитата Брюса Шнейєра у 2012 році. "Справа в тому, що нам у громаді потрібно почати міграцію далеко від SHA-1 та до SHA-2 / SHA-3."


2

Що стосується хеш-колізійної частини зіткнення SHA-1, це було вирішено кількома відповідями.

Однак значна частина цього типу залежить від типу файлу, з яким ми працюємо:

Підтримує загальний вміст файлу та функціонування (але, звичайно, тепер він включає шкідливий вміст, який спочатку не змінювався вмістом)

Це означає, що багато в чому залежить від виявлення змін:

  • Якщо це підписаний виконуваний файл, а не (розумний) шанс: вам доведеться якось отримати два хеш-зіткнення: SHA-1 файлу та внутрішній .exe підпис.
  • Якщо це непідписаний виконавчий файл, .com, непідписаний .dll, або подібний, його вилки ресурсів можна додавати до способів, які не змінять їх роботу, і, таким чином, ви можете (зрештою) отримати хеш-зіткнення, яке не буде виявлено "нормальним" операція.
  • Якщо це файл вихідного коду або схожа структура (.cs, .c, .h, .cpp, .rb, .yml, .config, .xml, .pl, .bat, .ini) доповнення, модифікації чи видалення може бути обмежений чинним синтаксисом коментарів, таким чином, щоб зміна не була помітна в більшості застосувань (компілюючи або запускаючи її, не відкриваючи її текстовим редактором).
  • Якщо це формат .iso або .zip або інший контейнер, це також малоймовірно, оскільки більшість випадкових змін можуть пошкодити контейнер. Можна зробити: додати помилковий запис файлу або змінити вміст у контейнері та повторно перевірити його, але ви додаєте шар складності та додаєте додатковий час для перевірки результату, а також маєте обмежений ступінь свободи щодо як і який вміст може бути змінено.
  • Якщо це текстовий або текстовий формат, вони можуть бути змінені практично будь-яким способом, який вам подобається, залишаючись «правильним» файлом, хоча вміст, ймовірно, буде помітний.
  • За допомогою багатьох форматів, таких як .rtf, .doc, .html, .xslx та інші формати розмітки, вони можуть бути додані або змінені способами, які не можна буде визначити парсерами, тому інші, ніж довжина (або навіть із обмеженою довжиною) , менша свобода) файли можуть бути змінені, щоб (зрештою) отримати хеш-зіткнення, залишаючись при цьому не лише дійсним файлом, але й помітно не змінити жодним чином, що було б видно типовим програмам, з якими вони будуть використовуватися.

Отже, те, що вам залишається, - це як зіткнутись у будь-якій структурі, яка не є корумпованою, і, можливо, певна ступінь невизначення:

  1. Внесіть будь-які необхідні вами функціональні зміни (можливо, вставлення шкідливого вмісту) та внесіть додаткові зміни, щоб зберегти конкретну дійсність формату
  2. Додайте розділ, який буде нефункціональним (між блоками коментарів, в самому кінці текстового файлу з поверненням каретки 3k над ним, виділіть поточний блок коментарів)
  3. Додайте або виберіть символ / кодову точку / байт для модифікації та спробуйте всі можливі дійсні комбінації (не кожна комбінація байтів є дійсною для різних кодувань, наприклад).
  4. Перерахуйте хеш, подивіться, чи відповідає зіткнення.
  5. якщо цього немає, перейдіть до 3.

Скажімо, у вас супершвидкий комп'ютер і невеликий файл, такий, що для модифікації з дійсною послідовністю байтів і перерахунку хеша потрібно 1 мілісекунда (можливо, для цього потрібне певне обладнання). Якщо хеш-розподіл ідеально випадковий і розподілений по діапазону, ви отримуєте зіткнення з SHA-1 при кожному 2^160спробі (грубому змушенні).

2^160/1000/60/60/24/365.24 
= 4.63x10^37 years 
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years 
= 46 undecillion years.

Але стривайте, давайте спробуємо 2^60і 2^52версію, і робити вигляд , що вони дозволяють змінити файл так , як нам подобається (вони не роблять) , і що вони теж, можуть бути зроблені в 1мсе кожен спробувати:

2^52 yields 142,714 years 
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years 
/*machines will probably have taken over anyway*/

Але ей, можливо, вам пощастить. Дійсно, насправді пощастило більше, ніж чудо, ніж все-що-людям-дзвінкам.


0

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


1
Поки що майже неможливо . При достатній обчислювальній потужності все можливо.

-6

Так, можливо. Подумайте, як віруси працюють на EXE. Корисне навантаження зловмисного програмного забезпечення додається до оригінального EXE, так що програма все одно робить те, що вона робила спочатку, але також поширюється як вірус. Тепер, щоб підтримувати той самий хеш, вам знадобляться додаткові спеціально пророблені накладки .

Це означає, що файл буде більшим. Але у випадку EXE, можливо, ви можете видалити частину менш використовуваного коду, так що програма, здавалося б, працює лише спочатку. У випадку з JPEG ви можете додатково стиснути зображення або повністю використовувати інше зображення. Для ISO можна видалити набори файлів. Обчислення, необхідні для тиражування хешу, були б складнішими і, можливо, математично неможливими для конкретних випадків, але все-таки були б можливими в цілому.


7
-1 все в цій посаді повністю складено. Атаки із збільшенням довжини не "підтримують однаковий хеш" (хеш просто змінюється відомим способом) . Крім того, немає ніяких причин, щоб вірус мав би видаляти "менш використовуваний код" (як би він навіть визначив, що це?) . І що взагалі стосується jpegs !?
BlueRaja - Danny Pflughoeft

2
Це абсолютно неправильно, я навіть не можу почати пропонувати виправлення, не переписавши всю відповідь
Марк К Кован

2
-1 Зовсім не правильно. aka "Навіть не так" (Вольфганг Паулі)
Олів'є Дулак

1
Ну, ми могли б почати з того, що якщо щось можливо взагалі, то, очевидно, це можливо в конкретному випадку . Однак навпаки не завжди вірно: легко уявити проблему, яку можна вирішити для конкретного випадку, але не в цілому.
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.