簡析CWE-476:NULL Pointer Dereference空指針解引用漏洞


C語言中的指針機制使得它靈活高效,但由於指針操作不當產生的動態內存錯誤也有很多,比如內存泄漏(Memory Leakage)、內存的重復釋放、空指針解引用(NullPointer Dereference)。

一、什么是空指針解引用?

如果一個指針變量的值為NULL,解引用這個指針時,會導致程序崩潰(Segmentation fault)。

二、空指針解引用有什么危害?

指針操作不當會產生動態內存錯誤,比如內存泄漏(MemoryLeakage)、內存的重復釋放、空指針解引用(NullPointer Dereference)。

其中空指針引用故障,也叫空指針解引用是一類普遍存在的內存故障,是程序設計語言中一類常見的動態內存錯誤。指針變量可以指向堆地址、靜態變量和空地址單元。當指針指向無效內存地址時對其引用,有可能產生不可預見的錯誤,導致軟件系統崩潰。空指針引用缺陷可能導致系統崩溴、拒絕服務等諸多不良后果。

自2018年1月至9月,CVE中共有100多條漏洞信息與其相關。其中包括18個Linux kernel 漏洞,部分漏洞如下:

(1)CVE-2018-16517:Netwide Assembler 的 asm/labels.c 文件中存在空指針解引用,導致允許攻擊者進行拒絕服務攻擊。

(2)CVE-2018-16428:GNOME Glib 2.56.1,gmarkup. 中的

g_markup_parse_context_end_parse() 函數存在一個空指針解引用。

(3)CVE-2018-16329:ImageMagick 7.0.8-8 之前版本,MagickCore/property.c 文件中的GetMagickProperty() 函數存在空指針解引用。

(4)CVE-2018-16328:ImageMagick 7.0.8-8 之前版本,MagickCore/log.c 文件中的 CheckEventLogging () 函數存在空指針解引用。

三、如何防止解引用空指針?

重點關注報錯發生的所在行,通過空指針異常產生的兩條主要原因診斷具體的錯誤。同時為了避免空指針的發生,最好在做判斷處理時將“null”或者空值放於設定的值之前。

四、含有“空指針解引用”缺陷的代碼樣例?

package SJT11683.S67;

public class SJT671F {

public String exampleFun(boolean flag, String s1, String s2) {

String s3 = null;

if (flag) {

s3 = s1 + s2;

}

//變量s3的值可能為null,當變量s3的值為null時,以下語句岀現null解引用

return s3.trim();

}

}

使用Wukong(悟空)軟件代碼安全漏洞檢測修復系統檢測上述程序代碼。可以發現代碼中存在空指針解引用,導致存在安全隱患。如下圖:

“空指針解引用”在CWE中編號為CWE-476: NULL Pointer Dereference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM