Oracle Padding Vulnerability

Merhabalar,

bu yazıda blok şifreleme yöntemlerinden olan CBC (Cipher Block Chain) yöntemi içerisinde bulunan “Oracle Padding” zafiyetini inceleyeceğiz.

Blok şifreleme;  şifrelenecek olan bir bilginin, kriptografik algoritmaya ait blok büyüklüğünde parçalara bölünmesi ve elde edilen her parçanın belirlenen anahtar (key) yardımı ile ayrı ayrı şifrelenmesi şeklinde gerçekleştirilmektedir.

Fakat şifrelenecek olan bilgi, her zaman ilgili kriptografik algoritmanın blok uzunluğunun tam katı olmamaktadır. Böyle durumlarda, “padding” adı verilen karakterler yardımıyla, şifrelenecek olan bilginin kriptografik algoritmaya ait blok uzunluğunun tam katı olması sağlanmaktadır.

“Padding” işlemi için bir çok yöntem bulunmaktadır. Fakat “Oracle Padding” zafiyeti kapsamında “PKCS#5 ve PKCS#7 – Public Key Cryptography Standard” “padding” yöntemlerinden bahsedilecektir.

PKCS yöntemlerinde, şifrelenecek olan bilgi ile blok büyüklüğü arasında kalan boş alan, boş alanı temsil eden uzunluk değeri ile doldurulmaktadır.

Örneğin; “SECRET MESSAGE” ifadesi 14 Byte büyüklüğündedir. AES algoritmasına ait blok büyüklüğünün 128 bit (16 Byte) olduğu bilinmektedir. Bu doğrultuda 2 Byte büyüklüğünde bir alanın boş olduğu tespit edilmektedir. PKCS standardı ile yapılan doldurma işlemi sonrasında şifrelenecek olan bilgi “SECRET MESSAGE0202” şeklinde olacaktır.

Görüleceği üzere 2 Byte büyüklüğünde boşluk kalması nedeniyle “0x2” değeri kullanılarak doldurma (padding) işlemi gerçekleştirilmektedir. Bu büyüklüğün 3 Byte olması durumunda “0x3” değeri kullanılarak aynı işlem gerçekleştirilmektedir.

Aşağıdaki şekilde 4 Byte büyüklüğünde yapılan doldurma işlemi görülmektedir.

NOT: PKCS#5, PKCS#7 yönteminin bir alt kümesi olarak düşünülebilir. PKCS#5 yöntemi sadece 8 Byte büyüklüğündeki bloklar üzerinde uygulanabilirken, PKCS#7 yöntemi 1-255 Byte büyüklüğe sahip her blok üzerinde uygulanabilmektedir. AES 16 Byte blok büyüklüğüne sahip olmasından ötürü, PKCS#5 yöntemi ile kullanılamamaktadır.

“Oracle Padding” zafiyetinin tanımından bahsedilmeden önce hatırlanması/incelenmesi gereken bir diğer konu ise CBC (Cipher Block Chain) blok şifreleme yöntemidir. CBC metodu ile gerçekleştirilen şifreleme/şifre çözme işlemlerine ait şema aşağıdaki şekildedir.

Ön bilgilerin elde edilmesinin ardından “Oracle Padding” zafiyetine yönelik incelemelerin gerçekleştirilmesine başlanılabilir.

İlk olarak “Oracle Padding” nedir sorusunun cevabı araştırılmalıdır. “Oracle – Kahin, Kehanette Bulunan Kimse” kelime anlamı ile düşünüldüğünde, padding kullanarak tahminde bulunma saldırısı olarak düşünülebilir.

Olası zafiyetli durum senaryosunun;

  • Şifreleme işlemi esnasında CBC mod kullanıldığı saldırgan tarafından bilinmektedir.
  • Şifrelenmiş bir ifade saldırgan tarafından elde edilmiştir.
  • PKCS#5 veya PKCS#7 yöntemi ile padding gerçekleştirilmiştir.
  • Şifre çözme işlemi esnasında meydana gelebilecek “Invalid Padding” hatası kullanıcıya hata mesajı ile gönderilmektedir.

Görüleceği üzere anahtar (key) ve IV değerlerinin bilinmesine gerek olmadan saldırının gerçekleştirilebileceği anlaşılmaktadır.

