C++’ta güvenli kodlama: sık yapılan hatalar
C++’ta ömür, tür ve sınır hatalarının nasıl güvenlik açığına dönüştüğünü savunmacı gözle öğrenir, kılavuzlar, sertleştirme ve bulanıklaştırmayla önlersin.
Seviye 401 · 19 ders · 15 pratik lab
Dersler
Bellek ve ömür hataları
- operator[] ile at(): sınır denetimi
- Sarkan başvurular: string_view, lambda ve dönüş değeri
- İteratör geçersizleşmesinin güvenlik sonucu
- Taşındıktan sonra kullanım
- Akıllı işaretçi tuzakları: döngüler ve get()
- Kısa görev: kod incelemesinde ömür hatalarını bul
Tür ve mantık hataları
- Daraltan dönüşümler ve tamsayı taşması
- Güvensiz dönüşümler: reinterpret_cast ve C türü dönüşüm
- İstisna güvenliği garantileri
- C mirası API’ler: memcpy, sprintf ve char dizileri
- Güvenilmeyen girdiyi ayrıştırmak: from_chars ve sınırlar
- Gizli verileri bellekte tutmak ve silmek
- Kısa görev: ağdan veri okuyan sınıfı incele
Önleme
- C++ Core Guidelines ve GSL
- Sertleştirilmiş standart kütüphane kipleri ve derleyici bayrakları
- libFuzzer ile bir C++ sınıfını bulanıklaştırmak
- Güvenlik odaklı statik analiz
- Kısa görev: bulanıklaştır, düzelt, regresyon testi ekle
Bitirme
- Bitirme görevi: bir C++ servisinin güvenli kod incelemesi ve düzeltmesi
Pratik lablar
- Denetimsiz indis erişimini kapatmak: Kullanıcıdan gelen indisle operator[] kullanan menü kodunu sınır denetimli hale getir ve geçersiz indiste anlaşılır hata döndür.
- Geçici dizgiye bakan görünümü düzeltmek: Geçici std::string'e string_view döndüren ve ara sıra çöp gösteren başlık işlevini ömür hatasını gidererek düzelt; ASan testini geç.
- Kod incelemesinde beş ömür hatası bulmak: Küçük bir oturum yöneticisinde sarkan başvuru, geçersiz yineleyici, taşıma sonrası kullanım ve get() ile alınan işaretçi hatalarını bul, onar ve her birine test ekle.
- Daraltan dönüşümü yakalamak: size_t uzunluğu 16 bitlik alana sessizce kırpan başlık yazıcısına aralık denetimi ekle ve büyük girdide hata döndür.
- Görüntü tamponu boyutunda taşmayı önlemek: Genişlik ile yüksekliği çarparak tampon ayıran görüntü yükleyicide taşmayı denetle; UBSan ve büyük boyut testlerini geç.
- Güvensiz dönüşümlü ayrıştırıcıyı yeniden yazmak: Ağ baytlarını reinterpret_cast ile yapıya çeviren ayrıştırıcıyı hizalama ve bayt sırası sorunlarından arındırıp memcpy ve açık alan okumayla yeniden yaz.
- sprintf kullanımını güvenli biçimlendirmeye çevirmek: Sabit boyutlu char dizisine sprintf ile yazan kayıt işlevini std::string ve std::format ile değiştir.
- Güvenilmeyen sayıyı from_chars ile ayrıştırmak: atoi ile okunan port ve boyut değerlerini from_chars ile ayrıştır; artık karakteri, taşmayı ve aralık dışını ayrı hatalarla reddet.
- Ağ verisi okuyan sınıfı incelemek: Uzunluk alanına güvenip memcpy yapan ileti okuyucusunda tüm sınır ve durum hatalarını bul, span tabanlı okuyucuyla değiştir ve bozuk ileti testlerini geç.
- Parola tamponunu iş bitince silmek: Parolayı tutan tamponu kapsam sonunda derleyicinin eleyemeyeceği biçimde sıfırlayan bir koruyucu sınıf yaz.
- Güncellemeye güçlü istisna güvencesi kazandırmak: Yarıda istisna çıkınca tutarsız kalan kayıt güncellemesini kopyala ve değiştir yaklaşımıyla düzelt; hata enjekte eden testte durumun değişmediğini göster.
- Akıllı işaretçi tuzaklarını temizlemek: Aynı ham işaretçiden iki shared_ptr kuran, get() sonucunu saklayan ve döngüyle sızdıran abonelik kodunu düzelt; ASan ve sızıntı denetimi temiz çıkmalı.
- Sertleştirme bayraklarıyla derlemek: Derleme betiğine sertleştirilmiş standart kitaplık kipini ve koruma bayraklarını ekle; sınır aşımı testinin artık denetimli sonlandığını göster.
- Arayüzleri GSL türleriyle sıkılaştırmak: İşaretçi ve uzunluk çifti alan işlevleri span ve not_null ile yeniden tanımla; statik çözümleme bulgularının kapandığını göster.
- Adres ayrıştırıcısını fuzz edip onarmak: Kendi adres ayrıştırıcı sınıfın için libFuzzer koşumu yaz, bulunan çökmeleri onar ve çökme girdilerini regresyon testi olarak ekle.
Kurs hakkında
C++’ta ömür, tür ve sınır hatalarının nasıl güvenlik açığına dönüştüğünü savunmacı gözle öğrenir, kılavuzlar, sertleştirme ve bulanıklaştırmayla önlersin.
Ne öğreneceksin
- Bellek ve ömür hataları
- Tür ve mantık hataları
- Önleme
- 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.