𝗖𝗕𝗖 𝗕𝗶𝘁 𝗙𝗹𝗶𝗽𝗽𝗶𝗻𝗴 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱
Encryption does not mean your data is safe from tampering.
Many developers make this mistake. They think if an attacker cannot read the data, they cannot change it. This is wrong. Cryptography treats secrecy and integrity as two different tasks.
The CBC Bit Flipping attack proves this. An attacker can change your data without knowing your secret key.
Here is how it works:
AES does not encrypt data in one large piece. It breaks data into 16-byte blocks. In CBC mode, these blocks chain together. The encrypted output of the first block mixes into the plaintext of the second block.
This chain creates a weakness during decryption. To get the original text of Block 2, the server decrypts it and combines it with the ciphertext from Block 1.
An attacker can exploit this:
- The attacker intercepts your encrypted traffic.
- They do not know the key, so the data looks like gibberish.
- They change specific bits in the ciphertext of Block 1.
- They send this altered data to your server.
- When the server decrypts it, the change in Block 1 shifts the math for Block 2.
The attacker does not need to read the message. They just flip bits to change the final result.
Consider an old web app using encrypted cookies for sessions. A cookie might hold: userid=994;role=user;
An attacker intercepts this cookie and flips bits in the ciphertext. They send many requests until the server accepts one. Because the server only checks if the data decrypts, it processes the modified text. Suddenly, the decrypted string reads: userid=994;role=admi;
The attacker now has admin access. They never read the key or the original cookie.
The mistake is assuming encryption guarantees integrity.
- Confidentiality stops people from reading data.
- Integrity stops people from changing data.
To fix this, use Authenticated Encryption like AES-GCM. It creates a cryptographic tag. This tag acts like a seal. If an attacker changes even one bit, the seal breaks. The server rejects the data immediately.
If you must use CBC, use an Encrypt-then-MAC architecture. Create an authentication code for the ciphertext and verify it before you start decryption.
Secret data is not always trustworthy data. Always prove your data is unchanged before you use it to make decisions.
Разбор атаки CBC Bit-Flipping: почему одного шифрования недостаточно для обеспечения целостности
Когда мы говорим о шифровании, первое, что приходит на ум, — это конфиденциальность. Мы хотим быть уверены, что если кто-то перехватит наши данные, он не сможет их прочитать.
Однако одного шифрования недостаточно для обеспечения целостности. Целостность гарантирует, что данные не были несанкционированно изменены во время передачи.
В этой статье мы разберем специфический тип атаки, называемый атакой с переворотом битов (bit-flipping attack) в режиме CBC, и поймем, почему она так опасна.
Что такое режим CBC?
Cipher Block Chaining (CBC) — это режим работы блочных шифров. В режиме CBC каждый блок открытого текста перед шифрованием подвергается операции XOR с предыдущим блоком шифротекста. Это гарантирует, что идентичные блоки открытого текста приведут к разным блокам шифротекста.
Математическая формула шифрования выглядит так: $C_i = E_k(P_i \oplus C_{i-1})$
И формула дешифрования: $P_i = D_k(C_i) \oplus C_{i-1}$
Где:
- $P_i$ — $i$-й блок открытого текста.
- $C_i$ — $i$-й блок шифротекста.
- $C_{i-1}$ — предыдущий блок шифротекста (для первого блока это вектор инициализации, IV).
- $E_k$ — функция шифрования с ключом $k$.
- $D_k$ — функция дешифрования с ключом $k$.
- $\oplus$ — операция XOR.
Уязвимость: Переворот битов (Bit-Flipping)
Уязвимость кроется в формуле дешифрования: $P_i = D_k(C_i) \oplus C_{i-1}$.
Обратите внимание, что блок открытого текста $P_i$ напрямую зависит от предыдущего блока шифротекста $C_{i-1}$ через операцию XOR. Если злоумышленник изменит бит в $C_{i-1}$, соответствующий бит в $P_i$ также изменится!
В частности, если атакующий перевернет $n$-й бит в $C_{i-1}$, то $n$-й бит в $P_i$ тоже будет перевернут.
Практический пример
Представьте, что веб-приложение хранит данные сессии пользователя в зашифрованной куке (cookie). Кука содержит следующий открытый текст:
user_id=100;admin=false
Допустим, эти данные зашифрованы с помощью AES в режиме CBC. Злоумышленник перехватывает шифротекст. Он не знает ключа, но знает структуру открытого текста.
Цель атакующего — изменить admin=false на admin=true.
Для этого он определяет, какой блок шифротекста соответствует части admin=false. Допустим, это второй блок, $C_2$. Чтобы изменить открытый текст в $C_2$, ему нужно манипулировать предыдущим блоком шифротекста, $C_1$.
Переворачивая биты в $C_1$ именно в тех позициях, где находится слово false, он может изменить расшифрованное значение в $P_2$ на true.
Стоп! Есть побочный эффект. Изменение $C_1$ полностью исказит расшифровку $P_1$. Однако, если приложение учитывает только данные в $P_2$ (втором блоке), атака пройдет успешно!
Как предотвратить атаки с переворотом битов
Чтобы предотвратить это, необходимо обеспечить как конфиденциальность, так и целостность.
1. Используйте код аутентификации сообщения (MAC)
MAC (например, HMAC) — это криптографическая контрольная сумма, которая гарантирует, что данные не были подделаны. Стандартный подход — Encrypt-then-MAC:
- Зашифруйте открытый текст, чтобы получить шифротекст.
- Вычислите MAC для шифротекста.
- Прикрепите MAC к шифротексту.
При дешифровании сначала проверьте MAC. Если он не совпадает, отбросьте данные.
2. Используйте аутентифицированное шифрование (AEAD)
Современные режимы шифрования, такие как AES-GCM (Galois/Counter Mode) или ChaCha20-Poly1305, разработаны для автоматического обеспечения как конфиденциальности, так и целостности. Эти режимы называются AEAD (Authenticated Encryption with Associated Data).
Если кто-то попытается перевернуть бит в сообщении, зашифрованном с помощью AES-GCM, процесс дешифрования не пройдет проверку целостности, и данные будут отклонены.
Заключение
Шифрование — это не панацея. Хотя оно защищает ваши данные от чтения, оно не обязательно защищает их от изменения. Всегда используйте аутентифицированное шифрование или MAC, чтобы гарантировать, что ваши данные останутся именно такими, какими вы их отправили.