天天看點

緩沖區溢出漏洞淺析

緩沖區溢出漏洞淺析

緩沖區是指記憶體中一段連續的位址空間,用來緩存資料。在大多數開發語言中,把數組和指針配置設定的空間作為緩沖區。緩沖區溢出是指讀取或寫入的範圍超過數組或指針指向的緩沖區空間,導緻程式運作期間發生異常。緩沖區溢出大多數情況下編譯器無法給出錯誤資訊,而隻有當程式運作期間才會暴露出來,是以緩沖區溢出也歸屬于運作時缺陷。運作期間發生異常是由于緩沖區溢出資料(包括上界和下界),破壞了緩沖區上下邊界外其它變量的資料,導緻出現異常,由于在程式運作期間,是否超過邊界、超過邊界時,破壞了邊界外的資料,而邊界外資料是否發生異常,取決于收到污染的變量值,是否合理,當時是否用于其它程式功能等,是以緩沖區溢出缺陷可能會出現程式異常,也可能短期内不會出現程式異常。

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

緩沖區溢出漏洞淺析

   緩沖區溢出在不同的編譯器和作業系統下,溢出資料破壞棧中位置可能不同。與作業系統是否支援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的自動化測試吧,為什麼大家都搞接口自動化測試),真正能夠在企業生産中通過自動化測試工具落地。

關注安全,關注作者

繼續閱讀