1. 程式人生 > >C語言程式設計中常見的漏洞原因

C語言程式設計中常見的漏洞原因

1. gets

gets()函式不檢查緩衝長度,可能導致漏洞。呼叫函式gets(buffer),會把使用者輸入的內容放在buffer中,但是對這個內容沒有檢查長度。如果使用者輸入內容過長,就會覆蓋在buffer之後定義的變數,也就是說使用者可以隨意更改一些程式中的變數。

那麼應該怎麼用才安全呢?使用fgets()函式更好一些。首先你要用malloc為buffer分配一部分固定的空間,然後呼叫fgets的時候傳遞進去預計長度的值,這樣就不會造成溢位了。

2. strcpy

這個家族有三個函式:strcpy、strcat和strcmp,都有溢位問題,因為不檢查長度。一種對應方法就是,在使用這些函式前加入檢查長度的語句。還有一種方法是使用strncpy、strncat和strncmp,是會檢查長度的版本,不過這種方法的問題是,如果截取了長度,不能保證字串以’\0’結尾,所以可能需要新增一些程式碼判斷一下。

3. sprintf

這個函式的問題也是不檢查長度。使用snprintf更好一些。這個函式不僅能夠避免緩衝區溢位(檢查長度),還可以返回傳遞字串的長度,以供判斷是否需要處理擷取後的’\0’結尾問題。

4. printf及相關函式

這一類的漏洞與字串格式攻擊相關,也就是我們常說的利用格式化字串漏洞進行攻擊。這種攻擊通常會導致資訊洩露、覆蓋記憶體(%n)等等。這個漏洞可以被以下函式觸發:printf, fprintf, sprintf以及snprintf。這些函式的共同特點就是,都以格式化的字串作為引數,即百分號之後的格式約定。
這種漏洞的應對方式就是,記住一定要硬編碼格式化字串。

5. 檔案開啟

開啟檔案的時候要特別小心。檔案處理可能有多種被攻擊的方法,這裡只介紹幾個例子。

一般來說我們在開啟檔案之前都會先確認檔案是否存在,但是攻擊者可能會建立一個檔案(甚至只是建立了一個重要系統檔案的符號化連結),在你的檢查和實際使用檔案之間的時候。open函式比fopen要更安全一些。在開啟檔案前,unlink檔案以消除符號化連結。先用open函式生成一個檔案描述符fd,如果fd為-1則開啟檔案失敗。然後再用fdopen來開啟這個檔案描述符所指的檔案,如果之前有符號化連結,那麼因為被消除,這個檔案就不能開啟。