幾種軟體缺陷的可能利用方法

來源:互聯網
上載者:User

幾種軟體缺陷的可能利用方法  

作者:吳石
 

我的題目是幾種不常見的軟體缺陷,但是內容可能有一些出入。第二,我也是一個初學者,PPT裡可能也存在很多問題,也希望各位專家指出來。

我們先看看常見的軟體缺陷:

第一,棧溢出。就是在棧中申請一段記憶體,一般是數組或字串,在對這段記憶體做操作的時候,錯誤的寫操作可能導致棧中也特殊意義的地址被使用者的輸入內容所控制。最早發現是一些字串操作的函數中,比如strcat,後來又發現在Strncpy如果不正常操作的話也會出現這個問題。最後有一個Windows UNicode處理的函數如果不正常使用也會出現這樣的問題。下面我介紹的是整數溢出的問題。

整數溢出是多發於的情況,特別是一些加、乘的操作出現在記憶體前面就要特別注意了。加或者乘出來的數不一定比原先兩個數大。還有一個正負數比較的問題,或者是符號擴充的問題。即使現在這個問題仍存在於很多軟體中。但是在很多流行軟體中已經很少出現了,比如微軟的軟體、國外大公司的軟體。但是在國內軟體這個問題依然是很多的。這個問題在JAVA軟體中也經常存在。例如銀行系統,系統錯誤處理,把別人帳號上扣掉的金額,一個正的金額加到你的帳號上。

第二,heap overflow。這是現代程式C語言主要申請分配方法,所以他比棧溢出比例大的多。微軟做了很多防護措施,所以它利用起來是非常複雜的。尤其是 WindowsXP2之後的版本,比如vista。堆管理主要利用兩張表,freelist、lookaside,freelist[0]代表著一些不規則的可以利用的chunk,尤其是比較大的chunk。freelist[1] – freelist[n]代表2的整數次方可以利用的堆中的chunk。利用這樣堆溢出的問題,你需要對Windows堆管理非常熟悉。比如有人通過 freelist[0]這個鏈表成功利用。目前有一個immdbg的程式對這種研究利用是很有協助的。因為他把堆分配的內容都可以顯示出來。對vista 軟體的攻擊,理論上應該是不存在的。因為vista對堆管理有嚴格控制,但是有很多軟體使用自己的記憶體管理方法,比如OFFICE,他們自己堆管理方法和記憶體方法是和vista不一樣的,這些方法往往採用教科書的方法或者以前系統的方法,所以他們這些方法是有可能被利用起來。

第三,未初始化的問題。棧上的問題由德國人在06年詳細討論過。頭一次壓棧的時候,在棧上寫需要內容,然後函數退出,導致棧頂上移,有問題的函數壓棧時正好利用這段棧空間,如果函數中發現了未初始化問題,比如數組,那麼其內容剛好是我們剛寫入的內容的棧空間,就可能被利用。先把堆裡的大部分內容寫成自己需要的內容,未初始問題發生時,比如堆裡指標的內容就可能指向我們需要的內容。目前這個問題是大量存在的,OFFICE存在了很多。比如這個月微軟補丁,excel那一個補丁裡就包括很多這樣的問題。你可以對比新舊的OFFICE軟體,你發現 OFFICE2007有一些新加的代碼就是做初始化工作的。

第四,二次釋放或者叫double free問題。記憶體泄露是現代軟體大敵,特別是伺服器軟體。有很多程式員害怕發生這樣的問題,申請記憶體時總是想釋放它,結果釋放多了幾次,這樣也會有安全問題。曾經在linux上的方法很巧妙、經典,但是在目前Windows上比較難以利用。很多軟體採用自己管理記憶體方法,那麼就很可能被利用到。

我們現在可以討論一下可以利用軟體問題,就是可以執行任何代碼軟體的充分條件,就是將任意4 位元組內容寫到任意記憶體位址。如果滿足這個條件的話,它肯定是可以被利用的。這個條件叫做充分條件。在棧的溢出或者堆溢出,將任意4位元組內容寫如某些特定的記憶體位址,而這些地址有特殊含義。由於代碼流或者資料流在X86裡是混合的。還有一些更特殊的情況,任意1位元組寫進某些特定的地址,這些地址剛好有特殊含義,可能也會引發這個問題。所以我們總結一下,離充分條件越近的,越有可能這個問題被利用,可以被執行任意代碼。

關鍵問題就在於寫記憶體操作,而不在於讀記憶體。寫記憶體操作可以改變很多東西,讀記憶體的話,即使發生異常的話,這些問題也往往不能被利用。當我們要從大配量序中快速找到可以利用的漏洞的時候,要首先:

第一,找到那些寫操作引起的異常。

第二,比較少出現的異常。未初始化問題發現,就要瞭解一下未初始化預設填充的字元。這是一個例子,我們可以詳細分析一下哪些結果是被利用的,根據我們原則:

1.寫操作的過程。這個看起來比較複雜,而且可能是一個整數溢出的問題。

