Penjelasan CBC Bit Flipping

Enkripsi tidak berarti data Anda aman dari manipulasi.

Banyak pengembang melakukan kesalahan ini. Mereka berpikir jika penyerang tidak dapat membaca data, mereka tidak dapat mengubahnya. Ini salah. Kriptografi memperlakukan kerahasiaan (secrecy) dan integritas (integrity) sebagai dua tugas yang berbeda.

Serangan CBC Bit Flipping membuktikan hal ini. Seorang penyerang dapat mengubah data Anda tanpa mengetahui kunci rahasia Anda.

Berikut cara kerjanya:

AES tidak mengenkripsi data dalam satu bagian besar. AES memecah data menjadi blok-blok berukuran 16-byte. Dalam mode CBC, blok-blok ini saling terhubung. Output terenkripsi dari blok pertama bercampur ke dalam plaintext blok kedua.

Rantai ini menciptakan kelemahan selama proses dekripsi. Untuk mendapatkan teks asli dari Blok 2, server mendekripsinya dan menggabungkannya dengan ciphertext dari Blok 1.

Penyerang dapat mengeksploitasi hal ini:

Penyerang tidak perlu membaca pesan tersebut. Mereka hanya membalikkan (flip) bit untuk mengubah hasil akhirnya.

Bayangkan sebuah aplikasi web lama yang menggunakan cookie terenkripsi untuk sesi. Sebuah cookie mungkin berisi: userid=994;role=user;

Penyerang mencegat cookie ini dan membalikkan bit dalam ciphertext. Mereka mengirimkan banyak permintaan hingga server menerima salah satunya. Karena server hanya memeriksa apakah data dapat didekripsi, server akan memproses teks yang telah dimodifikasi tersebut. Tiba-tiba, string yang didekripsi terbaca: userid=994;role=admi;

Penyerang kini memiliki akses admin. Mereka tidak pernah membaca kunci atau cookie aslinya.

Kesalahannya adalah berasumsi bahwa enkripsi menjamin integritas.

Untuk memperbaikinya, gunakan Authenticated Encryption seperti AES-GCM. Ini membuat tag kriptografi. Tag ini berfungsi seperti segel. Jika penyerang mengubah satu bit saja, segel tersebut akan rusak. Server akan langsung menolak data tersebut.

Jika Anda harus menggunakan CBC, gunakan arsitektur Encrypt-then-MAC. Buat kode autentikasi untuk ciphertext dan verifikasi sebelum Anda memulai dekripsi.

Data rahasia tidak selalu merupakan data yang dapat dipercaya. Selalu buktikan bahwa data Anda tidak berubah sebelum Anda menggunakannya untuk mengambil keputusan.

Penjelasan CBC Bit-Flipping: Mengapa Enkripsi Saja Tidak Menjamin Integritas

Saat kita memikirkan tentang enkripsi, kita biasanya memikirkan tentang kerahasiaan (confidentiality)—memastikan bahwa orang yang tidak berwenang tidak dapat membaca data kita. Namun, enkripsi saja tidak menjamin integritas (integrity)—memastikan bahwa data tidak diubah selama transit atau penyimpanan.

Salah satu cara paling klasik untuk menunjukkan celah ini adalah melalui serangan CBC Bit-Flipping.

Apa itu Mode CBC?

Dalam mode Cipher Block Chaining (CBC), setiap blok plaintext di-XOR dengan blok ciphertext sebelumnya sebelum dienkripsi. Proses enkripsi untuk blok ke-$i$ dapat dirumuskan sebagai:

$C_i = E_k(P_i \oplus C_{i-1})$

Di mana:

Untuk blok pertama, $C_{i-1}$ adalah Initialization Vector (IV).

Saat proses dekripsi, rumusnya dibalik:

$P_i = D_k(C_i) \oplus C_{i-1}$

Di mana $D_k$ adalah fungsi dekripsi.

Celah Keamanan: Serangan Bit-Flipping

Perhatikan rumus dekripsi di atas: $P_i = D_k(C_i) \oplus C_{i-1}$.

