Güvenlik Açıkları ve İstismar
Güvenlik açıkları, yazılımlardaki güvenlik varsayımlarını ihlal eden kusurlardır; istismar ise bu tür bir kusuru, veri sızıntısından tam kod yürütmeye kadar, saldırganın kontrolündeki bir davranışa dönüştürme sanatıdır.
Tanım
Güvenlik açığı, bir saldırganın sistemin güvenlik politikasını ihlal etmek için kullanabileceği bir zayıflıktır; istismar ise belirli bir güvenlik açığından yararlanarak yetkisiz etkiler elde eden bir teknik veya programdır.
Kapsam
Bu konu, başlıca güvenlik açığı sınıflarını — bellek bozulması hataları (arabellek taşmaları (buffer overflows), serbest bırakma sonrası kullanım (use-after-free)), enjeksiyon, tamsayı hataları ve mantık kusurları — ve bunları istismar etme tekniklerini, kontrol akışı ele geçirme (control-flow hijacking) ve dönüş odaklı programlama (return-oriented programming) dahil olmak üzere kapsamaktadır. Ayrıca, istismar maliyetini artıran hafifletici önlemleri (ASLR, DEP/NX, yığın kanaryaları (stack canaries), kontrol akışı bütünlüğü (control-flow integrity)) da içermektedir. Güvenli geliştirme uygulamaları ve web'e özgü güvenlik açıkları, ilgili diğer konularda ele alındığından bu kapsamın dışındadır.
Temel sorular
- Yazılım kusurlarının hangi kategorileri istismar edilebilir güvenlik açıkları oluşturur?
- Bir bellek bozulması hatası, bir program üzerinde nasıl kontrole dönüştürülür?
- Dönüş odaklı programlama nedir ve neden basit savunmaları aşar?
- ASLR, DEP ve yığın kanaryaları gibi hafifletici önlemler istismar çıtasını nasıl yükseltir?
- İstismar ve hafifletme arasındaki 'silahlanma yarışı' neden devam etmektedir?
Anahtar kavramlar
- arabellek taşması (buffer overflow)
- serbest bırakma sonrası kullanım (use-after-free)
- tamsayı taşması (integer overflow)
- enjeksiyon
- kontrol akışı ele geçirme (control-flow hijacking)
- dönüş odaklı programlama (return-oriented programming)
- shellcode
- ASLR, DEP/NX, yığın kanaryaları (stack canaries)
- kontrol akışı bütünlüğü (control-flow integrity)
Temel kuramlar
- Kontrol akışı ele geçirme (Control-flow hijacking)
- Birçok istismar, yürütmeyi saldırgan tarafından seçilen koda yönlendirmek için bir kod işaretçisini (dönüş adresi veya fonksiyon işaretçisi gibi) bozar; bunun tipik örneği, kaydedilmiş bir dönüş adresinin üzerine yazan yığın arabellek taşmasıdır (stack buffer overflow).
- Hafifletici önlemler ve istismar silahlanma yarışı
- Yürütülemez bellek, adres alanı düzeni rastgeleleştirmesi (ASLR), yığın kanaryaları (stack canaries) ve kontrol akışı bütünlüğü (control-flow integrity) gibi savunmaların her biri belirli bir teknik sınıfını engellemekte ve sürekli bir tırmanışla yeni saldırıları (dönüş odaklı programlama, bilgi sızıntıları) tetiklemektedir.
Mekanizmalar
Klasik bir yığın taşması (stack overflow), bir arabelleğin sınırlarını aşarak yazma yapar ve kaydedilmiş dönüş adresini (return address) üzerine yazar, böylece fonksiyon geri döndüğünde yürütme saldırgan tarafından sağlanan shellcode'a atlar. Hafifletici önlemler bunu bozdu: yürütülemez bellek (DEP/NX) enjekte edilen kodun çalışmasını durdurdu ve mevcut kod parçalarını zincirleyen dönüş odaklı programlamayı tetikledi; adres alanı düzeni rastgeleleştirmesi (address-space layout randomization - ASLR) hedef adresleri gizledi ve bunu aşmak için bilgi sızıntısı ilkellerini (information-leak primitives) tetikledi. Kontrol akışı bütünlüğü (control-flow integrity) ve bellek açısından güvenli diller (memory-safe languages) bu sınıfları tamamen kapatmayı hedeflemektedir.
Klinik önem
İstismar edilebilir güvenlik açıkları, gerçek saldırıların hammaddesidir: bellek güvenliği hataları, büyük tarayıcılar ve işletim sistemlerindeki kritik güvenlik açıklarının çoğunluğunu oluşturmaktadır, sıfır gün istismarları (zero-day exploits) casusluk ve suç faaliyetlerinde satın alınmakta, satılmakta ve kullanılmaktadır ve bu disiplin, savunma mühendisliğini, sorumlu açıklamayı (responsible disclosure), hata ödüllerini (bug bounties) ve Rust gibi bellek açısından güvenli dillere yönelimi teşvik etmektedir.
Kanıt ve kılavuzlar
Güvenlik açığı sınıfları MITRE'nin CWE'sinde kataloglanmakta ve CVSS ciddiyet puanlarıyla CVE'ler olarak ayrı ayrı takip edilmektedir. Büyük satıcıların (Microsoft, Google) yaptığı çalışmalar, ciddi güvenlik açıklarının yaklaşık %70'inin bellek güvensizliğinden kaynaklandığını bildirmektedir; bu da bellek açısından güvenli dillere yönelik rehberliği ve modern platformlarda hafifletici önlemlerin (ASLR, CFI) varsayılan olarak dağıtılmasını teşvik etmektedir.
Tarihçe
İstismar, 1988 Morris solucanının arabellek taşması (buffer overflow) ile kamuoyunun dikkatini çekmiş ve Aleph One'ın 1996 tarihli 'Smashing the Stack for Fun and Profit' adlı çalışmasıyla sistemleştirilmiştir. Her savunma bir tepkiyi tetiklemiştir: DEP, return-into-libc'ye ve Shacham'ın dönüş odaklı programlamasına (2007) yol açmıştır; ASLR ise sızıntı tabanlı atlatmalara neden olmuştur. 2013 tarihli 'Eternal War in Memory' araştırması, hem yeni hafifletici önlemleri hem de bellek açısından güvenli dillerin benimsenmesini yönlendirmeye devam eden süregelen silahlanma yarışını çerçevelemiştir.
Öne çıkan isimler
- Elias Levy (Aleph One)
- Hovav Shacham
- Dawn Song
- Ross Anderson
- Halvar Flake
İlgili konular
Temel eserler
- aleph1996
- szekeres2013
- anderson2020
Sıkça sorulan sorular
- Sıfır gün güvenlik açığı (zero-day vulnerability) nedir?
- Sıfır gün, yazılımın savunucuları tarafından bilinmeyen (ve yamalanmamış) ve istismar edildiği anda savunmacılara hazırlanmak için sıfır gün tanıyan bir güvenlik açığıdır. Bu tür kusurlar, henüz bir düzeltme veya imza mevcut olmadığı için saldırganlar için özellikle değerlidir.
- Bellek açısından güvenli diller (memory-safe languages) neden bir çözüm olarak teşvik edilmektedir?
- Bellek açısından güvenli diller (Rust gibi), derleme veya çalışma zamanında arabellek taşmaları (buffer overflows), serbest bırakma sonrası kullanım (use-after-free) gibi tüm hata sınıflarını önleyerek, her birini istismar etmeyi zorlaştırmak yerine ciddi güvenlik açıklarının en yaygın kaynağını ortadan kaldırmaktadır.