緩沖溢出攻擊是如何發生的
我不確信我完全理解緩沖區溢出。我知道在向目標機器插入代碼時會導致嚴重的緩沖區管理缺陷,但我不知道黑客是怎樣來使這些代碼得以執行的——很可能是在他或她獲得了目標機器的控制權的時候發生的。黑客能夠保證代碼被調用嗎?亦或者這其實僅僅是一個概率問題?
專家回答:
當程序或進程試圖在其分配的數據存儲區域、或緩沖區中存儲超出預計的數據時,緩沖區溢出就會發生。由于創建的緩沖區中只能存儲有限的數據,額外的信息會溢出到鄰近的緩沖區中。當這種情況發生時,原來存儲在這些緩沖區中的有效數據會被破壞或覆蓋。函數中的局部變量的緩沖區溢出可能會覆蓋該函數的返回地址。(返回地址指向該函數執行完成后應該執行的下一條指令)。這可能會導致段錯誤,而段錯誤(segmentation fault)則可以使程序崩潰。在某些特定情形下,程序崩潰后黑客會收到一個shell提示(shell prompt:提示用戶輸入命令行),這就把計算機的控制權交給了黑客。更復雜的攻擊是:黑客用期望執行的代碼的指針重寫返回地址,而不僅僅是讓計算機崩潰。
基于堆棧的緩沖區溢出攻擊是最常見的,但讓我們看看在JPEG處理(GDI +)開發中基于堆的緩沖區侵占,見識緩沖區溢出攻擊的巧妙之處。
微軟的動態鏈接庫文件稱為GDIPlus.dll,其中包含了圖形設備接口以及(GDI +)應用程序編程接口(API)庫。它允許程序員表示圖形對象,并傳輸到輸出設備--如顯示器和打印機。這些DLL有處理JPEG圖像文件的能力,但它在檢查其實際的值之前允許JPEG文件聲明注釋區域的長度,。這時就可能會導致基于堆的緩沖區溢出。基于堆的緩沖區攻擊發生在數據副本被寫入到位于堆內的緩沖區的時候。這意味著非可執行堆棧保護機制可以被繞過,最終導致系統十分脆弱,并允許黑客指向他們希望運行的下一個進程的代碼。諷刺的是,黑客可以在JPEG文件的注釋區域存儲這些代碼。現在,只要被攻擊者查看已經被篡改的圖像,黑客就可以利用這個漏洞了。
緩沖區溢出攻擊如此常見是因為編寫程序使用的都是級別相對較低的編程語言,如匯編語言,C和C + +,它們沒有自動給緩存定限的功能。因此程序檢查到數組或指針時,要求程序員手動管理分配內存的大小。雖然黑客不能保證每一次溢出攻擊代碼都能成功運行,但鑒于各種病毒以及蠕蟲的成功案例,可以說他們仍然可以有很高的成功率。要查看緩沖區溢出是如何進行的,請訪問以下網站的Java程序演示:
http://nsfsecurity.pr.erau.edu/bom_docs/Demos/script.html。另外一個很好的初學者學習緩沖區溢出攻擊的網站是:
http://www.securiteam.com/securityreviews/5OP0B006UQ.html。
【編輯推薦】