PKCS yöntemleri ile gerçekleştirilen doldurma – padding işlemlerinin, blok içerisinde kalan boş alan uzunluğuna ait değer ile doldurulduğu bilgisi yazının ilk bölümlerinde belirtilmişti. 

Bu bilgi doğrultusunda, saldırgan tarafından gerçekleştirilen işlem adımlarının ilk bölümü aşağıdaki şekildedir.

  • Ciphertext[0:16] ve Ciphertext[32:48] ifadeleri, saldırgan tarafından elde edilen şifreli ifadenin ilk ve son bloklarıdır.
  • Ciphertext[16:32] şifreli ifadeye ait ikinci bloktur. Ciphertext[32:48] bloğuna ait şifre çözme işlemi esnasında Ciphertext[16:32] değerinin IV olarak kullanılıyor olması, saldırgan tarafından ilk olarak bu bloğun hedef alınmasına neden olmaktadır.
  • Ciphertext[32:48] blok değeri hedef sistem tarafından anahtar (key) yardımı ile çözülür ve “Intermediate Value” adı verilen değer elde edilir. Bu aşamada anahtar ile şifre çözme işlemi gerçekleştirilmiş olsa bile, şifre çözme işlemi tam anlamıyla tamamlanmamış bulunmaktadır.
  • Ciphertext[16:32] ile Intermediate[32:48] ifadeleri XOR işlemine tâbi tutulur ve Plaintext[32:48] değeri elde edilir. Bu aşamada doldurma – padding kontrolü sağlanmaktadır. Başka bir deyişle, saldırgan tarafından gönderilen her Ciphertext[16:32] ifadesi sonucunda şifre çözme işlemin gerçekleştirilemediği ve “Invalid Padding” hatası alındığı durumlar bulunabilmektedir.

Saldırgan tarafından gerçekleştirilen işlem adımlarının ikinci bölümü aşağıdaki şekildedir.

  • Bu doğrultuda saldırganın amacı, hedef sistem üzerinden “Invalid Padding” hata mesajına neden olmayan Ciphertext[16:32] değerlerini belirlemektir.
  • PKCS yöntemi kullanılarak oluşturulan ve “0x1” ifadesi ile biten bir ifade, son Byte değerinin boş olmasından dolayı doldurma – padding işlemi yapıldığını göstermektedir. Bu bilgi doğrultusunda saldırgan tarafından hedef sisteme gönderilen Ciphertext[31] değeri “Invalid Padding” hata mesajına neden olmuyor ise Plaintext[47] değerinin “0x1” olarak elde edildiği anlaşılmaktadır.
  • “Plaintext[47] = Ciphertext[32] XOR Intermediate[47]” ifadesi gerçekleştirilen işlemlerin matematiksel olarak ifade edilebilmesini sağlamaktadır. XOR operatörünün sahip olduğu değişme özelliği sayesinde, tanımlanmış olan eşitlik “Intermediate[47] = Plaintext[47] XOR Ciphertext[31]” formatına dönüştürülebilmektedir.
  • İlk hedefin son Byte değeri olmasından dolayı matematiksel eşitlik “Intermediate[47] = 0x1 XOR Ciphertext[31]” şeklini almaktadır. Ciphertext[31] değerinin 0-255 arasında bulunan bir değer olduğu ve doğru değer gönderilmesi sonucunda hedef sistemden hata mesajı alınmayacağının biliniyor olması, önce Ciphertext[31] değerini daha sonrada Intermediate[47] değerini elde etmemizi sağlamaktadır.

