Double Free
Temel Bilgiler
Eğer bir bellek bloğunu birden fazla kez serbest bırakırsanız, bu, ayırıcı verilerini bozabilir ve saldırılara kapı açabilir. İşte bu nasıl olur: bir bellek bloğunu serbest bıraktığınızda, bu, serbest parçaların bir listesine geri döner (örneğin, "hızlı kutu"). Eğer aynı bloğu ardışık olarak iki kez serbest bırakırsanız, ayırıcı bunu tespit eder ve bir hata fırlatır. Ancak eğer araya başka bir parçayı serbest bırakırsanız, çift serbest bırakma kontrolü atlanır, bu da bozulmaya neden olur.
Artık yeni bellek talep ettiğinizde (malloc
kullanarak), ayırıcı size iki kez serbest bırakılmış bir bloğu verebilir. Bu, iki farklı işaretçinin aynı bellek konumuna işaret etmesine neden olabilir. Eğer bir saldırgan bu işaretçilerden birini kontrol ederse, o bellek içeriğini değiştirebilir, bu da güvenlik sorunlarına yol açabilir veya hatta kod çalıştırmalarına izin verebilir.
Örnek:
Bu örnekte, tcache'i birkaç serbest bırakılmış parça (7) ile doldurduktan sonra, kod h
parçasını serbest bırakır, ardından i
parçasını serbest bırakır ve sonra tekrar h
parçasını serbest bırakır, bu da bir double free'e neden olur (aynı zamanda Fast Bin dup olarak da bilinir). Bu, yeniden tahsis ederken üst üste binen bellek adresleri alma olasılığını açar, bu da iki veya daha fazla işaretçinin aynı bellek konumuna işaret edebileceği anlamına gelir. Bir işaretçi aracılığıyla verileri manipüle etmek, diğerini etkileyebilir ve bu da kritik bir güvenlik riski ve potansiyel bir istismar olanağı yaratır.
Bunu yürütürken, i1
ve i2
'nin aynı adresi aldığını not edin:
Örnekler
Sadece
0x70
boyutunun dışında Fast-Bin boyutunda parçalar tahsis edebiliriz, bu da olağan__malloc_hook
üzerine yazmayı engeller.Bunun yerine, Fast Bin dup için hedef olarak
0x56
ile başlayan PIE adreslerini kullanıyoruz (1/2 şansı).PIE adreslerinin saklandığı yerlerden biri
main_arena
'dır, bu Glibc içinde ve__malloc_hook
'a yakındır.Orada bir parça tahsis etmek için
main_arena
'nın belirli bir ofsetini hedef alıyoruz ve__malloc_hook
'a ulaşana kadar parçalar tahsis etmeye devam ediyoruz.Tcache kutularını ve bir null-byte taşmasını kullanarak bir double-free durumu elde edebiliriz:
0x110
boyutunda üç parça tahsis ediyoruz (A
,B
,C
)B
'yi serbest bırakıyoruzA
'yı serbest bırakıyoruz ve null-byte taşmasını kullanmak için tekrar tahsis ediyoruzArtık
B
'nin boyut alanı0x100
,0x111
yerine, bu yüzden tekrar serbest bırakabiliriz0x110
boyutunda bir Tcache-bin ve aynı adrese işaret eden0x100
boyutunda bir tane var. Yani bir double free'imiz var.Tcache poisoning kullanarak double free'i değerlendiriyoruz.
Referanslar
Last updated