𝗖𝗕𝗖 𝗕𝗶𝘁 𝗙𝗹𝗶𝗽𝗽𝗶𝗻𝗴 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱
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.
Penjelasan CBC Bit-Flipping: Mengapa Penyulitan Sahaja Tidak Menjamin Integriti
Dalam dunia kriptografi, kita sering mengaitkan penyulitan (encryption) dengan keselamatan. Namun, terdapat perbezaan penting antara kerahsiaan (confidentiality) dan integriti (integrity).
- Kerahsiaan: Memastikan hanya pihak yang diberi kuasa dapat membaca data.
- Integriti: Memastikan data tidak diubah suai oleh pihak yang tidak dibenarkan semasa dalam transit atau penyimpanan.
Penyulitan seperti AES (Advanced Encryption Standard) menyediakan kerahsiaan yang sangat kuat. Walau bagaimanapun, jika anda menggunakan mod operasi yang tidak selamat seperti Cipher Block Chaining (CBC) tanpa mekanisme pengesahan tambahan, anda terdedah kepada serangan bit-flipping.
Serangan ini membuktikan bahawa walaupun penyerang tidak dapat membaca kandungan data anda, mereka masih boleh mengubahnya dengan cara yang boleh diramal.
Apakah itu CBC (Cipher Block Chaining)?
Dalam mod CBC, setiap blok teks biasa (plaintext) di-XOR dengan blok teks sifer (ciphertext) sebelumnya sebelum disulitkan. Proses ini dilakukan untuk memastikan bahawa blok teks biasa yang sama akan menghasilkan ciphertext yang berbeza setiap kali ia disulitkan (mengelakkan corak yang boleh dikesan).
Secara matematik, proses penyulitan untuk blok ke-$i$ adalah:
$$C_i = E_k(P_i \oplus C_{i-1})$$
Di mana:
- $C_i$ ialah blok ciphertext semasa.
- $E_k$ ialah fungsi penyulitan dengan kunci $k$.
- $P_i$ ialah blok plaintext semasa.
- $C_{i-1}$ ialah blok ciphertext sebelumnya (untuk blok pertama, $C_0$ ialah Initialization Vector atau IV).
Proses nyahsulit (decryption) adalah sebaliknya:
$$P_i = D_k(C_i) \oplus C_{i-1}$$
Di mana:
- $D_k$ ialah fungsi nyahsulit dengan kunci $k$.
Kerentanan: Serangan Bit-Flipping
Perhatikan formula nyahsulit di atas: $P_i = D_k(C_i) \oplus C_{i-1}$.
Di sini, plaintext blok semasa ($P_i$) bergantung secara langsung kepada ciphertext blok sebelumnya ($C_{i-1}$) melalui operasi XOR. Ini bermakna, jika seorang penyerang mengubah satu bit dalam $C_{i-1}$, bit yang sama pada kedudukan yang sama dalam $P_i$ juga akan berubah secara langsung selepas proses nyahsulit.
Walaupun perubahan pada $C_{i-1}$ akan merosakkan (menjadikan rawak) plaintext bagi blok $C_{i-1}$ itu sendiri, ia membolehkan penyerang melakukan manipulasi yang sangat tepat pada blok seterusnya ($P_i$).
Contoh Senario
Katakan kita mempunyai data yang disulitkan menggunakan CBC yang mengandungi maklumat pengguna:
user=guest;role=user
Mari kita katakan blok plaintext adalah seperti berikut (untuk memudahkan pemahaman):
- Blok 1 ($P_1$):
user=guest; - Blok 2 ($P_2$):
role=user
Penyerang ingin menukar role=user kepada role=admin.
Untuk melakukan ini, penyerang tidak perlu tahu kunci penyulitan. Mereka hanya perlu:
- Kenal pasti bit dalam ciphertext Blok 1 ($C_1$) yang sepadan dengan aksara dalam
role=userpada Blok 2 ($P_2$). - Lakukan operasi XOR pada bit tersebut dalam $C_1$ dengan nilai perbezaan antara
userdanadmin.
Apabila sistem menerima ciphertext yang telah diubah suai ini dan melakukan nyahsulit:
- $P_1$ akan menjadi sampah (corrupted) kerana $C_1$ telah diubah.
- $P_2$ akan menjadi
role=adminkerana perubahan pada $C_1$ telah "membatalkan" nilai asal dan memasukkan nilai baharu melalui operasi XOR.
Jika aplikasi tersebut hanya menyemak sama ada pengguna adalah admin tanpa menyemak integriti keseluruhan mesej, penyerang telah berjaya menaik taraf hak akses mereka.
Bagaimana Cara Mencegahnya?
Penyulitan sahaja tidak mencukupi untuk menjamin integriti. Anda memerlukan mekanisme yang boleh mengesan sebarang perubahan pada ciphertext.
1. Gunakan AEAD (Authenticated Encryption with Associated Data)
Cara terbaik dan paling moden adalah dengan menggunakan mod penyulitan yang menyediakan kerahsiaan dan integriti secara terbina. Mod seperti AES-GCM (Galois/Counter Mode) atau ChaCha20-Poly1305 adalah jenis AEAD.
AEAD akan menghasilkan "authentication tag" bersama dengan ciphertext. Jika satu bit sahaja dalam ciphertext diubah, tag tersebut tidak akan sepadan semasa proses nyahsulit, dan sistem akan menolak keseluruhan mesej tersebut sebagai tidak sah.
2. Gunakan HMAC (Hash-based Message Authentication Code)
Jika anda terpaksa menggunakan mod seperti CBC, anda mesti menggunakan pendekatan Encrypt-then-MAC.
Prosesnya adalah:
- Sulitkan plaintext untuk mendapatkan ciphertext.
- Kira HMAC bagi ciphertext tersebut menggunakan kunci yang berbeza.
- Hantar ciphertext bersama HMAC.
Semasa penerimaan:
- Sahkan HMAC terlebih dahulu.
- Jika HMAC sah, barulah lakukan nyahsulit.
Ini memastikan bahawa sebarang manipulasi pada ciphertext akan dikesan sebelum proses nyahsulit yang berisiko bermula.
Kesimpulan
Jangan sesekali menganggap bahawa penyulitan bermaksud data anda selamat daripada manipulasi. Dalam mod seperti CBC, penyerang boleh mengubah kandungan data tanpa perlu memecahkan kod penyulitan tersebut. Sentiasa gunakan penyulitan yang terautentikasi (Authenticated Encryption) untuk memastikan kedua-dua kerahsiaan dan integriti data anda terpelihara.