
Kullanımsız (UAF) güvenlik açıkları, modern yazılım sistemlerindeki en kritik ve yaygın güvenlik tehditlerinden birini temsil eder, özellikle C ve C ++ gibi bellek dışı dillerde yazılmış uygulamaları etkilemektedir.
Bu güvenlik açıkları, bir program serbest bırakıldıktan sonra bir bellek konumu kullanmaya devam ettiğinde, saldırganların program yürütme akışını manipüle etme, yozlaşmış verileri veya keyfi kod yürütme elde etmeleri için fırsatlar yarattığında meydana gelir.
Kullanımsız güvenlik açıklarının şiddeti, yüksek profilli güvenlik danışmanlarındaki sık görünümleri ve web tarayıcılarına, işletim sistemlerine ve kritik altyapı yazılımlarına yönelik gerçek dünya saldırılarındaki sömürüleri ile vurgulanmaktadır.
Boş bir güvenlik açığı nasıl gerçekleşir?
Uygulamalarda, dinamik bellek tahsisini ve dağıtımı manuel olarak ele alan bellek yönetimi uygulamalarındaki temel kusurlardan kaynaklanan kullanımdan arındırılmış güvenlik açıkları ortaya çıkmaktadır.
Güvenlik açığı, bir program gibi işlevleri kullanarak bir bellek bölgesi dağıttığında ortaya çıkar. free()
C veya delete
ancak daha sonra sarkan işaretçilerle aynı bellek konumuna erişmeye veya manipüle etmeye çalışır.
Bu, özgür belleğin farklı amaçlar için yeniden tahsis edilmiş olabileceği ve öngörülemeyen program davranışına yol açan tehlikeli bir durum yaratır.
Aşağıdaki özlü C kodu, kullanımda olmayan bir güvenlik açığının temel mekanizmasını göstermektedir:

Kullanımsız güvenlik açıklarının teknik mekaniği, bellek yaşam döngüsünde birkaç kritik aşamayı içerir. Başlangıçta, bir program, malloc()
– calloc()
veya new
Operatör, bir bellek bölgesine geçerli bir işaretçi oluşturma.
Normal yürütme sırasında, program bu hafızayı meşru bir şekilde serbest bırakabilir. free()
veya delete
Bellek Bölgesinin Bellek Tahsisatçısı tarafından yeniden kullanılması için mümkün olduğu şekilde işaretlenmesi.
Ancak, program belleği serbest bıraktıktan sonra işaretçiyi NULL olarak ayarlayamazsa veya birden fazla işaretçi aynı bellek konumuna başvuruyorsa, sonraki erişim denemeleri kullanımsız kullanım koşulları oluşturur.
Freedus bellek farklı veri yapıları veya değişen düzen ve amaçlara sahip nesneler için yeniden tahsis edildiğinde güvenlik açığı özellikle tehlikeli hale gelir.
Modern bellek tahsisçileri, performansı optimize etmek için sıklıkla serbest bellek bloklarını hızlı bir şekilde yeniden kullanır, yani içermeyen bir erişim, başlangıçta amaçlanandan tamamen farklı verilerle etkileşime girebilir.
Bu bellek yeniden kullanımı, programın bir türdeki verileri diğeri olarak yorumladığı ve potansiyel olarak saldırganların nesne özelliklerini, işlev işaretçilerini veya diğer kritik program durumunu manipüle etmesine izin verdiği karışıklık güvenlik açıklarına yol açabilir.
Kullanımsız güvenlik açıklarını getiren yaygın programlama kalıpları arasında nesne yıkıcılarda uygunsuz temizlik, çok iş parçacıklı uygulamalarda yarış koşulları ve geri arama ağır mimarilerinde karmaşık nesne ömrü yönetimi bulunmaktadır.
Karmaşık ilişkilere ve olay odaklı yaşam döngüsüne sahip çok sayıda nesneyi yöneten Web tarayıcıları, karmaşık JavaScript motorları ve DOM manipülasyon yetenekleri nedeniyle bu güvenlik açıklarına karşı özellikle hassastır.
Ücretsiz güvenlik açığından yararlanmak
Kullanımsız güvenlik açıklarının kullanılması, bellek tahsisçilerinin öngörülebilir davranışından ve hedef uygulamaların belirli bellek düzeni modellerinden yararlanan sofistike teknikler gerektirir.
Saldırganlar tipik olarak, özenle hazırlanmış girdi veya etkileşim dizileri yoluyla güvenlik açığını tetiklemekle başlayan çok aşamalı bir yaklaşım kullanır, ardından istenen sömürü sonuçlarını elde etmek için kesin bellek manipülasyonu sağlar.
Aşağıdaki özlü C kodu, kullanımda olmayan bir güvenlik açığının temel mekanizmasını göstermektedir:

