Tartışma

GOT yerine .init_array overwrite

Başlatan Furko · 07 Ara 2025 11:43 · 46 Görüntülenme · 0 Yanıtlar
Konuyu Açan #0

Bellek İstismarı ve Gelişen Savunma Mekanizmaları


Bellek istismarı, yazılım güvenliğindeki en eski ve kalıcı tehditlerden biridir. Geliştiricilerin programlarını daha güvenli hale getirme çabalarına rağmen, kötü niyetli aktörler sistemlerde zafiyetler bulmaya ve bunları istismar etmeye devam eder. Bu tür saldırılar genellikle programın bellek düzenini manipüle ederek beklenmedik davranışlar sergilemesini sağlamayı amaçlar. Modern işletim sistemleri ve derleyiciler, bu tür saldırıları zorlaştırmak için birçok güvenlik mekanizması (ASLR, DEP/NX, RELRO gibi) sunar. Ancak bu mekanizmaların varlığı, saldırganları daha yaratıcı ve karmaşık yöntemler geliştirmeye iter. Sonuç olarak, klasik istismar tekniklerinin yetersiz kaldığı durumlarda yeni yaklaşımlara ihtiyaç duyulur. Bu ihtiyaç, belirli bellek bölgelerine yönelik farklı hedefleme stratejilerini gündeme getirir.

Global Offset Table (GOT) Nedir ve Neden Hedeflenir?


Global Offset Table (GOT), ELF (Executable and Linkable Format) tabanlı ikili dosyalarda harici kütüphane fonksiyonlarına yapılan çağrıların adreslerini dinamik olarak çözümlemek için kullanılan kritik bir yapıdır. Bir program `printf` veya `strcpy` gibi bir kütüphane fonksiyonunu çağırdığında, bu çağrı doğrudan fonksiyonun gerçek adresine değil, GOT içindeki ilgili girişe yönlendirilir. Program ilk kez o fonksiyonu çağırdığında, dinamik bağlayıcı gerçek adresi bulur ve GOT girişini günceller. Bu mekanizma, kütüphanelerin bellek adresi değişse bile programın doğru şekilde çalışmasını sağlar. Saldırganlar için GOT, kontrol akışını ele geçirmek için cazip bir hedeftir. Başka bir deyişle, GOT'taki bir fonksiyon adresini kötü niyetli bir adrese değiştirmek, programın bir sonraki kütüphane çağrısında saldırganın kodunu çalıştırmasına olanak tanır.

GOT Overwrite Saldırılarının Sınırları ve Savunmaları


GOT overwrite saldırıları uzun yıllar boyunca popüler bir istismar tekniği olmuştur. Ancak zamanla bu tür saldırılara karşı savunma mekanizmaları geliştirildi. En önemlilerinden biri, "Relocation Read-Only" anlamına gelen RELRO'dur. RELRO, program başlatıldığında GOT'u salt okunur hale getirerek dinamik bağlayıcının adresleri çözümlemesinden sonra herhangi bir değişikliği engeller. Tam RELRO etkinleştirildiğinde, GOT'un tamamı yazmaya karşı korunur. Kısmi RELRO ise, bağlama sırasında gerekli olmayan kısımları korurken, daha sonraki dinamik bağlama için gerekli olan GOT bölümlerini yazılabilir bırakır. Bu durum, GOT'un artık eskisi kadar kolay bir hedef olmadığını gösterir ve saldırganları kontrol akışını ele geçirmek için farklı stratejiler aramaya yönlendirir.

`.init_array` Bölümünün Yapısı ve Amacı