下面講講我的心得,另類棧溢出的問題。這是一個遞迴函式,與一般的棧溢出不同的是向下溢出,由於棧記憶體空間是有限的,這個一直壓棧的過程會導致記憶體讀寫到棧分配記憶體空間之外,找出問題的關鍵在於代碼流程圖中找到可以由使用者控制的“圈”。一般情況下,這種會造成程式崩潰,某些特殊情況下會造成執行惡意代碼。這種情況是很特殊特殊的。就是兩個現成的棧緊緊挨在一起。

2.棧每次分配空間都比較大。

3.編譯器要比較老的那種才可以。新的編譯器會檢查這樣的情況。

我們考慮完棧溢出的話,可以考慮相應的堆溢出情況,堆溢出情況更加複雜,但是更有靈活性。在一部分情況下有可能被利用,如果你利用這種方法去尋找的話。

安全問題可以借用的數學理論,因為數學方法是人類經過幾千年總結出來的,具有普遍意義和前瞻性。我們可以看到安全問題很大部分是由攻擊者和研究者發現一條可以控制的代碼或者資料流,這些是程式員沒有想到的。傳統堆疊溢位基本上可以看作是系統或者庫函數的比較不明顯的後門,攻擊者或研究員對這些後門比一般程式員瞭解。基本上一個程式可以看作是兩張圖,一張叫做資料流圖、一張叫做代碼流圖,發現安全問題就是在這兩張圖上發現一條路徑,發現這條執行路徑的話,可以執行攻擊者所需要的功能。

針對這樣的問題,數學上準備了相應的理論,圖論這方面的研究早就有了。我認為以後研究者所做的工作就是根據自己經驗,以圖論理論進行指導,利用電腦快速找到一條安全問題的路徑。而廠商要做的就是利用自己強大的計算能力,快速遍曆所有可知性路徑來證明軟體安全性。這是我的一點心得體會。

第三個可以借用的理論叫做編譯原理。C/C++程式都需要經過編譯最佳化措施執行,在這個編譯過程中編譯器事實上獲得了很多有用的資訊,如何在軟體上安全利用這些資訊,目前很多公司進行了很多有意義的嘗試。但是離真正有用還是有一定差距。這種方法理論上應該比Fuzzing的方法好,他知道軟體結構可以較快發現軟體的問題。

下面又是我的一個體會,我比較傾嚮應用這樣方法得到一些可用資訊後,自動構造一些測試案例去測試,這樣的話,測試效能和人力成本就會大幅降低。

第四個可以借用的數學理論就是人工智慧和統計理論。目前的話,有很大的問題。因為樣本庫太少。我們可以首先做模板方法,比如前面提到+或者×出現記憶體配置前面,我們可以做一個模板,用這個模板去掃描原代碼,試圖發現這樣的問題。從這些模板匹配方法再慢慢過度到模式比對方法。但是人工智慧和統計理論對其他的一些網路安全問題有很大的作用。比如說DDOS或者靠數量來使得網站、程式、崩潰的這些方法,它應該是會取得很大的作用。它對網路流量的分類目前還是取得一定的成功,不能說很大的成功。

下面舉一個例子,這是MSOFFICE記憶體管理。以2007為例,以Msopvalloccore分配內容,以msofreepv釋放記憶體,每次釋放記憶體時都會改變地址值,讓地址值走向政正確的位置。分配記憶體時,讀出freelist第一個元素,符合申請的話,就把記憶體空間提供給需要申請的函數。同時把freelist下一個元素作為表頭。釋放記憶體時,他是把指向釋放記憶體的地址作為表頭,把前一個指向下一個元素。可能遇到的問題,有一個double free問題,這在OFFICE記憶體方法上是一個知名弱點,因為他對這個問題沒有檢查,很有可能造成代碼執行。具體方法我下一頁PPT會提到。這樣就啟發我們在很多軟體裡都自己寫記憶體管理方法,這樣的話,一些經典問題就有可能在自己寫的管理方式中被利用。儘管OS層已經不存在這個問題。

攻擊的思路。實際上這是一個代碼程式解釋。首先我們申請很多記憶體,在地址上填上我們所需要的內容,把這些記憶體釋放掉。為了保證程式成功的可能性更大一點,我們也做這樣一個工作。申請一段記憶體,兩次free後,OFFICE記憶體管理會錯誤把表地址作為釋放後可以利用的記憶體位址,再申請一段比較小的記憶體,填上需要覆蓋的記憶體位址。再請幾段小記憶體,OFFICE記憶體管理會錯誤把需要的內容填到需要覆蓋的記憶體。ms第二個記憶體問題,未初始化利用。他和double free利用也差不多。這個提醒微軟不僅要把系統安全搞安全就可以了。在EXCEL2003就有這樣的低級錯誤。堆溢出的問題在這套記憶體管理體系也是存在,堆溢出而且是不受OS這種保護的。它是可以很容易的利用的。