Bagian yang krusial di sini adalah $C_{i-1}$ digunakan dalam operasi XOR untuk menghasilkan $P_i$. Ini berarti jika seorang penyerang mengubah satu bit pada $C_{i-1}$, bit yang sama pada $P_i$ juga akan berubah setelah dekripsi.

Meskipun mengubah $C_{i-1}$ akan merusak (mengacak) blok $P_{i-1}$ saat didekripsi, penyerang dapat secara presisi memanipulasi blok $P_i$ berikutnya.

Skenario Serangan

Bayangkan sebuah aplikasi web yang menyimpan data pengguna dalam bentuk cookie terenkripsi menggunakan mode CBC. Isi plaintext-nya adalah:

user=guest;role=user

Misalkan data ini dienkripsi menjadi beberapa blok. Penyerang ingin mengubah role=user menjadi role=admin.

  1. Penyerang mengidentifikasi posisi bit yang mewakili karakter dalam string user.
  2. Penyerang melakukan modifikasi pada blok ciphertext sebelumnya ($C_{i-1}$) yang akan memengaruhi dekripsi blok berikutnya ($P_i$).
  3. Dengan melakukan operasi XOR pada bit tertentu di $C_{i-1}$, penyerang dapat "membalikkan" bit pada $P_i$ sehingga teks yang didekripsi berubah sesuai keinginan.

Meskipun blok $P_{i-1}$ akan menjadi sampah (karakter acak) karena perubahan pada $C_{i-1}$, jika aplikasi hanya memeriksa bagian role=admin pada blok berikutnya, serangan ini akan berhasil.

Contoh Matematis

Jika kita ingin mengubah karakter $P_i[j]$ menjadi karakter baru $P'i[j]$, kita dapat menghitung nilai baru untuk $C{i-1}[j]$ sebagai berikut:

$C'{i-1}[j] = C{i-1}[j] \oplus P_i[j] \oplus P'_i[j]$

Dengan mengirimkan $C'_{i-1}$ yang telah dimodifikasi, saat server melakukan dekripsi:

$P'i[j] = D_k(C_i)[j] \oplus C'{i-1}[j]$ $P'i[j] = D_k(C_i)[j] \oplus (C{i-1}[j] \oplus P_i[j] \oplus P'_i[j])$

Karena $D_k(C_i)[j] \oplus C_{i-1}[j]$ adalah $P_i[j]$, maka:

$P'_i[j] = P_i[j] \oplus P_i[j] \oplus P'_i[j] = P'_i[j]$

Hasilnya, bit telah berhasil diubah tepat seperti yang diinginkan.

Cara Mencegahnya

Jangan pernah mengandalkan enkripsi saja untuk melindungi integritas data. Anda harus menggunakan mekanisme yang dapat mendeteksi manipulasi.

1. Gunakan Authenticated Encryption (AEAD)

Cara terbaik dan paling modern adalah menggunakan mode enkripsi yang sudah menyertakan autentikasi, seperti AES-GCM (Galois/Counter Mode) atau ChaCha20-Poly1305. Mode ini menghasilkan authentication tag yang akan gagal jika ada satu bit pun dalam ciphertext yang diubah.

2. Gunakan HMAC (Encrypt-then-MAC)

Jika Anda harus menggunakan mode CBC, gunakan pendekatan Encrypt-then-MAC.

  1. Enkripsi plaintext untuk mendapatkan ciphertext.
  2. Hitung HMAC (Hash-based Message Authentication Code) dari ciphertext tersebut menggunakan kunci yang berbeda.
  3. Kirimkan ciphertext bersama dengan HMAC-nya.

Saat menerima data, verifikasi HMAC terlebih dahulu sebelum melakukan dekripsi. Jika HMAC tidak cocok, berarti data telah dimanipulasi, dan Anda harus menolaknya.

Kesimpulan

Enkripsi memberikan kerahasiaan, tetapi tidak memberikan integritas. Dalam mode seperti CBC, penyerang dapat memanipulasi ciphertext untuk mengubah plaintext yang didekripsi tanpa perlu mengetahui kunci enkripsi. Selalu gunakan enkripsi terautentikasi (AEAD) untuk memastikan data Anda tetap rahasia dan tidak dapat diubah.