Arabellek Taşmalarını Önleme

Arabellek taşması en yaygın güvenlik riski kaynaklarından biridir. Arabellek taşması, esasen denetlenmeyen dış girdinin güvenilir veri olarak ele alınmasından kaynaklanır. CopyMemory, strcat,strcpy veyawcscpy gibi işlemleri kullanarak bu verileri kopyalama eylemi, sistem bozulmasına olanak tanıyan, tahmin edilmeyen sonuçlar oluşturabilir. En iyi durumlarda uygulamanız çekirdek dökümü, segmentasyon hatası veya erişim ihlali ile durdurulacaktır. En kötü durumda, bir saldırgan sürecinize başka kötü amaçlı kod ekleyip çalıştırarak arabellek taşmasından yararlanabilir. Denetlenmemiş giriş verilerinin yığın tabanlı bir arabelleğe kopyalanması, istismar edilebilir açıkların en yaygın nedenidir.

Warning

Güvenlik duyarlı kodda hiçbir zaman ilişkisiz dize işlevlerini (strcpy, strcat, sprintf, gets) kullanmayın. Bunları StringCbCopy sınırlanmış eşdeğerleriyle (StringCbCat, StringCbPrintf, ) değiştirin veya C11 _s soneki değişkenlerini (strcpy_s, strcat_s) kullanın.

Arabellek aşımı çeşitli şekillerde gerçekleşebilir. Aşağıdaki liste, birkaç arabellek taşması durumu türüne kısa bir giriş sağlar ve yeni riskler oluşturmaktan kaçınmanıza ve var olan riskleri azaltmanıza yardımcı olacak bazı fikirler ve kaynaklar sunar:

Statik arabellek aşımları

Statik arabellek taşması, yığında tanımlanmış bir arabelleğe barındırması için ayrıldığından daha fazla veri yazıldığında oluşur. Bu hatanın daha az görünür olan sürümleri, onaylanmamış kullanıcı giriş verileri doğrudan statik bir değişkene kopyalandığında oluşur ve bu da olası yığın bozulmasına neden olur.

Yığın taşmaları

Statik arabellek taşmaları gibi yığın taşması bellek ve yığın bozulmasına neden olabilir. Yığın taşmaları stack üzerinde değil, heap belleğinde meydana geldiğinden, bazı kişiler bunların ciddi sorunlara yol açma olasılığının daha düşük olduğunu düşünür; bununla birlikte, yığın taşmaları programlamada gerçekten dikkat gerektirir ve statik arabellek taşmaları kadar sistem risklerine yol açabilir.

Dizi dizin oluşturma hataları

Dizi dizin oluşturma hataları da bellek taşmalarının kaynağıdır. Dikkatli sınır denetimi ve dizin yönetimi, bu tür bellek taşmasını önlemeye yardımcı olur.

Arabellek taşmalarını önlemenin temel yolu iyi kod yazmaktır. Her zaman tüm girdilerinizi doğrulayın ve gerektiğinde uygun şekilde hata verin. Güvenli kod yazma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

  • Maguire, Steve [1993], Writing Solid Code, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
  • Howard, Michael and LeBlanc, David [2003], Writing Secure Code, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.

Note

Bu kaynaklar bazı dillerde ve ülkelerde kullanılamayabilir.

 

Güvenli dize işleme, hem iyi programlama uygulamalarının izlenmesiyle hem de mevcut sistemlerde güvenli dize işleme işlevlerinin kullanılması ve bu işlevlerin mevcut sistemlere sonradan uyarlanmasıyla ele alınmaya devam edilen, uzun süredir var olan bir sorundur. Windows kabuğundaki böyle bir işlev kümesi örneği StringCbCat ile başlar.

Derleyici ve bağlayıcı azaltmaları

Microsoft C/C++ derleyicisi ve bağlayıcısının modern sürümleri, arabellek taşmalarına karşı birden çok savunma katmanı sağlar. Bu korumaları üretim derlemelerinde her zaman etkinleştirin:

Flag Purpose
/GS Yığın arabellek taşması algılama özelliği (varsayılan olarak etkin). İade adreslerinin önüne güvenlik tanımlama bilgileri ekler.
/sdl /GS için daha katı davranışlar ve değişken başlatma dahil olmak üzere ek güvenlik denetimlerini etkinleştirir.
/DYNAMICBASE Adres Alanı Düzeni Rastgele Seçme (ASLR). Yararlanmayı zorlaştırmak için yük adreslerini rastgele hale getirir.
/NXCOMPAT Veri Yürütme Engellemesi (DEP). Bellek sayfalarını yürütülemeyen olarak işaretler.
/CETCOMPAT Donanım destekli gölge yığınlar için Intel Kontrol Akışı Zorlama Teknolojisi (CET).
/guard:cf Denetim Akış Koruyucusu (CFG). Çalışma zamanında dolaylı çağrı hedeflerini doğrular.

Important

Tüm yeni kodlar için en az /sdl ve /GS ile derleyin. Güvenlik açısından kritik uygulamalar için, CET’i destekleyen donanımı hedeflerken /guard:cf seçeneğini de etkinleştirin ve /CETCOMPAT ile bağlayın.

Çalışma zamanı çözümleme araçları

Üretime ulaşmadan önce bellek güvenliği sorunlarını algılamak için geliştirme ve test sırasında bu araçları kullanın:

  • AddressSanitizer (ASan): Çalışma zamanında arabellek taşmalarını, serbest bırakma sonrası kullanımı ve diğer bellek hatalarını algılamak için /fsanitize=address ile derleyin. Visual Studio 2019 16.9 ve sonraki sürümlerde kullanılabilir.
  • Uygulama Doğrulayıcı: Yığın bozulmalarını algılar, kötüye kullanımı ve diğer yaygın programlama hatalarını işler.
  • Statik Çözümleme (/analyze): Yerleşik statik çözümleyici, arabellek taşmalarını, başlatılmamış değişkenleri ve derleme zamanındaki diğer sorunları algılar.