MEDS 增強型記憶體錯誤檢測Sanitizer

2021-10-05 02:12:51 字數 2175 閱讀 8984

abut asan:

address sanitizer是google基於llvm開發的一種記憶體錯誤檢測機制,在用 clang 或者 gcc 編譯目標應用的**,在其中插樁。其主要實現了對記憶體物件(堆、棧、全域性)的監控,將這些物件所在的記憶體區域對映到shadow memory上,通過shadow memory記錄記憶體物件和其周圍(及雷區)的是否可以訪問。在物件釋放以後,還會對釋放的記憶體區域進行隔離,直到隔離區滿以後以fifo的方式再次分配這塊記憶體給程式。

linux的記憶體管理機制:

addresssanitizer還存在的問題:

(1)當指標的訪問區域超過了redzone,對buffer-overflow會漏報。(下圖最左圖)

(2)當,對use-after-free可能會有漏報。(下圖最右圖)

– addresssanitizer工具編譯的程式的堆疊和棧占用比原生程式的大。

本文的方法是基於google的addresssanitizer(asan)進行改進的,利用虛擬頁機制擴大雷區(red zone)和隔離區(quarantined zone),進而實現更好捕捉記憶體錯誤(memory error)。文章中提出了兩個asan存在的問題:一是雷區只有16b~2kb,一般的指標越界訪問可以輕易越過這一雷區訪問到其他合法的記憶體物件;二是限制區預設只有256m,並且採用fifo的管理機制,uaf攻擊者可以等待很短的時間就可以對指向已經釋放的區域的指標訪問記憶體再次分配後合法的記憶體物件。為了緩解這兩個問題,作者利用頁機制對address sanitizer進行了改進。利用接管虛擬記憶體分配讓記憶體物件之間的間隔盡可能大(infinite gap),限制區迴圈利用的時間盡可能大(infinite heap)。

主要實現思路為,將雷區(實驗中為4mb)分為頁內和頁兩級,頁內級分配物理shadow memory進行監控,與asan相同;頁級直接不分配記憶體也不設定物理shadow memory,利用沒有map的頁訪問會產生page fault來探測記憶體訪問錯誤。實現這個思路需要兩個部分,一部分是medsalloc,用於接管記憶體空間分配;另一部分是記憶體訪問錯誤探測,用於顯式檢測shadow memory是否合法,隱式接收page fault,判斷是否訪問了頁級red zone。

為了節省記憶體,文章中還提出利用頁別名技術將占用記憶體頁不同位置的虛擬記憶體物件對映到同乙個物理頁上。

這樣就實現了每個記憶體物件都會有乙個較大的雷區來探測記憶體訪問錯誤,即文中所稱的「infinite gap」。

而「infinite heap」的實現就是通過medsalloc充分利用64位系統的記憶體空間,將每個記憶體物件分配的位址單調製化,是的被**的虛擬位址在盡量長的時間後才能被重新分配,這樣就緩解了use-after-free漏洞利用的條件。

**中主要實現的技術包括medsalloc記憶體分配機制和頁記憶體訪問錯誤捕捉機制。主要基於llvm編譯器專案,專案整體是乙個llvm extra pass,通過對目標專案的c/c++**進行編譯插樁,並生成可執行檔案,執行時動態庫主要還是基於llvm的sanitizer規則來做的。medsalloc基本上會把所有的記憶體分配和**函式hook,用來完成程式記憶體物件以及影子記憶體的分配和監控操作。**量10,812行。meds會與aslr傳送衝突,所以需要關閉aslr。

實驗測試了三個方面的表現,包括meds的相容性、探測能力和效能。實驗結果表明:

增強型搜尋軟體

最近對搜尋似乎情有獨鍾 剛做了中國部分搜尋引擎的思維導圖,就發現了幾款很棒的搜尋工具,稍作整理,分享給大家 包含everything 光速搜尋 docfetcher wise jetsearch 歡迎光臨 對於多數人而言,everything應該已經是一款耳熟能詳的軟體了,在各種軟體排行榜以及裝機必...

GlobalSign 增強型 EV SSL 證書

globalsign 增強型 ev ssl 證書,屬於最高驗證級別的ev ssl,驗證網域名稱所有權,進行嚴格的企業真實身份驗證,證書標識企業組織機構名稱,強化信任度,瀏覽器位址列變綠色。提供40位 56位 128位,最高支援256位自適應加密。支援多域型,所有的ev ssl證書都不支援通配型,如果...

Java自學 陣列 增強型for迴圈

增強型for迴圈在遍歷乙個陣列的時候會更加快捷 步驟 1 增強型for迴圈 注 增強型for迴圈只能用來取值,卻不能用來修改陣列裡的值 public class helloworld 常規遍歷 for int i 0 i values.length i 增強型for迴圈遍歷 for int each...