"Haftalık Hatalar" Sayı 1: Null Pointer Dereference

Önsöz

Kod denetimi, kaynak koddaki güvenlik açıklarını bulmak için statik analiz kullanma yöntemidir, geliştiricilere veya test uzmanlarına yazılımın güvenlik sorunlarını daha kapsamlı bir şekilde anlamalarına yardımcı olabilir ve sorunları ortaya çıkmadan önleyebilir.Bu nedenle akademi ve endüstri tarafından araştırılmıştır. Bu bir sıcak noktadır ve güvenlik geliştirme yaşam döngüsü SDL ve DevSecOps garanti sistemleri için önemli bir teknik araç haline gelmiştir.

360 Code Guardian ekibi tarafından bağımsız olarak geliştirilen ilk yerli kaynak kodu güvenlik tespiti ticari aracına ve on yıldan fazla süredir biriken güvenlik açığı teknolojisi araştırmalarına dayanan "Haftalık Kusurlar" serisi piyasaya sürüldü. Örnekler ve araç kullanımıyla birlikte her hafta CWE, OWASP ve diğer standartlardaki kusurlara ayrıntılı bir giriş, geliştiricilerin ve güvenlik personelinin çoğu için temel ve standartlaştırılmış kod denetimi öğreticileri sağlamayı amaçlamaktadır.

1. Boş işaretçi farkı

