Приховані небезпеки хеш-функцій: атаки розширення довжини та ризики безпеки на стороні сервера

Вступ

Атака розширення довжини – це атака, пов’язана з властивостями певних типів хеш-функцій, таких як MD5, SHA-1 і SHA-2. Простіше кажучи, ця атака використовує той факт, що, знаючи H(повідомлення) і довжину повідомлення, ми можемо легко обчислити H(повідомлення || доповнення || розширення), не знаючи самого повідомлення. Серед них "||" означає з'єднання, а "заповнення" додається відповідно до положень хеш-функції.

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

Режим перевірки на стороні сервера

Щоб полегшити опис сценаріїв уразливості, ми спочатку припустимо, що існує такий режим автентифікації на стороні сервера, тобто коли користувач намагається увійти, сервер передає певний хеш на основі ідентифікатора користувача, імені та 30-бітний ключ відомий лише серверу. Алгоритм генерує хеш-значення та надсилає його клієнту. Згодом, коли клієнт намагається отримати доступ до певних інтерфейсів, наприклад інтерфейсу для зміни дозволів користувача, сервер повторно створить хеш для перевірки на основі ідентифікатора ролі, імені ролі, дозволів ролі та того самого 30-бітного ключа переднього завершити POST. Якщо завантажений хеш узгоджується з хешем, згенерованим сервером, вважається, що перевірка пройшла, і нові дозволи ролі будуть записані в базу даних.

Для полегшення розуміння наведемо кілька простих кодів, написаних відповідно до опису як приклади:

Мислення поза авторитетом

Через уразливості в режимі перевірки зловмисник може обійти перевірку дозволу, реконструюючи запит транзакції, не знаючи SecretKey. Основна ідея несанкціонованої атаки полягає у використанні характеристик атаки розширення довжини. Зловмиснику спочатку потрібно отримати початкове хеш-значення та обчислити довжину вихідних даних за допомогою простого ітераційного алгоритму. Після отримання цієї інформації додаткові неавторизовані параметри можуть бути додані до вихідних даних, і той самий алгоритм хешування може бути використаний для створення зловмисних хеш-значень.

Принцип атаки розширення довжини

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

Візьмемо, наприклад, SHA-256, який працює з 512-бітними блоками. Для даних, довжина яких не кратна 512 бітам, потрібне доповнення. Правила його заповнення такі:

  1. Додайте біт "1" в кінці даних;

  2. Додайте певну кількість «0» бітів, щоб довжина даних за модулем 512 дорівнювала 448 (детальніше див. [1] );

  3. Додайте 64-бітний блок у кінці, щоб представити довжину вихідних даних.

Коротше кажучи, «1», за яким слідує m «0» плюс 64-бітне або 128-бітне ціле число, додається в кінець повідомлення, щоб створити повідомлення доповнення довжиною 512*n. Додане ціле число є довжиною вихідного повідомлення. Потім доповнене повідомлення буде хешовано в n блоків по 512 біт.

Спосіб будівництва

У цьому прикладі ми використаємо код, згаданий на зображенні вище, як конкретний сценарій, де рядок даних – data="user_id=1&user_name=aa", а ключ – SecretKey="Length_extension\ _attack\ _секрет". Сервер проаналізує поле даних у завантажених даних і виділить необхідні параметри user_id і user_name через роздільник &. Якщо поле ролі існує, сервер також отримає значення цього поля. Потім сервер хешує всі поля за допомогою SecretKey і порівнює його із завантаженим хешем підтвердження. Якщо хеш-значення узгоджені, параметри вважаються такими, що відповідають правилам, і використовуються безпосередньо.

Спочатку ми входимо в інтерфейс loginHandler, щоб отримати хеш-значення hash="37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68", згенероване за допомогою SHA-256 на основі даних і SecretKey.