Saldırgan tarafından gerçekleştirilen işlem adımlarının üçüncü bölümü aşağıdaki şekildedir.

  • Bir sonraki hedef Intermediate[46] değerinin elde edilmesi olacaktır. Bir önceki işlemde plaintext ifadesine ait son Byte değerinin doldurma – padding değeri içerdiği varsayılarak deneme/yanılma işlemleri gerçekleştirilmişti.
  • Intermediate[46] değerinin tespit edilebilmesi için son iki Byte değerinin doldurma – padding ile oluşturulduğu varsayılarak işlemler gerçekleştirilecektir. Bu nedenle Plaintext[47] = 0x2 ve Plaintext[46] = 0x2 eşitlikleri kabul edilmektedir.
  • Daha sonra  “0x2 = Intermediate[47]  XOR Ciphertext[31]” eşitliğini sağlayacak şekilde Ciphertext[31] değerinin içeriği güncellenmektedir (Intermediate[47] değerinin bir önceki adımda elde edilmişti)
  • Sondan ikinci Byte için matematiksel ifademiz “Intermediate[46] = 0x2 XOR Ciphertext[30]” şeklinde olacaktır. Bu doğrultuda 0 – 255 aralığında seçilen ve hedef sistem üzerinde “Invalid Padding” hatasına neden olmayan Ciphertext[30] değerinin tespiti gerçekleştirilir. Ciphertext[30] değerinin tespiti sonrasında Intermediate[46] değerinin de tespit edilebileceği görülmektedir.

Yukarıda gerçekleştirilen adımlar, tüm şifreli ifade tamamlanana kadar devam etmektedir. Gerçekleştirilen işlem sonucunda ise Intermediate[0:48] değerleri elde edilmektedir. Aşağıdaki görsel incelendiğinde, Intermediate[0:48] değerinin elde edilmesinin, Plaintext[0:48] değerini elde etmek ile aynı anlama geldiği görülmektedir.

Görüleceği üzere şifreleme işleminde elde edilen Intermediate değer ile şifre çözme işleminde elde edilen Intermediate değer eşittir. Bu bilgi doğrultusunda, “Oracle Padding” saldırısı ile elde etmiş olduğumuz Intermediate[0:48] ifadesi ile saldırgan tarafından değiştirilmemiş olan şifreli ifadenin XOR işlemine girmesi ile Plaintext[0:48] değeri elde edilebilmektedir.

Aşağıdaki örnek üzerinden yardımı ile zafiyete ilişkin bilgiler daha açık bir şekilde anlaşılmaktadır.

İlk olarak aşağıdaki şekilde bir python script geliştirilerek AES – CBS şifreleme/şifre çözme işlemleri gerçekleştirilmektedir.

“This is very very very very secret key for aa.” ifadesinin, belirlenen anahtar (key) ve IV parametreleri ile şifrelenmesi sonucunda elde edilen ifade aşağıdaki şekildedir.

“DecryptedText” isimli değer incelendiğinde “0202” değeri ile sonlandığı görülmektedir. Plaintext olarak girilen ifadenin 46 Byte büyüklüğünde olması nedeni ile 2 Byte büyüklüğünde boş alan kaldığı ve bu alanın “02” değeri ile doldurulduğu anlaşılmaktadır.

Şifreleme sonrasında oluşan “cipherByte[16:32]” ifadesi “AAAAAAAAAAAAAAAA” değeri ile değiştirilmektedir.

Güncelleme sonrasında oluşan ciphertext aşağıdaki şekildedir.

Elde edilen yeni ciphertext ifadesinin çözülmesi denendiğinde aşağıdaki şekilde hata mesajı alındığı görülmektedir.

Hata mesajının oluşturulduğu “is_pkcs7” metodu incelendiğinde, plaintext ifadeye ait son karakterinin 1 – 16 arasında bir değer alması şartı bulunduğu görülmektedir. Bunun nedeni padding işleminde kullanılacak değerlerin en küçük 1 en büyük F (16) olabilecek olmasıdır.

Bir sonraki adımda, script içerisine yerleştirilen döngü yardımı ile Ciphertext[31] değerinin tespit edilmesi denenmektedir.

Script incelendiğinde cipherByte[0:16] ifadesi ile 15 adet “A” karakteri birleştirilmektedir. Daha sonra döngüye ait nümerik index değerinin ASCII karakter karşılığı tespit edilir ve mevcut ifadenin sonuna eklenilir. Son olarak şifreli ifadenin son bloğu (cipherByte[32:]), elde edilen ifade sonuna eklenerek şifre çözme işlem adımına geçilir.

Oluşturulan script çalışması sonucunda aşağıdaki görüntü elde edilmektedir.

