Mövzunu Açan
#0
Sigreturn Temelli Programlama (SROP) ve Güvenlik Açıkları
Sigreturn temelli programlama, bilinen adıyla SROP, günümüzdeki yazılım güvenlik mimarilerini atlatmak için kullanılan sofistike bir istismar tekniğidir. Bu yöntem, özellikle NX (No-Execute) bit gibi yürütme alanlarını veri olarak işaretleyen korumaları etkisiz hale getirme kabiliyetiyle öne çıkar. Geliştiriciler tarafından tasarlanmayan bu dolaylı kod yürütme mekanizması, saldırganlara programın kontrolünü ele geçirme ve rastgele kod çalıştırma imkânı sunar. Başlangıçta stack overflow gibi temel zafiyetlerle tetiklenebilen SROP, karmaşık sistem çağrısı dizilerini manipüle ederek istenen işlevselliği, örneğin bir kabuk elde etmeyi, hedefler. Bu tür gelişmiş teknikler, güvenlik araştırmacılarını ve geliştiricileri, savunma stratejilerini sürekli olarak yeniden değerlendirmeye zorlar.
Sigreturn Sistem Çağrısının Mekanizması
`sigreturn` sistem çağrısı, Unix benzeri işletim sistemlerinde sinyal işleme mekanizmasının ayrılmaz bir parçasıdır. Bir işlem bir sinyal aldığında, çekirdek mevcut CPU durumunu (kayıtlar, yığın işaretçisi, program sayacı dahil) yığın üzerinde bir `sigcontext` yapısına kaydeder ve sinyal işleyiciyi çağırır. Sinyal işleyici işini bitirdiğinde, kontrolü doğrudan `sigreturn` sistem çağrısına aktarır. Bu çağrı, yığında kaydedilmiş olan `sigcontext` yapısını kullanarak işlemcinin durumunu orijinal haline geri yükler. Başka bir deyişle, `sigreturn` sinyal öncesi program akışının doğru bir şekilde devam etmesini sağlayan bir geri yükleme mekanizması olarak çalışır.
`sigcontext` Yapısının Anatomisi ve Önemi
`sigcontext` yapısı, bir sinyal geldiğinde işlemcinin kritik durum bilgilerini barındıran bir veri bloğudur. Bu yapı, program sayacını (rip), yığın işaretçisini (rsp) ve tüm genel amaçlı kayıtların değerlerini içerir. Saldırganlar için bu yapı, programın gelecekteki yürütme akışını doğrudan kontrol etme potansiyeli taşıdığı için büyük önem taşır. `sigcontext`'teki `rip` değerini istedikleri bir adrese ayarlayarak ve diğer kayıtları hedefledikleri sistem çağrısı için gerekli parametrelerle doldurarak, işlemcinin tam kontrolünü ele geçirebilirler. Bu manipulation yeteneği, SROP saldırılarının temelini oluşturur ve rastgele kod yürütme için kritik bir adımdır.
`execve` Sistem Çağrısının İşlevi ve Hedeflenmesi
`execve` sistem çağrısı, Unix benzeri sistemlerde mevcut bir süreci tamamen yeni bir program görüntüsüyle değiştirmek için kullanılır. Bu işlev, yeni bir süreç başlatmak yerine mevcut sürecin bağlamını değiştirir, yani sürece yeni bir kimlik ve işlevsellik kazandırır. `execve` üç ana parametre alır: çalıştırılacak programın yolu, programın argümanları ve ortam değişkenleri. Güvenlik istismarları bağlamında, `execve` genellikle nihai hedeftir. Saldırganlar, başarılı bir SROP istismarının ardından `execve("/bin/sh", NULL, NULL)` gibi bir çağrıyı tetikleyerek hedef sistemde bir kabuk (shell) elde etmeyi amaçlarlar. Bu sayede, uzak bir sistemde komut çalıştırma yeteneği kazanırlar.
Sigreturn Saldırısının Adım Adım Uygulanması
Sigreturn saldırısı genellikle birkaç mantıksal adımdan oluşur. İlk olarak, bir yığın taşması veya başka bir bellek zafiyeti kullanarak saldırganlar yığın üzerine sahte bir `sigcontext` yapısı yerleştirir. Ek olarak, yığın işaretçisini manipüle ederek bu sahte yapıyı işaret etmesini sağlarlar. Ardından, bir sinyal tetiklenir; bu, genellikle geçersiz bir talimat yürütmek veya bilerek bir sistem çağrısı hatası oluşturmak suretiyle gerçekleşir. İşlem, sinyal işleyiciye atlamadan önce kernel tarafından `sigcontext` yapısı otomatik olarak yığına kopyalanır. Son adımda, saldırgan, `rax` kaydını `sigreturn` sistem çağrısı numarasını içerecek şekilde ayarlar ve bir `syscall` talimatı çağırır. Bu, çekirdeğin sahte `sigcontext` yapısını gerçek sanmasına ve işlemci durumunu saldırganın istediği gibi ayarlamasına neden olur.
`execve` Çağrısı İçin Sahte Çerçeve Oluşturma
`execve` sistem çağrısını `sigreturn` kullanarak çalıştırmak için, saldırganın yığına özel olarak hazırlanmış bir `sigcontext` yapısı yerleştirmesi gerekir. Bu yapının içinde, `rip` (program sayacını) doğrudan `execve` sistem çağrısının adresine veya bir `syscall` gadget'ına işaret edecek şekilde ayarlarız. Bununla birlikte, `rdi`, `rsi` ve `rdx` gibi kayıtlar da `execve`'nin beklediği argümanlarla (örneğin, `/bin/sh` dizgesinin adresi, `NULL` argüman listesi ve `NULL` ortam değişkenleri) doldurulur. Ek olarak, `rax` kaydına `execve` sistem çağrısının numarası yerleştirilir. Başka bir deyişle, bu sahte çerçeve, programın `execve` çağrısını doğru parametrelerle yapmasını sağlayacak eksiksiz bir CPU durumunu taklit eder.
Zafiyetlerin Tespiti ve Gelişmiş Savunma Yöntemleri
Sigreturn temelli zafiyetlerin tespiti, genellikle yığın taşmaları veya rastgele yazma yetenekleri gibi temel bellek bozulması güvenlik açıklarının belirlenmesiyle başlar. Bu zafiyetler, saldırganların sahte `sigcontext` yapılarını yığına yerleştirmelerine olanak tanır. Savunma tarafında ise, Modern işletim sistemleri ve derleyiciler, bu tür saldırıları engellemek için çeşitli mekanizmalar sunar. Adres Alanı Düzensizliği (ASLR), bellekteki önemli adresleri rastgeleleştirerek saldırganların belirli bir `syscall` gadget'ını veya `execve` adresini bulmasını zorlaştırır. Veri Yürütme Koruması (DEP/NX), veri segmentlerinden kod yürütülmesini engeller. Ayrıca, `seccomp` gibi sistem çağrısı filtreleme mekanizmaları, bir uygulamanın çağırabileceği sistem çağrılarını kısıtlayarak `sigreturn` istismarlarını sınırlayabilir.