CBC Bit Flipping Açıklandı

Şifreleme, verilerinizin kurcalanmaya karşı güvende olduğu anlamına gelmez.

Birçok geliştirici bu hatayı yapar. Bir saldırgan veriyi okuyamıyorsa, onu değiştiremeyeceğini düşünürler. Bu yanlıştır. Kriptografi, gizlilik ve bütünlüğü iki farklı görev olarak ele alır.

CBC Bit Flipping saldırısı bunu kanıtlar. Bir saldırgan, gizli anahtarınızı bilmeden verilerinizi değiştirebilir.

İşte çalışma mantığı:

AES, verileri tek bir büyük parça halinde şifrelemez. Verileri 16 baytlık bloklara böler. CBC modunda bu bloklar birbirine zincirlenir. İlk bloğun şifrelenmiş çıktısı, ikinci bloğun düz metni (plaintext) ile karışır.

Bu zincir, deşifreleme sırasında bir zayıflık oluşturur. 2. Bloğun orijinal metnini elde etmek için sunucu, bloğu deşifre eder ve 1. Bloğun şifreli metni (ciphertext) ile birleştirir.

Bir saldırgan bunu şu şekilde istismar edebilir:

Saldırganın mesajı okumasına gerek yoktur. Sadece nihai sonucu değiştirmek için bitleri çevirirler.

Oturumlar için şifrelenmiş çerezler kullanan eski bir web uygulamasını düşünün. Bir çerez şunları içerebilir: userid=994;role=user;

Bir saldırgan bu çerezi ele geçirir ve şifreli metindeki bitleri değiştirir. Sunucu bir tanesini kabul edene kadar birçok istek gönderir. Sunucu sadece verinin deşifre edilip edilemediğini kontrol ettiği için değiştirilmiş metni işler. Aniden, deşifre edilen dize şu hale gelir: userid=994;role=admi;

Saldırgan artık yönetici (admin) erişimine sahiptir. Anahtarı veya orijinal çerezi asla okumamışlardır.

Hata, şifrelemenin bütünlüğü garanti ettiğini varsaymaktır.

Bunu düzeltmek için AES-GCM gibi Kimlik Doğrulamalı Şifreleme (Authenticated Encryption) kullanın. Bu yöntem kriptografik bir etiket (tag) oluşturur. Bu etiket bir mühür gibi işlev görür. Bir saldırgan tek bir biti bile değiştirse mühür bozulur. Sunucu veriyi anında reddeder.

Eğer CBC kullanmak zorundaysanız, Encrypt-then-MAC mimarisini kullanın. Şifreli metin için bir kimlik doğrulama kodu oluşturun ve deşifrelemeye başlamadan önce bunu doğrulayın.

Gizli veri, her zaman güvenilir veri demek değildir. Karar vermek için kullanmadan önce verilerinizin değişmediğini her zaman kanıtlayın.

CBC Bit-Flipping Açıklaması: Şifreleme Tek Başına Neden Bütünlüğü Garanti Etmez

Şifreleme genellikle verileri gizli tutmanın bir yolu olarak düşünülür. Şifreleme gizlilik (confidentiality) sağlasa da, her zaman bütünlük (integrity) sağlamaz. Bu ayrımı anlamak, güvenli sistemler tasarlamak için kritiktir.

Bu yazıda, CBC (Cipher Block Chaining) modundaki bir zafiyeti ve "bit-flipping" (bit çevirme) saldırısının nasıl çalıştığını inceleyeceğiz.

Gizlilik vs. Bütünlük

Bir mesajı şifrelediğinizde, saldırgan mesajın içeriğini okuyamaz (gizlilik sağlanmıştır). Ancak, saldırgan mesajın içeriğini değiştirebilirse ve siz bunu fark etmezseniz, bütünlük bozulmuş demektir.

CBC Modu Nasıl Çalışır?

CBC modunda, her bir açık metin bloğu şifrelenmeden önce bir önceki şifreli metin bloğu ile XOR işlemine tabi tutulur. İlk blok için ise bir Başlatma Vektörü (Initialization Vector - IV) kullanılır.

Matematiksel olarak, $i$. bloğun deşifre edilmiş açık metni ($P_i$) şu şekilde hesaplanır:

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

Burada:

Bit-Flipping Saldırısı Nedir?

Yukarıdaki formüle baktığımızda, $P_i$ değerinin doğrudan $C_{i-1}$ değerine bağlı olduğunu görüyoruz. Eğer bir saldırgan $C_{i-1}$ bloğundaki belirli bir biti çevirirse (flip), bu durum $P_i$ bloğunun deşifre edilen kısmında da aynı bitin değişmesine neden olur.

Saldırgan, $P_i$ bloğunun içeriğini tam olarak nasıl değiştireceğini öngörebilir.

Örnek Senaryo

Diyelim ki bir web uygulamasının çerezinde (cookie) şu veri şifrelenmiş olarak saklanıyor: user=guest;admin=false

Bu veri bloklara ayrılmış olsun. Saldırgan, şifreli metnin (ciphertext) içinde, "guest" kelimesinin karşılık geldiği bloğun bir önceki bloğundaki bitleri değiştirerek "guest" ifadesini "admin" yapabilir.

Saldırganın yapması gereken tek şey, hedeflediği değişikliği gerçekleştirmek için $C_{i-1}$ bloğundaki bitleri manipüle etmektir. Deşifre işlemi yapıldığında, $P_i$ bloğu saldırganın istediği yeni değerle ortaya çıkacaktır.

Not: Bu işlem, $C_{i-1}$ bloğunun deşifre edilen kısmında ($D_k(C_{i-1})$) tamamen rastgele ve anlamsız bir veriye neden olur, ancak saldırganın hedeflediği $P_i$ bloğu (bir sonraki blok) tam olarak istediği gibi değişir.

Bu Saldırı Nasıl Önlenir?

Şifreleme tek başına bütünlüğü sağlamaz. Bu saldırıyı önlemek için verinin değiştirilmediğini doğrulayan bir mekanizma kullanmalısınız.

1. Kimlik Doğrulamalı Şifreleme (AEAD) Kullanın

En modern ve güvenli yöntem, AEAD (Authenticated Encryption with Associated Data) modlarını kullanmaktır. Örneğin AES-GCM (Galois/Counter Mode). AEAD modları, hem gizliliği hem de bütünlüğü tek bir işlemde sağlar. Eğer şifreli metin üzerinde en ufak bir değişiklik yapılırsa, deşifre işlemi başarısız olur.

2. HMAC (Hash-based Message Authentication Code) Kullanın

Eğer sadece CBC kullanmanız gerekiyorsa, "Encrypt-then-MAC" yaklaşımını uygulamalısınız. Yani önce veriyi şifreleyin, ardından şifreli metnin bir HMAC özetini (digest) oluşturun. Alıcı, veriyi deşifre etmeden önce HMAC'i kontrol ederek verinin değiştirilip değiştirilmediğini doğrular.

Özet