0 – 255 arasında bulunan değerlerin “Intermediate Value” ile XOR işlemine tabi tutulmasına ait sonuçlar ekranda görülmektedir. Sadece “210” değeri ile gerçekleştirilen işlem sonucunda “PADDING ERROR” hatası alınmadığı görülmektedir.

Bu sonuçla;

  • Intermediate[47] = Ciphertext[32] XOR 1
  • Intermediate[47] = 210 XOR 1 = 211

değeri elde edilmektedir. Bir sonraki adımda Intermediate[46] değerinin tespiti için aynı işlem adımları gerçekleştirilmektedir.

Bu amaçla mevcut script içerisinde aşağıdaki değişiklikler gerçekleştirilmektedir.

Görüleceği üzere, index değeri ile karakter tahmini Ciphertext[30] üzerinde gerçekleştirilmektedir. Bir önceki adımda elde edilmiş olan Intermediate[47] değeri ile ikinci iterasyona ait olan doldurma – padding değerinin XOR işlemine girmesi ile Intermediate[47] XOR Ciphertext[31] = 0x2 – Ciphertext[31] = Intermediate[47] XOR 0x2 eşitliği elde edilmektedir.

Script çalışması sonucunda “39” değerine ait karakter ile yapılan işlemin doldurma – padding hatasına neden olmadığı görülmektedir.

Bu sonuçla;

  • Intermediate[46] = Ciphertext[31] XOR 2
  • Intermediate[47] = 39 XOR 2 = 37

değeri elde edilmektedir.

Geriye kalan tüm Intermediate değerlerinin elde edilebilmesi için mevcut script aşağıdaki şekilde güncellenmektedir.

Script çalışması sonucunda Intermediate[32:48] aralığının elde edildiği görülmektedir.

Elde edilen Intermediate[32:48] bloğu ile saldırgan tarafından değiştirilmemiş Ciphertext[16:32] bloğunun XOR işlemine tâbi tutulması sonucunda şifreli verinin çözüldüğü görülmektedir.

Script çalışması sonucunda 14 Byte büyüklüğünde ki “et key for aa.” ifadesi elde edilmektedir (Orijinal ifadenin son iki Byte değeri doldurma – padding karakteri olmasından dolayı 14 Byte elde edilmiştir)

Görüleceği üzere anahtar (key) ve IV değerleri bilinmeden, sadece sistem tarafından alınan hata mesajları yardımı ile CBC yöntemi kullanılarak şifrelenmiş verinin çözülmesi gerçekleştirilmiştir.

Ayrıca, mevcutta bulunan şifreli ifade içerisinde bulunan ifadelerin değiştirilebilmesi de “ORACLE PADDING” zafiyeti ile gerçekleştirilebilmektedir. Şifre çözme işlemi;

  • Plaintext[i] = Intermediate[i] XOR Ciphertext[i]

Eşitliği kullanılarak gerçekleştirilmektedir. Aynı eşitlik XOR operatörüne ait değişme özelliği yardımı ile aşağıdaki forma dönüştürülebilmektedir.

  • Ciphertext[i] = Intermediate[i] XOR Plaintext[i]

Görüleceği üzere Ciphertext ifadesi Intermediate değer ile Plaintext değerin XOR işlemine girmesi ile elde edilmektedir.

  • Ciphertext[i] = Intermediate[i] XOR Newtext[i]

Şeklinde mevcut eşitlik güncellendiğinde, anahtar (key) ve IV değerlerini bilmeden, hedef sistem için anlamlı bir şifreli ifade oluşturulabileceği görülmektedir.

Mevcut script içerisi aşağıdaki şekilde güncellenerek şifreli metin içerisine “AORA” ifadesi eklenmesi sağlanır.

Script çalışması sonucunda şifre çözme işleminin hatasız bir şekilde gerçekleştiği, “AORA” ifadesinin başarılı bir şekilde metin içerisine yerleştirildiği görülmektedir.

(Script dosyasına https://github.com/aaoraa/oracle-padding-example adresinden erişebilirsiniz)

Yazar: Ahmet Akan

2016 Karabük Üniversitesi Bilgisayar Mühendisliği Mezunu. Kariyerine Uygulama Güvenliği Analisti olarak başladı ve bu alanda görev almaya devam etmekte.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir