1、被污染的記憶體分配
C 語言的記憶體分配函數包括malloc()
、 kmalloc
、 smalloc()
、 xmalloc()
、realloc()
、 calloc()
、 GlobalAlloc()
、 HeapAlloc()
等等,以malloc()
為例, malloc()
函數的原型為:
extern void*malloc (unsignedintnum_bytes);
malloc()
函數分配了num_bytes
位元組的內存,並傳回了指向這塊記憶體的指標。當記憶體分配長度的整數來自於可能被污染的不可信來源時,如果沒有對外部輸入的資料進行有效判斷,會導致超大的記憶體分配。其中可能被污染的不可信來源包括:命令列參數、設定檔、網路通訊、資料庫、環境變數、登錄值以及其他來自應用程式以外的輸入等。
2、 被污染的記憶體分配的危害
直接將被污染的資料作為記憶體分配函數長度參數,如傳入了一個極大的整數值,程式就會相應的分配一塊極大的內存,從而導致系統極大的內存開銷,甚至導致拒絕服務攻擊。
CVE中也有一些與之相關的漏洞訊息,從2018年1月至2019年3月,CVE中就有4個相關漏洞訊息。漏洞資訊如下:
#CVE | 概述 |
---|---|
CVE-2018-6869 | ZZIPlib 0.13.68 版本中的zzip/zip.c 檔案的'__zzip_parse_root_directory'函數存在安全漏洞。遠端攻擊者可藉助特製的zip檔案利用該漏洞造成拒絕服務(不可控的記憶體分配和崩潰)。 |
CVE-2018-5783 | PoDoFo 0.9.5 版本中的base/PdfVecObjects.h檔案的'PoDoFo::PdfVecObjects::Reserve'函數存在安全漏洞。遠端攻擊者可藉助特製的pdf檔利用漏洞造成拒絕服務(不受控制的記憶體分配)。 |
CVE-2018-5296 | PoDoFo 0.9.5 版本中的base/PdfParser.cpp 檔案的'PdfParser::ReadXRefSubsection'函數存在安全漏洞,該漏洞.cpp 檔案的'PdfParser::ReadXRefSubsection'函數存在安全漏洞,該漏洞.cpp 檔案的'PdfParser::ReadXRefSubsection'函數存在安全漏洞,該漏洞。源自於程式沒有控制記憶體的分配。遠端攻擊者可藉助特製的pdf檔利用漏洞造成拒絕服務。 |
3、範例程式碼
本節所用範例參考CWE-789: Uncontrolled Memory Allocation (http://cwe.mitre.org/data/definitions/789 .html) 提供的程式碼範例,並對範例中的 GetUntrustedInt()
函數進行了定義。
3.1缺陷程式碼
#在上述範例程式碼中,在第9行使用malloc()
函數進行長度為totBytes
位元組的記憶體分配,透過追蹤路徑可以看出,totBytes
在第6行透過size*sizeof(char);
計算結果進行賦值,而size
的值是第7行使用scanf()
函數取得的使用者鍵盤輸入,為被污染的資料來源,進而導致記憶體分配長度 totBytes
被污染,有「被污染的記憶體分配」問題。
使用360程式碼衛兵對上述範例程式碼進行偵測,可以檢出「被污染的記憶體分配」缺陷,顯示等級為高。如圖1所示:
#圖1:被污染的記憶體分配的偵測範例
3.2 修正程式碼
在上述修復程式碼中,雖然totBytes
的來源為被污染的數據,但在第10行對totBytes
的長度進行了有效限制,從而避免了被污染的記憶體分配。
使用360碼衛士對修復後的程式碼進行偵測,可以看到已不存在「被污染的記憶體分配」缺陷。如圖2:
圖2:修正後偵測結果
4、如何避免被污染的記憶體分配
(1)避免使用被污染的資料直接作為記憶體分配函數的長度參數,如無法避免,則應對被污染的資料進行有效限制。
(2)使用原始碼靜態分析工具,可以有效發現這類問題。
以上是C語言記憶體分配函數被污染的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

VScode中怎么配置C语言环境?下面本篇文章给大家介绍一下VScode配置C语言环境的方法(超详细),希望对大家有所帮助!

在C语言中,node是用于定义链表结点的名称,通常在数据结构中用作结点的类型名,语法为“struct Node{...};”;结构和类在定义出名称以后,直接用该名称就可以定义对象,C语言中还存在“Node * a”和“Node* &a”。

c语言将数字转换成字符串的方法:1、ascii码操作,在原数字的基础上加“0x30”,语法“数字+0x30”,会存储数字对应的字符ascii码;2、使用itoa(),可以把整型数转换成字符串,语法“itoa(number1,string,数字);”;3、使用sprintf(),可以能够根据指定的需求,格式化内容,存储至指针指向的字符串。

在c语言中,没有开根号运算符,开根号使用的是内置函数“sqrt()”,使用语法“sqrt(数值x)”;例如“sqrt(4)”,就是对4进行平方根运算,结果为2。sqrt()是c语言内置的开根号运算函数,其运算结果是函数变量的算术平方根;该函数既不能运算负数值,也不能输出虚数结果。

C语言数组初始化的三种方式:1、在定义时直接赋值,语法“数据类型 arrayName[index] = {值};”;2、利用for循环初始化,语法“for (int i=0;i<3;i++) {arr[i] = i;}”;3、使用memset()函数初始化,语法“memset(arr, 0, sizeof(int) * 3)”。

c语言合法标识符的要求是:1、标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成;2、第一个字符必须是字母或下划线,不能是数字;3、标识符中的大小写字母是有区别的,代表不同含义;4、标识符不能是关键字。

c语言编译后生成“.OBJ”的二进制文件(目标文件)。在C语言中,源程序(.c文件)经过编译程序编译之后,会生成一个后缀为“.OBJ”的二进制文件(称为目标文件);最后还要由称为“连接程序”(Link)的软件,把此“.OBJ”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.EXE”的可执行文件。

c语言计算n的阶乘的方法:1、通过for循环计算阶乘,代码如“for (i = 1; i <= n; i++){fact *= i;}”;2、通过while循环计算阶乘,代码如“while (i <= n){fact *= i;i++;}”;3、通过递归方式计算阶乘,代码如“ int Fact(int n){int res = n;if (n > 1)res...”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中