緩衝區溢出漏洞淺析

 

緩衝區是指內存中一段連續的地址空間,用來緩存數據。在大多數開發語言中,把數組和指針分配的空間作爲緩衝區。緩衝區溢出是指讀取或寫入的範圍超過數組或指針指向的緩衝區空間,導致程序運行期間發生異常。緩衝區溢出大多數情況下編譯器無法給出錯誤信息,而只有當程序運行期間纔會暴露出來,所以緩衝區溢出也歸屬於運行時缺陷。運行期間發生異常是由於緩衝區溢出數據(包括上界和下界),破壞了緩衝區上下邊界外其它變量的數據,導致出現異常,由於在程序運行期間,是否超過邊界、超過邊界時,破壞了邊界外的數據,而邊界外數據是否發生異常,取決於收到污染的變量值,是否合理,當時是否用於其它程序功能等,所以緩衝區溢出缺陷可能會出現程序異常,也可能短期內不會出現程序異常。

 

     下面是緩衝區溢出原理示意圖:

 

 

   緩衝區溢出在不同的編譯器和操作系統下,溢出數據破壞棧中位置可能不同。與操作系統是否支持DEP(數據執行保護)有關。

 

   常見的緩衝區溢出缺陷包括:

  1. 寫入污染數據導致的越界
  2. 污染數據由於數組下標
  3. 污染數據用於內存分配函數
  4. 污染數據用於指標操作
  5. 污染數據用於拷貝字符串
  6. 污染數據用於格式化字符串
  7. 給數組賦值字符串越界
  8. 數組下標訪問越界
  9. 初始化內存越界
  10. 指針操作越界
  11. 字符串拷貝越界
  12. 格式化字符串導致的緩衝區溢出

 

緩衝區溢出可以使任何一個有黑客技術的人取得機器控制權甚至最高權限。比較著名安全漏洞事件包括2003年8月的衝擊波病毒、2014年4月報出的openssl“Heartbleed”(心臟滴血)漏洞,2015年1月的glibc庫幽靈漏洞。根據CNNVD2018年12月月報顯示,當月採集漏洞1275個,其中緩衝區溢出錯誤排名第一,一共196個,佔比15.37%。在CWE收集的緩衝區溢出漏洞相關的編號包括CWE 119、CWE 120、CWE 121、CWE 122、CWE 129、CWE 134、CWE 193、CWE 787、CWE 788和CWE 805等。

緩衝區溢出導致安全漏洞是主要是由於開發人員在編寫程序中緩衝區使用不當引起的,這種類型有共同的特徵,是可以通過源代碼靜態分析手段檢測出來,是完全可以在開發階段檢測出來並進行修復的,這時候修復安全漏洞的成本也是最低的。

下面我們列舉其中的幾個包含緩衝區溢出錯誤的代碼。

  1. 寫入污染數據導致的越界

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

  

   char cArray[10];

   scanf("%s",cArray);

   printf("%s,Hello, welcome you\n",cArray);      

   return 0;

}

上面代碼中聲明瞭數組aArray,大小爲10個字符長度。在代碼中通過控制檯輸入字符串,直接存儲到數組,如果輸入長度超過10個,則會導致緩衝區溢出。防止出現這種錯誤可以通過限制輸入數據長度避免該漏洞,例如 scanf("%10s",cArray);

  所謂污染數據主要是指來自於輸入設備、文件或網絡等外部的數據,如果沒有對輸入數據的長度、類型等進行合法性檢測,則會存在着安全漏洞。我們無法不允許用戶輸入數據,但是我們必須保證輸入數據在可控範圍之內。

 

  1. 污染數據用於數組下標

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

   char cArray[10];

   ind  n=0;

   int  i=0;

 

   for(i=0 ; i<10 ; i++ )

   {

      scanf("%d",@n);

    cArray[n]=1;

   }

return 0;

}

上面代碼中聲明瞭字符數組cArray,大小爲10,在循環中通過輸入一個數字用於數組的下標。如果用戶輸入0-9之外的數字,則會導致數組越界。防止這種錯誤產生可以通過對讀入的下標值進行判斷,是否在0-9範圍之內。

CWE 129屬於該類漏洞。我們無法控制用戶輸入我們想要的數據,但是我們可以通過合法性檢驗防止不能接受的輸入。

今天放假第一天,做了幾道數學題目,感覺現在初中數學題目真很難,還是整理我們的專業技術還簡單一些。由於時間關係,其它類型錯誤例子後續我繼續整理,由淺到深逐漸把緩衝區溢出的各種情況列出來。

關注互聯網安全,也不要忘記代碼安全。且代碼安全,我們可以通過自動化手段實現。代碼錯誤和安全漏洞檢測是可以像接口測試一樣(趕快摒棄基於GUI的自動化測試吧,爲什麼大家都搞接口自動化測試),真正能夠在企業生產中通過自動化測試工具落地。

關注安全,關注作者

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章