C’de güvenli kodlama: sık yapılan hatalar
C’de güvenlik açığına dönüşen hataları savunmacı gözle tanır, kod incelemesinde yakalar, derleyici korumaları ve bulanıklaştırmayla önlersin.
Seviye 401 · 21 ders · 18 pratik lab
Dersler
Bellek güvenliği hataları
- Yığın taşması: sınırsız kopyalamanın bedeli
- Bir fazla yazmak: off-by-one ve sonlandırıcı
- Öbek taşması ve komşu verinin bozulması
- Serbest bıraktıktan sonra kullanım
- İlklenmemiş bellek ve bilgi sızıntısı
- Kısa görev: kod incelemesinde bellek hatalarını işaretle
Mantık ve tür hataları
- Tamsayı sarması ve küçük ayrılan tampon
- İşaretli ve işaretsiz karşılaştırma tuzakları
- Biçim dizgisi hataları ve %n
- Denetle-sonra-kullan yarışları: access ve open
- Ortam değişkenlerine ve PATH’e güvenmek
- system() ve popen ile komut enjeksiyonu
- Kısa görev: yetkili bir yardımcı programı incele
Önleme ve doğrulama
- Güvenli API seçimi ve yasaklı işlevler listesi
- Derleyici korumaları: FORTIFY_SOURCE, yığın koruyucu, PIE
- libFuzzer ile ayrıştırıcıyı bulanıklaştırmak
- AFL++ ile kara kutu bulanıklaştırma
- Çökmeleri ayıklamak: küçültme ve kök neden
- Güvenli kod inceleme listesi ve hata raporu yazmak
- Kısa görev: bulanıklaştırıcının bulduğu hatayı düzelt
Bitirme
- Bitirme görevi: güvensiz bir ayrıştırıcıyı denetle, düzelt ve bulanıklaştır
Pratik lablar
- Selamlama fonksiyonunda taşmayı kapatmak: Kullanıcı adını sabit tampona strcpy ile kopyalayan fonksiyonu sınır denetimli hale getir ve uzun adlarla test et.
- Sonlandırıcı için yer açmak: strncpy sonrası \0 eklemeyi unutan ve bir bayt taşan kodu düzelt; ASan temiz rapor versin.
- Komşu yapıyı bozan heap taşması: Not alanına fazla yazıp yanındaki yetki bayrağını bozan kodu bul, sınır kontrolüyle düzelt ve regresyon testi ekle.
- Oturum nesnesinde serbest bıraktıktan sonra kullanım: Çıkış yapılan oturumun işaretçisini tutmaya devam eden kodu sahiplik kurallarıyla düzelt; ASan ve testler temiz geçsin.
- Başlatılmamış bellekten bilgi sızıntısı: Yanıt yapısının dolgu baytlarıyla birlikte ağa gönderildiği kodu bul ve sızıntıyı memset ve alan alan yazmayla kapat.
- Uzunluk toplamında taşmayı yakalamak: İki uzunluğu toplayıp bellek ayıran koda taşma kontrolü ekle ve sınır değerli testleri geçir.
- İşaretli-işaretsiz karşılaştırma tuzağı: -1 uzunluğun büyük bir sayıya dönüşüp kontrolü atlattığı kodu düzelt ve -Wsign-compare uyarılarını temizle.
- Denetim günlüğünde biçim dizgisini kapatmak: Kullanıcı girdisini syslog'a biçim olarak veren denetim kodunu düzelt ve -Wformat-security ile doğrula.
- Daraltan tür dönüşümünü bulmak: size_t uzunluğu unsigned short'a atayan ve küçük tampon ayıran ayrıştırıcıyı düzelt; dev girdilerle test et.
- access sonrası open yarışını kapatmak: access ile kontrol edip sonra open çağıran kodu O_NOFOLLOW ve fstat kontrolüyle yeniden yaz.
- system() çağrısını execv ile değiştirmek: Dosya adını system() ile kabuğa veren yedekleme yardımcısını fork ve execv ile yeniden yaz; ; ve $() içeren adlar zararsız kalsın.
- Ayrıcalıklı yardımcıda ortamı temizlemek: PATH ve LD_ değişkenlerine güvenen ayrıcalıklı yardımcıya güvenli ortam kurma ve tam yol kullanma ekle.
- popen kullanan kodu incelemek: popen ile kullanıcı girdisi çalıştıran bir tanı aracını incele, riskleri raporla ve kabuksuz bir çözüm uygula.
- Yasaklı fonksiyon listesini uygulamak: Projede gets, strcpy ve sprintf kullanımını derlemede hata veren bir başlıkla yasakla ve kalan çağrıları değiştir.
- Koruma bayraklarının etkisini görmek: Aynı taşmalı programı _FORTIFY_SOURCE ve stack protector ile derleyip çalışma anı tepkisini karşılaştır ve raporla.
- Tarih ayrıştırıcısını libFuzzer ile denemek: Bir tarih ayrıştırıcısı için libFuzzer hedefi yaz, ASan ile çalıştır ve bulunan ilk hatayı düzelt.
- AFL++ çökmelerini ayıklamak: AFL++'ın bulduğu on çökmeyi küçült, aynı kök nedenden gelenleri grupla ve her grup için kısa bir hata raporu yaz.
- Kontrol listesiyle kod incelemesi: Poyrazlı Enerji'nin sayaç okuma modülünü güvenli kod kontrol listesiyle incele ve bulduğun iki hatayı testleriyle düzelt.
Kurs hakkında
C’de güvenlik açığına dönüşen hataları savunmacı gözle tanır, kod incelemesinde yakalar, derleyici korumaları ve bulanıklaştırmayla önlersin.
Ne öğreneceksin
- Bellek güvenliği hataları
- Mantık ve tür hataları
- Önleme ve doğrulama
- Bitirme
Ön koşullar
Aynı yolun 301 düzeyine kadar olan konularını uygulamış olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 401 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.