Yığın püskürtme ve bellek düzeni kontrolü Kullanımdan sonraki kullanımda temel tekniği temsil eder. Saldırganlar önce bir hedef nesnenin serbest bırakılmasını tetikler, daha sonra kontrollü nesnelerinden birinin serbest bellek konumunu işgal etme olasılığını artırmak için hemen aynı boyutta çok sayıda nesne tahsis eder.
Yığın püskürtme olarak bilinen bu teknik, saldırganların serbest bırakılan nesneyi hazırlanmış fonksiyon işaretçileri, nesne özellikleri veya diğer sömürülebilir öğeler içeren kötü amaçlı veri yapılarıyla değiştirmesine izin verir.
Gerçek dünya sömürüsü örnekleri bu güvenlik açıklarının ciddiyetini göstermektedir. 2019’da araştırmacılar, Google Chrome FileReader uygulamasında dünya çapında milyonlarca kullanıcıyı etkileyen kullanımı olmayan bir güvenlik açığı olan CVE-2019-5786’yı keşfettiler.
Güvenlik açığı, JavaScript kodu FileReader nesnelerinin yok edilmesini tetiklediğinde gerçekleşirken, eşzamansız dosya işlemleri hala beklemede olurken, geri arama yürütmesi sırasında serbest belleğe erişilebileceği bir pencere oluşturuluyor.
Saldırganlar, serbest bellek içeriğini kontrol etmek için JavaScript yürütmeyi dikkatlice zamanlayarak bu güvenlik açığını kullanarak, nihayetinde tarayıcının oluşturucu işleminde keyfi kod yürütülmesi sağladılar.
Gelişmiş sömürü teknikleri, veri yürütme önleme (DEP) gibi modern güvenlik azaltmalarını ve adres alan düzeni randomizasyonu (ASLR) gibi modern güvenlik azaltmalarını atlamak için iade odaklı programlama (ROP) ve atlama odaklı programlamayı (JOP) içerir.
Saldırganlar, işlev işaretçilerinin veya sanal işlev tablolarının üzerine yazmak için kullanılmayan güvenlik açıklarından yararlanır, program yürütmeyi yürütülebilir bellek bölgeleri gerektirmeden saldırgan kontrollü işlemleri gerçekleştiren dikkatle seçilen öğretim dizilerine yönlendirir.
İşaretçi kimlik doğrulama bypass tekniği, saldırganların daha yeni işlemci güvenlik özelliklerine uyum sağlaması nedeniyle ortaya çıktı.
İşaretçi kimlik doğrulama özelliklerine sahip sistemlerde, saldırganlar otantik işaretçi değerlerini sızdırmak için içermeyen güvenlik açıklarını kullanırlar, daha sonra bu kimliği doğrulanmış işaretçileri, işaretçi bütünlüğü kontrollerini atlamak için sonraki sömürü aşamalarında yeniden kullanırlar.
Kullanımdan sonraki güvenlik açığını azaltmak
Kullanımdan sonraki kullanımdan sonraki güvenlik açıklarının kapsamlı bir şekilde hafifletilmesi, güvenli kodlama uygulamalarını, otomatik algılama araçlarını ve çalışma zamanı koruma mekanizmalarını birleştiren çok katmanlı bir yaklaşım gerektirir.
En etkili stratejiler, ilk tasarımdan dağıtım ve bakım boyunca yazılım geliştirme yaşam döngüsünün birçok aşamasındaki güvenlik açıklarını ele alır.
Aşağıdaki tablo, uygulama yaklaşımı ve etkililikleri ile kategorize edilen hafifletme tekniklerine kapsamlı bir genel bakış sunmaktadır:
Hafifletme kategorisi | Teknik | Tanım | Uygulama aşaması | Verimlilik | Performans Etkisi |
---|---|---|---|---|---|
Statik analiz | Kod İncelemesi | Bellek yönetimi kusurları için kodun manuel olarak incelenmesi | Gelişim | Orta | Hiçbiri |
Statik analiz | Statik analiz araçları | Otomatik Kaynak Kodu Tarama (CLANG Statik Analizör, PVS-Studio) | Gelişim | Yüksek | Hiçbiri |
Dinamik analiz | AdresSanitizer (Asan) | UAF’de derhal çökme ile çalışma zamanı bellek hatası algılama | Test/hata ayıklama | Çok yüksek | Yüksek (2-3x yavaşlama) |
Dinamik analiz | Valgrind Memcheck | Test sırasında kapsamlı bellek hatası algılama | Test | Yüksek | Çok yüksek (10-50x yavaşlama) |
Dinamik analiz | Donanım destekli dezenfektan | Intel MPX, çalışma zamanı algılama için kol belleği etiketleme | Çalışma zamanı | Yüksek | Düşük orta |
Dil çözümleri | Bellek güvenli diller | Pas, Git, Mülkiyet/Borçlama Sistemleri ile Swift | Tasarım | Çok yüksek | Alçaktan Yok |
Dil çözümleri | Yönetilen diller | Java, C#, Python ile çöp koleksiyonu | Tasarım | Çok yüksek | Değişken |
Çalışma Zamanı Koruması | Kontrol Akışı Bütünlüğü (CFI) | Bozulmuş fonksiyon işaretçilerinin kaçırılmasını önler | Çalışma zamanı | Orta | Düşük |
Çalışma Zamanı Koruması | İşaret kimlik doğrulaması | ARM/Intel Donanım İşaretçi İmzası | Çalışma zamanı | Yüksek | Çok düşük |
Çalışma Zamanı Koruması | Stack Kanaryaları | Yığın temelli yolsuzluğun tespiti | Çalışma zamanı | Düşük (UAF’e özgü) | Çok düşük |
Kodlama uygulamaları | İşaretçi Nulifikasyon | İşaretçileri ücretsiz olarak null olarak ayarlama () | Gelişim | Orta | Hiçbiri |
Kodlama uygulamaları | Referans sayımı | Akıllı işaretçiler ve otomatik ömür boyu yönetimi | Gelişim | Yüksek | Düşük |
Kodlama uygulamaları | Nesne Sahiplik Modelleri | Açık sahiplik hiyerarşileri ve RAII kalıpları | Tasarım/Geliştirme | Yüksek | Hiçbiri |
Tahsisatçı tabanlı | Ayıklayıcıları hata ayıklama | Kullanımdan sonra kullanımı tespit eden tahsisatçılar (hata ayıklama CRT, Guard Malloc) | Test/hata ayıklama | Yüksek | Yüksek |
Tahsisatçı tabanlı | Sertleştirilmiş tahsisatçılar | UAF tespiti ile üretim tahsiscileri (Scudo, PartitionAlloc) | Çalışma zamanı | Orta | Düşük orta |
Bellek Güvenliği Araçları ve Statik Analiz Kullanımsız güvenlik açıklarına karşı ilk savunma hattını sağlayın. ADDRAnitizer (ASAN), büyük derleyici araç zincirlerine entegre edilmiş bir çalışma zamanı hatası dedektörü, enstrüman bellek tahsisi ve işleme işlemleri, ortaya çıktıktan hemen sonra kullanılmayan koşulları tespit etmek için.
ASAN, kullanımsız bir erişim tespit ettiğinde, programı sonlandırır ve hem orijinal tahsis hem de hatalı erişim girişimi için yığın izleri de dahil olmak üzere ayrıntılı tanı bilgileri sağlar.
Valgrind MemCheck gibi dinamik analiz araçları, test aşamaları sırasında kapsamlı bellek hatası algılama özellikleri sunar, yalnızca kullanmadan sonraki güvenlik açıklarını değil, aynı zamanda bellek sızıntıları ve arabellek taşmaları gibi ilgili sorunları da tanımlar.
Bu araçlar, tahsis edilen her baytın durumunu izlemek için gölge bellek teknikleri kullanır ve uygunsuz bellek erişim modellerinin kesin tespitini sağlar.
Dil düzeyinde hafifletmeler Bellek güvenliği güvenlik açıklarının tüm sınıflarını ortadan kaldırmak için temel bir yaklaşımı temsil eder. Pas gibi modern programlama dilleri, sahiplik sistemleri aracılığıyla bellek güvenliğini uygular ve kontrolü kontrol ederek, kullanımı olmayan güvenlik açıklarını normal dil yapıları ile tanıtmak imkansız hale getirir.
Benzer şekilde, Java ve C# gibi yönetilen diller manuel bellek yönetimini tamamen ortadan kaldırarak, erken bellek dağıtmayı önlemek için çöp toplama işlemine güvenir.
Çalışma Zamanı Koruma Mekanizmaları Belleksiz dilleri kullanmaya devam etmesi gereken uygulamalar için ek güvenlik katmanları sağlayın. Kontrol Akışı Bütünlüğü (CFI), saldırganların bozuk fonksiyon işaretçileri aracılığıyla program kontrol akışını ele geçirmesini önler ve başarılı olmayan başarılı kullanımın etkisini önemli ölçüde azaltır.
Intel’in Kontrol Akışı Uygulama Teknolojisi (CET) ve ARM’nin işaretçi kimlik doğrulaması gibi donanım destekli çözümler, ortak sömürü tekniklerine karşı işlemci düzeyinde korumalar sağlar.
Güvenli Kodlama Uygulamaları Mevcut kod tabanlarında kullanılmayan güvenlik açıklarını önlemek için gerekli kalır. Bu uygulamalar, belleği serbest bıraktıktan sonra hemen işaretçileri NULL olarak ayarlamak, paylaşılan nesneler için referans sayma sistemleri uygulamak ve belirsiz ömür boyu yönetimini önleyen net nesne sahiplik modellerinin tasarlanmasını içerir. Kod inceleme süreçleri, özellikle geri arama, olay işleyicileri ve çok iş parçacıklı erişimi içeren karmaşık senaryolarda, özellikle bellek yönetimi modellerine odaklanmalıdır.
Kullanımsız güvenlik açıkları, modern yazılım sistemleri için önemli güvenlik riskleri oluşturmaya devam ederek, teknolojik çözümleri disiplinli kalkınma uygulamalarıyla birleştiren kapsamlı azaltma stratejileri gerektirir.
Otomatik algılama araçları ve çalışma zamanı korumaları değerli önlemler sağlarken, temel çözüm bellek güvenli programlama dillerine ve mimarilerine geçişte yatmaktadır.
Eski kod tabanlarını koruyan kuruluşlar, titiz test rejimlerini uygulamalı, çalışma zamanı koruma mekanizmaları dağıtmalı ve bu kalıcı ve gelişen tehditlere karşı sürekli uyanıklık sağlamalıdır.
Sofistike sömürü teknikleri geliştiren saldırganlar ve gelişmiş hafifletmeler uygulayan savunucular arasındaki devam eden silah yarışı, yazılım geliştirme yaşam döngüsü boyunca proaktif güvenlik önlemlerinin kritik öneminin altını çizmektedir.
Bu hikayeyi ilginç bul! Daha fazla güncelleme almak için bizi LinkedIn ve X’te takip edin.