Linux 內核中的記憶體損壞漏洞指南
網路攻擊的主要動機是經濟利益,這導致攻擊者提出新技術來持續訪問數據。儘管此類攻擊的頻率和複雜性不斷增加,但記憶體損壞漏洞仍然是持續四十年的主要問題。
管理員可以利用他們對記憶體損壞的瞭解來保護其基礎架構免受網路攻擊者的侵害。本指南旨在為管理員提供必要的知識,以了解記憶體損壞及其在漏洞利用情況下的後果。
什麼是Linux內核漏洞?
Linux 內核容易受到各種記憶體問題的影響。以下基於記憶體的漏洞是攻擊者關注的焦點,也是每月發佈的許多安全補丁的基礎。如果您想知道為什麼特定漏洞需要關鍵補丁,這些問題可能會導致嚴重的數據洩露。
緩衝區溢出
當開發人員在將數據分配給變數之前未能驗證變數時,就會發生緩衝區溢出。當數據超過變數的定義容量時,會發生「溢出」,允許攻擊者將自己的代碼注入相鄰的記憶體空間。如果沒有適當的數據驗證,緩衝區溢出可能導致攻擊者獲得根訪問許可權或能夠執行遠程代碼。
由於Linux是用C編寫的,因此它容易受到緩衝區溢出的影響,這與Python和Java等其他程式設計語言不同,它們不容易受到溢出攻擊。
CVE-2023-0179 是緩衝區溢出漏洞的一個示例。此問題可能允許堆疊和堆位址洩漏,並可能允許通過任意代碼執行將本地許可權提升給根使用者。
整數溢出
開發人員根據所使用的數據類型定義可以存儲在整數變數中的最大值。例如,32 位無符號整數變數可以存儲介於 0 到 4,294,967,295 之間的值,而有符號整數可以存儲介於 −2,147,483,648 和 2,147,483,647 之間的值。但是,如果代碼添加的值超過變數的最大限制,則會發生“溢出”,從而導致意外結果。
例如,如果語句嘗試將 1 加到存儲值 2,147,483,647 的變數,則結果將是負值 -2,147,483,648。同樣,如果負整數溢出,則會產生正數。無符號整數的行為取決於所使用的程式設計語言,但在 C 語言的情況下,結果通常是不可預測的。
CVE-2022-0998 是 Linux 內核 virtio 設備驅動代碼中發現的整數溢出漏洞。本地使用者可利用此缺陷造成崩潰或可能提升其在系統上的許可權。
記憶體損壞
開發人員和伺服器管理員經常發現Linux內核中的記憶體損壞是一個具有挑戰性的問題。這種損壞可能導致不可預測的行為,並且在某些情況下,不會引發任何錯誤。當開發人員無意中更改記憶體中的數據或修改指向存儲數據的特定記憶體位置的指標時,會出現此問題。
CVE-2023-1073 是在Linux內核的人機介面設備 (HID) 子系統中發現的記憶體損壞漏洞的一個範例。本地攻擊者可利用此缺陷造成崩潰或可能提升其在系統中的許可權。
拒絕服務
分散式拒絕服務 (DDoS) 攻擊廣為人知,攻擊者利用多個被劫持的設備用流量淹沒目標,從而導致伺服器崩潰。
但是,任何干擾服務的攻擊都稱為拒絕服務 (DoS) 攻擊。記憶體管理不當通常會導致基於記憶體的 DoS 攻擊,稱為資源耗盡攻擊。這些漏洞可能是有害的,如果伺服器上存在這些漏洞,則會導致影響數千名使用者的關鍵服務崩潰。
CVE-2023-1390 是在Linux內核的TIPC內核模組中發現的遠端拒絕服務漏洞的一個示例。此缺陷允許遠端攻擊者造成拒絕服務。
空指標取消引用
在 C 程式設計中,指標是儲存值的記憶體位址的變數,而不是值本身。這允許開發人員操作存儲在特定記憶體位置的值,即使與該位置關聯的變數超出範圍也是如此。
當應用程式嘗試通過它假定有效但實際上為 NULL 的指標訪問記憶體位置時,會發生 NULL 指標取消引用。這可能會導致應用程式崩潰或意外終止。
CVE-2022-47929 是Linux內核網路佇列規則實現中發現的NULL指標取消引用漏洞。此漏洞允許本地攻擊者造成拒絕服務(系統崩潰)。
初始化前使用
當函數使用變數修改或創建資料時,必須首先使用值初始化變數本身。如果未為變數賦值,則認為該變數已初始化,如果在程式中引用,則會導致未定義的行為。
來自未初始化數據的未定義行為很難檢測,因為 C 編譯器不需要診斷或拋出錯誤。大多數開發人員使用測試或模糊測試工具來識別可能導致未定義錯誤問題的未初始化數據。
CVE-2022-29968 是在Linux內核中發現的先使用後初始化漏洞的一個示例,其中io_uring子系統缺少 kiocb->private 初始化。此缺陷允許本地攻擊者暴露敏感資訊(內核記憶體)。
最危險的記憶體漏洞是什麼?
每年,MITRE 都會發佈其 25 大最危險的軟體弱點報告。請注意,此報告包括基於 Web 的攻擊,但三個最常見和最危險的記憶體漏洞是:
- 緩衝區溢出
- 導致緩衝區溢出的整數溢出
- 指標取消引用(缺少指標檢查)
所有這三個漏洞都可能導致嚴重的數據洩露。記憶體損壞漏洞是迄今為止一些最大的數據洩露事件的原因。最近的一份情報報告的一個重要發現是,大約72%的攻擊是特定於應用程式和Web應用程式的攻擊。攻擊者可以識別代碼中的問題並創建漏洞以利用此漏洞,因為開源程式經常包含在依賴代碼中,或者是主要應用程式本身。
該報告的第三個有趣的統計數據是,21%的攻擊針對技術部門。敏感信息必須由技術部門存儲、聯網、保護和傳輸。通過專注於這一領域,攻擊者可能會訪問存儲數據的基礎設施並謹慎地濫用它,可能會使公司暴露數月。
如何識別記憶體損壞漏洞?
記憶體損壞通常是開發人員錯誤的結果,但在一台計算機上運行多個應用程式的情況下,確定哪個應用程式導致問題可能具有挑戰性。識別 Linux 中的錯誤的一種方法是檢查系統日誌,操作系統在其中檢測到任何問題。
例如,Linux 為 BIOS 保留前 64 KB 記憶體,操作系統會掃描對此記憶體空間所做的任何修改。如果 Linux 檢測到對此保留記憶體所做的任何更改,則會記錄一條警告,供管理員解決問題。
由於Linux是一個開源操作系統,研究人員報告了許多基於記憶體的漏洞。最近的一個發現是“BleedingTooth”漏洞,該漏洞使具有目標計算機 bd 位址的攻擊者能夠使其崩潰,從而導致拒絕服務 (DoS)、提升許可權並可能獲得對加密密鑰的訪問許可權。
安全研究人員使用各種工具和技術來查找軟體中的錯誤,包括仔細審查代碼和使用模糊測試等掃描工具來觸發可以報告給開發人員的錯誤。識別漏洞后,開發人員會修補代碼,併發佈安全更新來解決此問題。
你如何修復記憶體損壞?
幸運的是,Linux 已經實現了多種安全功能來説明防止記憶體損壞,包括內核位址空間布局隨機化、控制流完整性和內核頁表隔離。但是,儘管具有這些緩解功能,操作系統及其依賴項仍然容易受到攻擊。
緩解技術因發現的漏洞而異,但臨時解決方案通常涉及禁用關鍵元件。例如,在 Heartbleed 事件期間,管理員可以禁用 OpenSSL 中使用的檢測信號,以便在用戶端和伺服器之間進行通信。雖然這暫時解決了問題,但任何需要來自伺服器的檢測信號的應用程式都會遇到意外的結果,例如崩潰或拒絕服務。
但是,臨時緩解技術不是永久性的,必須應用修補程式才能永久停止利用此漏洞。安全補丁會更新代碼,但它們需要重新啟動系統,從而導致停機。因此,系統管理員通常會延遲修補漏洞,直到維護視窗可用,從而導致迄今為止一些最嚴重的數據洩露。
如何保護您的基礎架構免受記憶體損壞漏洞的影響?
由於管理員任由開發人員擺布,因此他們必須採取正確的措施來阻止攻擊者。您可能無法控制代碼,但管理員可以採取正確的步驟來最大程度地減少網路的攻擊面並避免成為下一個目標。以下是管理員可以阻止基於記憶體的攻擊的幾種方法:
- 定期運行漏洞掃描。漏洞掃描將識別問題,包括已公開報告的問題。發現漏洞后,可以安裝修補程式。
- 在將任何第三方應用程式提升到生產伺服器之前,對其進行全面測試。
- 使用 KernelCare 的即時補丁快速應用最新的安全補丁,而無需重新啟動。
結論
檢測基於記憶體的漏洞具有挑戰性,即時修補對於提供最佳錯誤保護至關重要。 KernelCare Enterprise 提供即時修補服務,無需管理員延遲修補。它會自動修補各種版本的Linux,而不會停機或中斷,確保關鍵基礎設施在等待維護視窗時不會受到漏洞的影響。

