1. 程式人生 > >C語言程式碼漏洞審計技巧筆記分享

C語言程式碼漏洞審計技巧筆記分享


c語言程式碼審計和安全漏洞檢查主要容易出現在介面和輸入輸出位置上。


c language code review note


引數和指令檢查


command: argc argv


注意此處為使用者外部輸入介面,argc和argv兩個引數必須嚴格判斷,資料型別,指令

格式長度均作安全校驗校測。常見的最容易出漏洞的argv[1]引數指標引用。緩衝區溢位,

整數溢位,越界等漏洞。
 
environmental var: getenv

環境變數獲取和資料檢測。此處出現漏洞的原因在於該函式在獲取環境變數數值時候。

並不作任何校驗或者判斷,直到字串結尾。

至少先得加個

string strenv ="";

strenv = getenv( "tmp_dir");

if( ( NULL == strenv ) || (    0 == strlen(strenv ) ) )
{
      //error
}

 

輸入輸出檢查

input/output:read() fscanf() getc() fgetc() fgets() vfscanf()

keyboard input: read() scanf() getchar() gets()


network data: read(),recv(),recvfrom()

同類函式比較多,舉個例子。gets函式

永遠不要使用 gets()。該函式從標準輸入讀入使用者輸入的一行文字,

它在遇到 EOF 字元或換行字元之前,不會停止讀入文字。也就是:gets()

根本不執行邊界檢查。因此,使用 gets() 總是有可能使任何緩衝區溢位。


 

3   字串函式安全檢查
 

string function

strcpy(),strcat()

 

strcpy()函式將源字串複製到緩衝區。沒有指定要複製字元的具體數目!

如果源字串碰巧來自使用者輸入,且沒有專門限制其大小,則有可能會造成緩衝。

當然如果不是使用者輸入,只是程式本身的自己的內部資料,如果不計算,判斷,可能

會引起資料錯誤或者指標異常。



指標越界檢查

poniter/array outbound


 此處的指標和陣列也是經常出現的問題,設計者不注意邊界或者測試人員並不能完全

測試所有可能和資料型別大小,也會出現野指標或者越界訪問資料,這樣是很危險的。


函式返回值檢查

check all function return value


// malloc() calloc() realloc() new()

這幾個主要是記憶體分配函式,管理著程式的堆地址空間。

不合理的使用或者釋放也會產生問題,比如堆緩衝區溢位,

UAF釋放重用漏洞。


使用者資料長度檢查

check all the data lengh of the user

資料長度校驗,也很重要,有時候把握不嚴格,


引入程式進入非常邏輯分支。比如整數溢位,

無符號和有符號之間的轉換,導致了資料截斷或者大小變化。

這些都會出現潛在漏洞和危害。

資料格式檢查

check all the data format

資料格式問題也得注意。比如我們自己處理定義的結構體。

如果資料型別和格式變化,在記憶體中進行錯誤的解析了,

有可能出現數據當做程式碼或者指令執行的情況。

8 總結


總的來說,就是大家編寫程式碼或者審計程式碼的時候,要特別注意以下常見的問題。

方可減少我們c語言程式中可能存在的危害和漏洞。

 
1 檢查指標是否為空。

2 檢查字串是否正常結束。

3 檢查陣列大小,記憶體空間,越界等行為。

4 檔案的讀取寫入資料格式,大小,快取。

5 關鍵系統命令函式指令解析。