C dili boş göstericisinin değeri NULL'dur. Genellikle NULL işaretçisi işlemin en küçük adresini gösterir, genellikle bu değer 0'dır. Bir boş gösterici aracılığıyla verilere erişmeye çalışmak, çalışma zamanı hatasına neden olur. Bir program boş olmayan olması beklenen ancak gerçekte boş olan bir göstericiye başvurmayı denediğinde, boş işaretçi özümleme hatası oluşur. Bir boş göstericiye başvuruda bulunmak tanımsız davranışa neden olabilir. Pek çok platformda, boş göstericiye başvurunun kaldırılması, programın anormal şekilde sonlandırılmasına veya hizmeti reddetmesine neden olabilir. Örneğin, bir Linux sisteminde bir boş göstericiye erişmek, Segmentasyon hatası hatasına neden olur. Ayrıntılar için bkz. CWEID 476: NULL Pointer Dereference (

İkincisi, boş işaretçi çözümlemesinin zararı

Boş işaretçi özümlemesi, C / C ++ programlarında yaygın bir bellek hatası türüdür.İşaretçi geçersiz bir bellek adresine işaret ettiğinde ve ona başvurduğunda, yazılım sisteminin çökmesine neden olabilecek öngörülemeyen hatalar meydana gelebilir. Boş işaretçi referans hataları, sistem çökmelerine, hizmet reddine ve diğer birçok ciddi sonuca neden olabilir. Ocak-Eylül 2018 arasında, CVE ile ilgili 100'den fazla güvenlik açığı bilgisi bulunmaktadır. 18 Linux çekirdeği güvenlik açığı dahil, bazıları aşağıdaki gibidir:

CVE açıklaması CVE-2018-16517 Netwide Assembler, asm / labels.c dosyasında bir saldırganın hizmet reddi saldırısı gerçekleştirmesine olanak tanıyan boş işaretçi referansına sahiptir. CVE-2018-16517 Netwide Assembler asm / labels.c dosyasında, saldırganların hizmet reddi saldırıları gerçekleştirmesine olanak tanıyan boş işaretçi özendirmesine sahiptir. CVE-2018-16428 GNOME Glib 2.56.1, gmarkup. G_markup_parse_context_end_parse () işlevinde boş bir işaretçi ayrıştırması var. CVE-2018-16329 ImageMagick 7.0.8-8'den önce, MagickCore / property.c'deki GetMagickProperty () işlevinde boş bir işaretçi özendirmesi vardır. CVE-2018-16328 ImageMagick 7.0.8-8'den önce, MagickCore / log.c dosyasındaki CheckEventLogging () işlevinde boş bir işaretçi özendirmesi vardır. Üç, örnek kod

3.1 Arızalı kod

Yukarıdaki örnek kod, tamamlanmamış doğrulama mantığından dolayı, 16. satırda p işaretçisinin boş olmadığını doğrulasa da, 20. satırda foo fonksiyonuna geçirilen p işaretçisi yine de bir boş gösterici olabilir. Bu, boş işaretçi farklılığının ortaya çıkmasına neden olur.

Yukarıdaki örnek kodu test etmek için 360 Code Guard kullanın ve "Null Pointer Dereference" hatası tespit edilebilir ve görüntü seviyesi yüksek . Şekil 1'de gösterildiği gibi:

Şekil 1 Boş işaretçi sapması algılama örneği

3.2 Kodu düzeltin

Yukarıdaki onarım kodunda, p işaretçisinin boş olduğu durum 19. satırda işlenir. P işaretçisi boş olduğunda, npd_check_call_might () işlevi, 23. satırdaki foo işlevine bir boş işaretçi olarak geçirilen p işaretçisinden kaçınarak geri döner. .

Onarılan kodu kontrol etmek için 360 Code Guard'ı kullanın ve "Boş İşaretçi Ayrımı" hatası olmadığını görebilirsiniz. Şekil 2'de gösterildiği gibi:

Şekil 2: Onarımdan sonra test sonucu

4. Açık Kaynak Kod Tespit Planı Projesinin Boş İşaretçi Başvurusu Örneği

Açık kaynak kod test programı, ücretsiz bir kamu refahı programıdır. Açık kaynaklı projelerin kaynak kodu incelemesi ve denetimi için 360 CodeGuard kullanımı sayesinde, kaynak koddaki güvenlik açıklarını bulun ve proje geliştiricileriyle zamanında iletişim kurup onaylayın, böylece açık kaynak projelerin güvenliğini artırın.

Aşağıda, Şekil 3'te gösterildiği gibi, açık kaynak proje algılama planında tespit edilen "boş işaretçi ayrıştırması" örneğidir.

Şekil 3 Açık kaynaklı proje "Boş işaretçi ayrıştırması" na göz atın

4.1 Arızalı kod

Kusurlu kodda, P imleci, 133. satırdaki ibwgetnode (iface) işlevinin dönüş değeri ve 136. satırdaki p- tarafından atanır. > limit = speed;. ibwgetnode (iface) işlevinin uygulanmasının analizi sayesinde, NULL değerinin 162. satırda döndürüldüğünü görebilirsiniz, bu nedenle p- > Limit = hız; işlem sırasında, P daha önce değerlendirilmediğinden boş göstericinin referansı kaldırıldı.

4.2 Onarım kodu

Boş işaretçi çözümleme probleminin önerisine yanıt olarak, geliştirici yakın zamanda ilgili kodu onardı. 139. satırda p referansını kaldırmadan önce, boş göstericiye yapılan referansı anlamaktan kaçınmak için boş olmayan bir karar verilir.

Beş, boş işaretçi sapması nasıl önlenir

Boş işaretçi çözümlemesini önlemek için, kod yazma işlemi sırasında aşağıdaki gibi iyi programlama alışkanlıkları geliştirmek gerekir:

Boş göstericinin referansının kaldırılmasını önlemek için, işaretçinin kullanımdan önce sağlamlığının kontrol edilmesi gerekir;

Çağıran işlevin dönüş değeri boş olabileceği zaman, boş işaretçi çözümlemesini önlemek için işlev dönüş değerinin boş olmayan doğrulama olması gerekir;

İşaretçinin işaret ettiği boşluğu serbest bıraktıktan sonra, işaretçinin değerinin boş olarak atanması gerekir;

İstisnanın doğru şekilde işlendiğinden emin olun.

* Yazar: Code 360 koruma ekibi, lütfen FreeBuf.COM'dan belirtin.

3 milyar Tencent kulübüne "Gezici Dünya" indi, Çin'in bilim kurgu yolculuğuna yardım ediyor
önceki
Tüketim türü orta koridor oyuncusu Xiao Qiao, etrafta dolaşmak ekibin özünü tüketir
Sonraki
SUV ne kadar sıcak? Cenevre Otomobil Fuarı'ndaki ilk birkaç modele bakın.
Ağlamaya bak! "Bir Öpücük" Lin Yun'un koşup ağladığını ortaya çıkarır Seyirci: Bir Öpücük, başka bir "Kızlığım" dır.
Gökten düşen Lu Bu bu bölgeyi ele geçirdi.
Grand Cherokee Trailhawk, Nisan ayında Çin'de görücüye çıktı
Yerel performanstan sorumlu mu? Nubia Z17S / Huawei Mate 10 Pro performans karşılaştırması
Cesurlara veda olarak "Sabah ve Akşam Yemini", gözyaşı sarsan sözler "hayat ayrılığını" erteliyor
Ani forvet Li Yuanfang, ormancı ve kadro
"Vahşi" size off-road deneyimi gösterir Changan CS952.0T
Baidu Vision ekibi, ECCV Google AI hedef tespit yarışması şampiyonunu kazandı, kazanan planın tam yorumu ECCV 2018
Lanling'in görünmez kralı, bekar, son derece güçlü suikastçı kahramanını öldürür
"Alita: Savaş Meleği" "memleket" e geri dönüyor, orijinal yazar Crazy Amway, Japonya galası yüksek enerjiyle dolu
Taşıma limiti oldukça yüksek test Dongfeng Peugeot 3081.2T
To Top