下一個問題是數組越界讀寫,這也是一個漏洞發現的主流渠道。因為以前這些有問題的庫函數的方法並不能發現漏洞了,既使是整數溢出也非常罕有了。整數溢出目前也是比較少了,但是數組越界在一定範圍內還是存在的。目前我找到很多問題還是數組越界讀寫。如果這個傳入的參數存在一個寫的操作,這個內容就可能寫到任意的記憶體位址。

下面我講講IM軟體普通存在的問題。第一個問題,整合第三方軟體太多了,這些軟體往往不提供原始碼,造成開發人員對介面的理解不完整或不正確。因為IM軟體有很多東西是自己不擅長的,往往採用第三方軟體。但是第三方軟體代碼品質不一定絕對安全,所以會造成一些安全問題。還有一些是存在在繼承的第三方軟體,存在於老的版本,老的版本報出安全問題之後,IM軟體並沒有更新所使用的軟體包。IM軟體預設認為用戶端或伺服器是可信任的或者部分可信任,這就是造成極大安全。特別是比較複雜的功能,如語音視頻功能中,安全問題是大量存在的。即時聊天軟體有的採用了簡化密碼編譯演算法,這對於對抗暴力破解效能很差。還有一些軟體不正確使用加密方法,比如使用了一個固定密鑰,密鑰存在於用戶端制之中,如果有人把密鑰提取出來就可以知道聊天內容。第四,軟體團隊不穩定,造成軟體代碼品質很差,而且指導思想不一致,可能在一些國產然間中發現大量未完成功能,這些功能都可能是安全隱患。

我今天演講就到這裡,謝謝!

現場問答:

問:首先你說這個編譯器裡面會產生一些代碼或者你剛才說的微軟裡面存在的問題,編譯器為什麼會發生這種情況?還有一點,像微軟預設申請,有什麼說法?像你說的發現很多軟體未完成的功能,這種軟體一般都比較大,帶了很多庫,你是全部去看?

吳石:我不知道。主要是看可以執行的地方。

問:你怎麼知道他什麼地方可以執行?

吳石:首先通過調試器去看,首先要使用它,然後加一個調試器。然後看他可能執行的代碼。

問:你一般分析這種東西需要多長時間?

吳石:因為我不是全部分析他的內容,我只是分析代碼流如果存在問題的話。

問:關於圖論來減少軟體BUG這個東西有沒有實踐?

吳石:我自己目前在做這方面的東西。而且你看IDA軟體,我剛才提到一個德國人,他就是把代碼流程畫成一張圖的形式給你看。

問:通過源碼產生圖還是可執行代碼?

吳石:可執行代碼。

問:會不會產生很多遺漏的地方?

吳石:這個東西是IDA做的,目前我沒有看到遺漏的地方或者比較少。

問:能不能考慮一下通過這種數學的方法解決軟體缺陷?

吳石:我剛才提到一家公司是用編譯原理方法去解決軟體問題和軟體安全問題,它的這些東西是在所有大的廠商裡現在都在用。所以這個前景還是有的。

問:ms他們會有一個自己的記憶體管理方法,為什麼有作業系統不用,而自己建立?

吳石:因為有一些特殊需求,作業系統記憶體管理方法往往對他的特殊需求支援的不是很好或者是產生的不是很快,最關鍵原因他認為這個方法不是很快,所以他用自己的一套方法管理記憶體。

問:能不能舉例說明一下,除了快之外還有沒有其他因素?

吳石:如果利用OS方法的話,因為每次申請記憶體可能跟OS2的N次方,它的記憶體片段產生的最少,對堆管理不可利用的產生的最少。如果不是2的n次方就會產生很大的片段。如果利用自己的記憶體管理方法,他知道它會產生這樣的記憶體配置,所以他可以避免了這樣的問題,導致效能有所提升。

問:我想問一下,剛才提到很多安全問題已經不是像以前簡單的危險函數使用的問題,已經是一些比較深層次的問題,現在針對這種情況有沒有什麼好的方法或者是好的軟體能夠達到自動化的程度,能達到多少?

吳石:如果有原始碼的話,Coverity目前是最好的。但是如果是安全問題,好不了多少。大量還是要靠人工分析,如果完全想完全解決安全問題。他對其他的軟體問題,比如記憶體泄露或者未初始化這些問題做得還是不錯。他為什麼對安全問題做得不好呢,我估計裡面沒有一個真正懂安全的人去指導這個工作。

問:能不能介紹一下挖掘功能使用到哪些工具?

吳石:我本來想寫一個光速入門的ppt,因為我的筆記們沒有帶電源,就沒有寫。挖掘有幾個技術條件:第一,對調試很瞭解。對軟體結構很瞭解。對所想挖掘的功能要比較瞭解。第二,你要有一點想法或者有一點經驗,知道軟體在什麼情況下可能會出現問題。然後下一步要寫一個程式去把這樣的問題找出來,而不是自己去找。如果自己去找的話,這樣的精力或者時間花費太多,我以前是自己去找,但是效果不是很好。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/shewey/archive/2010/10/16/5945141.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.