Yeterince gelişmiş herhangi bir hata, bir özellikten ayırt edilemez
Zengin Eğitim
2023’ün sonunda ve 2024’ün başlarında, NSA ve Beyaz Saray sırasıyla hafıza güvenliği endişeleri nedeniyle C ve C ++ ‘dan Rust lehine uzaklaşmak için önerilerle çıktı. Bu önerilerin bağlantılarını bu makalenin sonunda bulabilirsiniz. Bu önerilerin iyi nedenleri vardır, ancak C/C ++ ile kalmanın iyi nedenleri de vardır. Bu, NSA ve Beyaz Saray’ın önerilerinin arkasındaki nedenlere odaklanacağım üç bölümlük bir dizi olacak. Bir sonraki, C/C ++ kullanırken bazı, çok gerçek riskten bazılarını azaltmak ve kaldırmak için neler yapabileceğimize odaklanacaktır. Son makale, C ve C ++ ‘da programlama yaparken bizim için mevcut olan bazı araçlara bakacaktır.
Bu pas bashing makalesi olmayacak, çünkü bu dil hakkında bilinçli bir görüşe sahip olmak için yeterli pas bilgim yok. Bununla birlikte, en sevdiğim dillerden bazıları olduğu için C/C ++ hakkında oldukça fazla bilgim var, bu nedenle bu makale bunları savunuyor.
Tıpkı bir başkanlık gibi, takip etmek için bazı programlar bilmeniz gerekecek! Mutlaka C/C ++ programlama değil, bazı programlama bilgisi size büyük ölçüde fayda sağlayacaktır.
C ve C ++ her ikisi de, güçlü bir özellik olabilen, aynı zamanda bir dizi bellek güvenliği endişesine yol açan bellek üzerinde düşük seviyeli kontrol sağlar. C ++, belleğin daha güvenli bir şekilde yönetilmesine yardımcı olmak için ek araçlar (RAII, referanslar, akıllı işaretçiler ve kaplar gibi) sunsa da, geliştiriciler ham işaretçiler veya manuel bellek yönetimi kullanıyorsa C ++ ile ilgili temel sorunların çoğu hala alakalıdır. Aşağıda en yaygın endişelerden bazıları:
1. Tampon taşıyor
Nedir? Bir dizinin veya arabelleğin tahsis edilen sınırlarının ötesinde yazmak veya okumak.
Neden önemlidir: Bu, bitişik belleğin üzerine yazabilir, yozlaşmış verilerin veya saldırganların kötü niyetli kod enjekte etmesine izin verebilir.
C ve C ++:
O Her iki dilde de dizi ve işaretçi aritmetik otomatik sınır kontrolü içermez.
O Strcpy, sprintf veya memcpy gibi işlevler dikkatli kullanılmadığı takdirde taşmalara neden olabilir.
C ++ kodunda bunun bir örneğini görelim:
Tampon, NULL Terminator (‘\ 0’) dahil olmak üzere 10 karakter için boşluğa sahiptir, ancak “12345678910” 11 karakter uzunluğundadır (artı NULL Terminator).
Bu, bir arabellek taşmasına neden olur, bitişik belleğin bozulmasına neden olur ve bu bitişik bellekte ne olabileceğini bilmiyoruz, belki de hiçbir şey, aynı zamanda işletim sistemindeki kritik bir süreç tarafından kullanılan bellek de olabilir. En kötü senaryoda, bir saldırgana yüksek seviyeli erişim sağlayacaktır ☹
2. işaretçi ve referans tuzakları
Sarkan işaretçiler / referanslar
O Nedir? Bir işaretçi veya referans belleğe zaten serbest bırakılmış veya kapsam dışına çıkmış olduğunda ortaya çıkar.
O Neden Önemlidir: Bu tür işaretçilerin dereflenmesi tanımlanmamış davranışla sonuçlanır (çökebilir, verileri bozabilir).
Bundan sonra kullanım
O Nedir? Belleğin serbest bırakıldıktan sonra erişildiği belirli bir sarkan işaretçi türü.
O Neden önemlidir: Beklenmedik davranışlara, çökmelere veya güvenlik istismarlarına yol açabilir.
NULL POINTER DEREFERENCING
O Nedir? NULL (C’de) veya NULLPTR (C ++) olarak ayarlanan bir işaretçi aracılığıyla belleğe erişme.
O Neden Önemlidir: Tipik olarak bir çökmeye neden olur (segmentasyon hatası)
C ++ kodu kullanan başka bir örnek:
PTR’yi sildikten sonra, herhangi bir PTR’ye erişen PTR tanımsız davranıştır.
Yaygın bir öneri, PTR’yi sildikten hemen sonra PTR = NULLPTR’yi ayarlamaktır (yine de yanlışlıkla erişiyorsanız mantık hatasını düzeltmez).
Bunlar, C/C ++ ‘yı uygunsuz bir şekilde kullanırken ortaya çıkabilecek birçok potansiyel bellek sorununun alt kümeleridir.
Daha önce de belirtildiği gibi, bellek sorunları NSA ve Beyaz Saray’ın önerilerinin mantığıdır. C/C ++ programlama dillerinin doğasında bulunan başka riskler de vardır. Yine, aşağıdaki liste sadece bir alt kümedir.
1. Tamsayı taşıyor ve alt akıyor
• Nedir?
O Aritmetik operasyonlar belirli bir tamsayı türünün aralığını aştığında, değer etrafa sarılabilir (taşma) veya beklenmedik bir şekilde büyük olabilir (alt akış).
O İmzalı tamsayılar için bu tanımlanmamış davranışa yol açar; İmzasız tamsayılar için, iyi tanımlanmış modulo aritmetiğe (ancak yine de potansiyel olarak tehlikeli) yol açar.
• Neden önemli:
O Saldırganlar, kontrolleri atlamak için tamsayı taşımalarından yararlanabilir (örn. Bellek tahsisi öncesi boyut hesaplamaları).
O Bu, yanlış boyutlandırılmış tamponlara neden olabilir, bu da sonraki arabellek taşmalarına veya diğer güvenlik açıklarına yol açar.
2. Komut enjeksiyonu ve güvensiz sistem çağrıları
• Nedir?
O Güvenilmeyen verilerle System (), Popen () veya Exec*() Aile çağrılarını kullanmak, kabuk komut enjeksiyonlarının kapısını açabilir.
O Saldırganlar ek kabuk komutları ekleyebilir veya yolları değiştirebilir.
• Neden önemli:
O Bu, saldırganlara sistemde keyfi kod çalıştırma veya ayrıcalıkları artırma yeteneği verebilir.
Başka bir örneğe bakalım:
Bir saldırgan onu nasıl kullanabilir
Kullanıcı girerse myFile.txt; RM -rf /kabuğa aktarılan gerçek komut:
Bu önce MyFile.txt’i görüntülemeye çalışır ve ardından RM -RF /çalıştırmaya çalışır, sistemdeki tüm dosyaları potansiyel olarak siler (Linux /Unix sistemindeki kök gibi uygun ayrıcalıklarla çalıştırılırsa).
Tüm bu sorunlarla neden C/C ++ kullanıyoruz? Uzun yıllar boyunca, bunlar sahip olduğumuz dillerdi, bu yüzden orada C/C ++ ‘da milyarlarca kod satır var, daha fazla günlük ekleniyor. Bunun da ötesinde, bu diller, yürütülürken, diğer birçok dilin aksine hızlıdır, çünkü bunlar donanımda yerel olarak çalışan yerel makine koduna derlenir.
Oyunlar genellikle bu nedenle C ++ kullanılarak geliştirilir, ancak hem Linux hem de Windows için cihaz sürücüleri, yürütme hızı nedeniyle C/C ++ kullanılarak da geliştirilir. Yetkililerden gelen artan odaklanma nedeniyle, C/C ++ topluluğundan, güvensiz bir şekilde kullanılmasını zorlaştıracak dillere özellikler uygulama konusundaki artan bir odak vardır.
Bu serinin ikinci bölümünde sizinle bazı bağlantıları, bu çabalarla ilgili bazı topluluk çabaları ve videoları paylaşacağım.
- NSA, nasıl yapılacağı konusunda rehberlik Karşı korumak Yazılım Bellek Güvenliği Sorunları> Ulusal Güvenlik Ajansı/Merkezi Güvenlik Hizmeti> Makale
- Beyaz Saray www.whitehouse.gov