ELF ikili dosyalarında bulunan `.init_array` bölümü, programın `main()` fonksiyonundan önce yürütülmesi gereken fonksiyon işaretçilerini barındıran özel bir dizidir. Bu bölüm, genellikle global nesnelerin başlatılması, statik kurucuların çalıştırılması veya diğer başlangıç görevlerinin yerine getirilmesi gibi amaçlarla kullanılır. İşletim sistemi, programı yüklediğinde ve dinamik bağlama işlemleri tamamlandığında, `.init_array` içindeki her bir fonksiyon işaretçisini sırasıyla çağırır. Örneğin, C++ programlarında global veya statik sınıfların kurucuları bu mekanizma aracılığıyla yürütülür. Bu nedenle, `.init_array` bölümü, programın çok erken aşamalarında kod yürütme fırsatı sunan bir alandır, bu da onu gelişmiş istismar senaryoları için potansiyel bir hedef haline getirir.

Neden `.init_array` Overwrite Bir Alternatif Olabilir?


`.init_array` overwrite, GOT overwritelarının RELRO gibi güvenlik mekanizmalarıyla zorlaştığı veya tamamen engellendiği durumlarda güçlü bir alternatif sunar. Birçok durumda, `.init_array` bölümü tam RELRO korumasına sahip değildir, yani program başlatıldıktan sonra yazılabilir kalabilir. Bu, bir saldırganın bu bölümdeki bir fonksiyon işaretçisini kendi kötü niyetli fonksiyonunun adresine çevirebileceği anlamına gelir. Sonuç olarak, programın bir sonraki başlatılışında veya belirli bir koşul altında, saldırganın kodu `main()` fonksiyonundan bile önce çalıştırılabilir. Bu erken yürütme yeteneği, saldırgana kontrol akışını ele geçirme ve kritik görevleri gerçekleştirme konusunda önemli bir avantaj sağlar. Başka bir deyişle, GOT'un aksine, `.init_array` genellikle daha az korunan bir hedeftir.

`.init_array` Overwrite Saldırısının Mekaniği

Bir `.init_array` overwrite saldırısının temel mekaniği, yazılabilir bir bellek bölgesinde bulunan bir `.init_array` girişini kötü niyetli bir işaretçiyle değiştirmektir. Saldırgan, bir bellek yazma zafiyetini (örneğin, format string zafiyeti veya heap overflow) kullanarak `.init_array` içindeki bir fonksiyon işaretçisinin adresini kendi shellcode'unun veya `system()` gibi istediği bir fonksiyonun adresine yazar. Bu işlem genellikle bir sonraki program başlatılışında veya programın belirli bir bölümünde tetiklenir. Programın başlangıç rutini, `.init_array`'i tararken saldırganın değiştirdiği işaretçiye ulaşır ve böylece kontrol akışı saldırganın istediği adrese yönlendirilir. Ek olarak, bu yöntem, programın normal işlevselliği başlamadan önce saldırganın kontrolü ele almasını sağlar, bu da birçok güvenlik izlemesini atlatmasına yardımcı olabilir.

Gelişmiş Bellek Güvenliği ve Savunma Stratejileri


Gelişmiş bellek istismarı tekniklerine karşı savunma, çok katmanlı bir yaklaşım gerektirir. Öncelikle, tüm bellek bölgelerinin ihtiyaç duyulduğu zaman dışında yazılabilir olmamasını sağlamak kritik öneme sahiptir. Tam RELRO gibi derleyici bayrakları, hem GOT hem de `.init_array` gibi kritik bölümlerin çalışmaya başlamadan önce salt okunur hale getirilmesine yardımcı olur. Ek olarak, ASLR (Address Space Layout Randomization) ve DEP/NX (Data Execution Prevention/No-Execute) gibi standart güvenlik mekanizmaları, shellcode'un yerini tahmin etmeyi ve yürütmeyi zorlaştırır. Güvenli kodlama pratikleri, bellek zafiyetlerinin (buffer overflow, format string bugları vb.) oluşmasını baştan engellemek için esastır. Sonuç olarak, sürekli güvenlik denetimleri ve sistemlerin güncel tutulması, bu tür gelişmiş tehditlere karşı güçlü bir savunma hattı oluşturur.

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi