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

zktq2021發表於2021-08-12

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70000012/viewspace-2786563/,如需轉載,請註明出處,否則將追究法律責任。

相關文章