天天看點

IoT上的緩沖區溢出漏洞

在過去N年裡,緩沖區溢出一直是網絡攻擊中最常被利用的漏洞。 看一下緩沖區是如何建立的,就能知道原因所在。

下面是C語言的一個例子:

第一步,程式員使用 malloc 函數并定義緩沖區記憶體的數量(例如32位)

第二步,傳回指針,訓示記憶體中緩沖區的開始位置

第三步,當程式員需要讀取或寫入該緩沖區時,程式員都會使用該指針

有了指針,程式員很容易忘記配置設定給指定緩沖區的實際記憶體量。編譯器在程式中使用中繼資料來配置設定适當的緩沖區大小,但是這個中繼資料通常在建構時被丢棄了。

如果在程式内或程式之間傳輸的資料随後超出原定義的緩沖區大小,則資料資訊将覆寫相鄰的記憶體。這會導緻記憶體通路錯誤或崩潰,以及安全漏洞。

緩沖區溢出和漏洞利用

黑客可以使用堆棧緩沖區溢出替換帶有惡意代碼的可執行檔案,這樣他們就可以利用系統資源,比如堆記憶體或者調用堆棧的本身。例如,控制流劫持利用堆棧緩沖區溢出,将代碼執行重定向到正常操作中以外的位置。

IoT上的緩沖區溢出漏洞

圖1 控制流劫持

一旦掌握了控制流程,一個控制流程的劫持者可以修改指針和重用現有代碼,同時還可能替換代碼。控制流的指令還允許攻擊者修改用于間接調用、跳轉和函數傳回的指針,這些指針會留下一個有效圖來隐藏它們的行為。

在發生代碼執行之前,動态位址空間配置的随機載入(ASLR)機制和用于檢測并防止緩沖區溢出的堆棧金絲雀,這些仍然是一個挑戰。

安全: 軟體還是晶片負責?

ASLR和堆棧金絲雀是基于軟體的緩沖區溢出保護機制,這些機制确實使攻擊者更難利用緩沖區溢出。例如,ASLR,動态地重新定位記憶體區域,以便黑客有效地猜測目标元件的位址空間,如基礎可執行檔案、庫、堆棧記憶體。不幸的是,最近像 Spectre 和 Meltdown 這樣的漏洞洩露了CPU分支預測器的資訊,這些明顯的原因限制了ASLR的有效性。

另一方面,堆棧金絲雀在記憶體中的傳回指針之前插入小整數。檢查這些整數以確定它們沒有改變,一個程序就可以使用相應的傳回指針。盡管如此,如果黑客們确信包含了正确的金絲雀值,那麼黑客們還是有可能讀懂這些金絲雀,然後簡單地重寫它以及随後的緩沖區。此外,雖然金絲雀保護控制資料不被更改,但它們不能保護指針或任何其他的資料。

當然,基于軟體的安全解決方案的另一個挑戰是,它們極易受到漏洞的影響。據不完全統計,每1000行代碼中就有15-50個漏洞,這意味着解決方案中存在的軟體越多,漏洞的數量就越大。

當處理這種問題而不僅僅是緩沖區溢出的症狀時,一個更加健壯的方法是在晶片中實作安全性,而堆棧緩沖區溢出開發是為了操縱軟體程式。了解這類攻擊的根本原因,首先要認識到處理器無法确定某個程式是否正确執行。

除了減輕軟體缺陷的影響之外,晶片不可能被遠端改變。但是一個處理器或者一塊晶片必須在運作時識别試圖寫入記憶體或外圍裝置的指令是合法執行還是非法操作。

運作時的晶片安全性

Dover Microsystems 開發了一種叫做 CoreGuard 的技術,這是一個可以與RISC 處理器架構內建在一起的IP core,用于在運作時識别無效的指令。作為RTL傳遞,解決方案可以針對各種功率和區域需求進行優化,或者修改并支援自定義的處理器擴充。

IoT上的緩沖區溢出漏洞

圖2 CoreGuard的體系結構

如圖2所示,CoreGuard 體系結構包括一個硬體關聯鎖,控制主機處理器和系統其他部分之間的所有通信。硬體連接配接将這些通信彙集到一個政策執行者。

另外,CoreGuard 使用稱為micropolicy 的可更新安全規則,這些規則是在進階别專有語言中建立的簡單管理政策。 這些規則安裝在一個安全的、無法通路的記憶體區域,與其他作業系統或應用程式代碼隔離開來。此外,CoreGuard 還為編譯器通常丢棄的應用程式中繼資料保留一個小的記憶體配置設定,用于為系統中的所有資料和指令生成唯一的辨別符。這些元件在系統啟動時加載。

當一個指令試圖在運作時執行的時候,CoreGuard政策執行核心或主機處理器在特權模式下運作時,将指令的中繼資料與定義的micropolicy交叉引用。 硬體互動隻能確定處理器輸出有效的記憶體或外設指令,進而防止無效代碼的執行。應用程式會被告知類似于一個零除錯誤的政策違規,并通知使用者。

與主機處理器內建,支援指令跟蹤輸出、失速輸入、非可屏蔽中斷(NMI)輸入和中斷輸出所需的所有功能。對于非晶片設計者來說,其CoreGuard技術正被某些 NXP 處理器所設計采用。

消除各種攻擊

在緩沖區溢出的情況下,像 CoreGuard 這樣的技術的好處是顯而易見的。作為經常丢棄的編譯器中繼資料的一部分而捕獲的緩沖區大小可以被合并,以限制攻擊者在網絡上作業系統上通路堆棧的能力。進一步說,同樣的原理可以應用于一般的控制流劫持,因為來自記憶體中不同點的傳回值可以在發生之前受到限制。

實際上,這種實時意識也為安全行業創造了一個新的競争環境。通過在損壞發生之前識别錯誤或者攻擊,使用者可以選擇動态地重新配置設定記憶體,在繼續運作相同程式的同時切換到單獨的、更安全的程式或日志事件。如何執行代碼完全取決于應用程式或業務案例的需要。

何時才能看到zero-day 漏洞的終結呢?!