Далі ми розглянемо складність злому. Беручи нашу тестову ситуацію як приклад, згідно з принципом атаки розширення довжини, якщо ми знаємо довжину H (повідомлення) і повідомлення, ми можемо додавати нові дані за допомогою атаки розширення довжини. Оригінальне повідомлення = SecretKey + дані, тепер у нас уже є H (повідомлення) Нам потрібно лише знати довжину повідомлення, щоб створити нове хеш-значення. Оскільки SecretKey є 30-бітним ключем, потрібно лише 30 ітерацій, щоб дізнатися довжину справжнього повідомлення. Тому ми можемо легко побудувати нове хеш-значення. Оскільки нам потрібні права адміністратора, нам потрібно вставити зловмисне поле "&role=admin" у вихідні дані.

Ми можемо використовувати функцію атаки розширення довжини, щоб додати нові дані та створити нове хеш-значення, не знаючи SecretKey. Тут ми використовуємо бібліотеку, яка вже реалізує цю функцію [2] щоб виконати тест. Потім за допомогою інструменту згенеруйте нове хеш-значення.

Оскільки перевірка інтерфейсу adminActionHandler перевіряє хеш на основі завантажених user_id, user_name і ролі, даними, які ми завантажили в цей час, є user_id=1, user_name=aa\x80\x00\x00\x00 \ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 і роль=адміністратор, як показано на наступному малюнку:

Хеш-значення: 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0. Після цього можна викликати інтерфейс adminActionHandler.Отримавши дані, сервер порівняє завантажений хеш з sha256 (SecretKey + fakeData).Після проходження перевірки будуть виконані деякі конфіденційні операції. Таким чином ми успішно обійшли перевірку на стороні сервера за допомогою атаки розширення довжини та реалізували неавторизовану операцію.

Інші можливі сценарії атаки

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

**2. Безпека веб-додатків: **У веб-додатках, якщо хеш-функція, вразлива до атак розширення довжини, використовується для перевірки даних, наданих користувачами, зловмисники можуть скористатися цим для надсилання шкідливих даних;

3. Цифрові підписи: у деяких схемах цифрового підпису, якщо підпис генерується шляхом об’єднання закритого ключа та повідомлення, а потім його хешування, тоді зловмисник може розгорнути повідомлення та створити дійсний підпис;

4. Зберігання паролів: Хоча це нечасто, але якщо пароль зберігається шляхом об’єднання ключа (наприклад, солі) і пароля, а потім його хешування, то зловмисник може спробувати його зламати, використовуючи пароль атаки розширення довжини.

Як запобігти

1. Виберіть хеш-функцію, яка не вразлива до атак розширення довжини, наприклад SHA-3;

**2. Використовуйте HMAC: **HMAC вимагає ключ і повідомлення як вхідні дані. Результат залежить як від ключа, так і від повідомлення, тому зловмисник не може здійснити атаку розширення довжини, не знаючи ключа.

**3. Посилення перевірки повноважень: **Додайте додаткові етапи перевірки повноважень на стороні сервера, наприклад використання багатофакторної автентифікації.

Нижче наведено характеристики деяких часто використовуваних алгоритмів хешування:

| Алгоритм | Стійкість до зіткнень | Атака зіткнень із вибраним префіксом | Стійкість до попереднього зображення | Атака розширення довжини | | --- | --- | --- | --- | --- | |MD5 | 2^18 | 2^39 | 2^123,4 |Вразливий | |SHA-1 | 2^61.2 | 2^63.4 | 2^160 |Вразливий | |SHA-256 (SHA-2) |2^65,5 |- |2^254,9 |Вразливий| |SHA-512 (SHA-2) |2^32.5 |- |2^511.5 |Уразливий| |SHA-3 |2^50 |- |невідомий |не вразливий | | BLAKE2s | 2^112 | - | 2^241 | Не вразливий| |BLAKE2b |2^224 |- |2^481 |Не вразливий |

Висновок

Ефективним захистом від атак розширення довжини є використання хеш-функцій, стійких до таких атак, наприклад SHA-3 і BLAKE2. Крім того, він також може бути захищений структурою HMAC (Keyed Hash Message Authentication Code). Ці заходи можуть ефективно підвищити безпеку системи, забезпечити цілісність даних і стабільність програми.

Довідкове посилання:

[1]

[2]

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити