C/C ++ Savunmasında (Bölüm 2)


Büyük güçle harika geliyor sorumluluk

​​​​​Örümcek adam

Serinin bu ikinci bölümüne tekrar hoş geldiniz. İlk bölümde, neden C/C ++ ‘dan uzaklaşmak için öneriler olduğunu inceledik. Bu bölümde, C ve C ++ ‘ın onlarla birlikte getirdiği gerçek risklerin bazılarını nasıl azaltabileceğimizi ve kaldırabileceğimizi inceleyeceğiz.

C ve C ++ arasında farklılıklar var, bu yüzden önerileri bölümlere ayırdım. İlk c, sonra C ++.

Güvenli C Programlama

C’de güvenli programlama, bellek yönetimi, giriş validasyonu ve sistem düzeyinde etkileşimlerle ilgili doğal güvenlik açıkları nedeniyle dikkatli bir dikkat gerektirir. Güvenli C programlama için kapsamlı rehberlik aşağıdadır:

1. Giriş doğrulaması

Her zaman girişleri doğrulayın. Kullanıcı tarafından sağlanan verilere asla güvenmeyin.
İşlemeden önce girişleri uzunluk ve biçim kısıtlamalarına karşı doğrulayın.
Kara liste yerine beyaz liste (izin listeleri) kullanın (Redy Lists).

2. Tampon taşma koruması

Güvensiz olanlar yerine güvenli işlevler kullanın:
O FGets () Over Gets () tercih edin.
O Sprintf () üzerinden snprintf () ‘yi tercih edin.
O Strncpy () (uygun null sonlandırma ile) veya varsa strlcpy () gibi daha güvenli alternatifleri tercih edin.
Diziler ve işaretçilerle uğraşırken sınırları açıkça kontrol edin.

Özellikle güvenli işlevleri kullanma konusu yeni kod yazarken önemlidir, sonraki C standartları tamponları manipüle ederken en berbat hatalardan kaçınabilecek işlevsellik ile birlikte gelir.

3. Bellek Yönetimi

O Bellek sızıntılarından kaçınmak için her zaman bellek tahsislerini (Malloc (), calloc ()) serbest () ile eşleştirin.
O Free () sonra, sarkan işaretçileri önlemek için açıkça işaretçileri null olarak ayarlayın.
O Kullanmadan önce bellek tahsisinin başarılı olduğunu doğrulayın.

Örnek:

4. Derleyici ve güvenlik araçlarının kullanımı

O Uyarılarla (-wall, -wextra) derleyin ve uyarıları hata (-werror) olarak ele alın.
O Derleyici güvenlik bayraklarını kullanın:
O -fstack koruyucu güçlü
O -D_fortify_source = 2
O -pie -fpie (Pozisyon Bağımsız Yürütülebilir Olabilir için)
O ASLR’yi etkinleştir (Adres Alan Düzeni Randomizasyonu)
O Statik analiz ve güvenlik odaklı araçlar çalıştırın (örn., Clang Statik Analizör, Kapak, Valgrind).

GCC’yi kullanan örnek:

GCC -Duvar –WextraTaşfstack-Protector -Strong -d_fortify_source = 2 -o2 -pie –fpieprogram Program.c

Hızlı Güvenlik Kontrol Listesi:

☑ Giriş Doğrulama

☑ Arabellek taşmalarından kaçının

☑ Güvenli Bellek Yönetimi

☑ Tamsayı taşmalarını önleyin

☑ Biçim ipi güvenlik açıklarından kaçının

☑ Güvenli geçici dosyalar

☑ Hata koşullarını açıkça kontrol edin

☑ Güvenli bir şekilde derlemek

☑ Statik/dinamik analiz araçlarıyla test edin

☑ Ayrıcalıkları en aza indirin

Bu kılavuzun ardından, güvenlik açıklarını önemli ölçüde azaltır ve güvenli, sağlam ve güvenilir C programları sağlar, C’de yeni kod yazarken, maalesef, C’nin eski sürümlerinde daha sonraki C standartlarının faydaları olmadan milyonlarca kod satırı vardır.

Güvenli C ++ Programlama

Neyse ki, C ++ ‘da güvenli programlama için daha fazla seçeneğimiz var, çünkü bu dil C’den biraz daha yüksek bir seviyede yer alıyor. C ++’ da güvenli programlama hem dile özgü en iyi uygulamaları hem de genel güvenlik önlemlerini içerir. C ++, C’ye kıyasla güvenliği artırabilecek özellikler sağlar, ancak kötüye kullanım da güvenlik açıkları getirebilir. İşte ayrıntılı rehberlik:

1. Giriş doğrulaması

O Her zaman girdileri doğrulayın ve sterilize edin.
O Verileri işlemeden önce güçlü tip kontrol ve doğrulama kullanın.
O Giriş formatlarını doğrulamak için normal ifadeleri (std :: regex) kullanın.

Örnek:

2. Tampon taşmalarından kaçınmak

O Std :: String, Std :: Vector, Std :: Array ve ham diziler yerine yineleyiciler kullanın.
O C tarzı dizelerden ve güvensiz işlevlerden kaçının (Strcpy, Sprintf).
O Düşük seviyeli diziler kullanılması gerekiyorsa, otomatik sınırlar kontrolü için std :: diziyi tercih edin.

Güvensiz:

Güvenli:

3. Güvenli Bellek Yönetimi

O Manuel yeni ve silme yerine akıllı işaretçiler (STD :: benzersiz_ptr, std :: shared_ptr) kullanarak RAII’yi tercih edin (kaynak edinimi başlatılır).
O Bellek sızıntılarından, sarkan işaretçilerden ve çiftsiz hatalardan kaçının.

Akıllı işaretçiler C ++ 11’den beri C ++ ‘da. Akıllı işaretçilerle ilgili güvenlik faydalarını zorlukla abartabilirim, bu yüzden burada faydalardan birkaç örnek daha ekledim.

C ++ ‘daki akıllı işaretçiler, RAII (kaynak edinimi başlatma) prensibine bağlı olarak otomatik ve daha güvenli bellek yönetimi sağlar. Faydaları şunları içerir:

1. Otomatik bellek yönetimi

O İşaretçi kapsamın dışına çıktığında belleği otomatik olarak işleme koyun.
O Bellek sızıntıları riskini azaltarak açık silme ihtiyacını ortadan kaldırır.

2. Kaynak güvenliği

O Bellek sızıntılarını, sarkan işaretçileri ve çiftsiz sorunları önleyin.
O İstisnalar meydana geldiğinde bile kaynakların uygun şekilde yayınlanmasını sağlayarak güvenilirliği artırın.

3. İstisna Güvenliği

O İstisnalar atılsa bile kaynak temizliğini garanti edin.
O Kodunuzda güçlü istisna güvenlik garantilerini etkinleştirin.

4.

O Mülkiyet modelini açıkça iletin:
O Std :: Benzersiz_ptr: Özel sahiplik, işaretlenemez.
O std :: shared_ptr: referans sayımı yoluyla paylaşılan sahiplik.
O Std :: zayıf_ptr: Sirküler referanslardan kaçınmak için sahip olmayan, işaretçiyi gözlemleme.

5. Basitleştirilmiş Kod

O Daha düşük, daha temiz ve daha okunabilir kod, azaltılmış kaynak plakası nedeniyle.
O Daha az manuel bellek yönetimi mantığı.

6. Azaltılmış bilişsel yük

O Programcılar manuel bellek tahsisi ve dağıtımı izlemek için daha az çaba harcarlar.
O Bellek karmaşıklıkları yerine mantığa ve işlevselliğe odaklanmayı sağlar.

7. Standart kaplarla birlikte çalışabilirlik

O STL kapsayıcıları (STD :: Vector, STD :: MAP, vb.) İle sorunsuz bir şekilde çalışın, genel tutarlılığı artırın.

Akıllı işaretçiler kullanmadan örnek:

Akıllı işaretçilerle örnek:

Güvenli C ++ Programlama için Hızlı Kontrol Listesi:

☑ Her zaman girişi doğrula

☑ RAII ve akıllı işaretçiler kullanın

☑ Güvenli STL Konteyner Yöntemleri

☑ İstisnaları dikkatli ve tutarlı bir şekilde kullanın

☑ Tamsayı taşmalarını önleyin

☑ C tarzı G/Ç üzerinden akışları tercih edin

☑ Güvenli rastgele sayı üreticileri kullanın

☑ Güvenlik bayrakları ve uyarılarla derlen

☑ Statik analiz düzenli olarak kullanın

☑ En az ayrıcalık uygulayın

☑ Tanımlanmamış davranışlardan kaçının

Diğer

Umarım serinin bu kısmı size C ve C ++ için daha sonraki standartlarda daha güvenli kod yazmamıza yardımcı olabilecek özellikler olduğu bilgisini vermiştir. Hem C hem de C ++ için en son standartlar, her ikisi de bunları kullanmanın güvenliği ile ilgili yeni özelliklerle birlikte gelen C23 ve C ++ 23’tür.

C ve C ++ topluluklarında, önümüzdeki yıllarda alakalı kalacaklarsa, C ve C ++ ‘ın güvenli bir şekilde kullanımı daha kolay hale gelmesi gerektiğinin kabulü vardır. Son zamanlarda kayıt memurunda, C ++ ‘nın yaratıcısı Bjarne Stoustrup’un C ++ standardından sorumlu ISO komitesini, son yıllarda gördüğümüz birçok ciddi saldırıya karşı savunmak için dil içinde daha fazla savunmaya öncelik vermesi için çağırdığı bir makale vardı. Bu makaleyi burada bulabilirsiniz: C ++ Yaratıcı ‘ciddi saldırıları’ ele almak için harekete geçme çağrısı • Kayıt. Bu serinin üçüncü ve son bölümünde, C ve C ++ ‘da güvenli kod yazmamıza yardımcı olabilecek bazı araçlara bakacağım.

C/C ++ (Bölüm 2) savunmasındaki görev ilk olarak Siber Güvenlik Dergisi’nde ortaya çıktı.



Source link