如果在行程執行 free() 時作業系統沒有重繪 TLB 條目,可能會發生什么?
行程能否看到陳舊的資料,或者另一個行程能否看到不屬于它的資料?記憶體會泄露嗎?
uj5u.com熱心網友回復:
free對于小型分配,通常只會將記憶體塊放在此行程內的空閑串列中(有效地使用全域變數libc來跟蹤此資料結構)。較大的分配通常會將記憶體交還給使用munmap或等效的作業系統;我想這就是你的意思。
通常munmap重繪 此內核和其他可能正在運行同一任務的執行緒的內核上的該頁面的 TLB 條目。(TLB 擊落)。但如果沒有:
對具有 TLB 條目熱的內核的訪問將繼續作業,就好像該行程的該虛擬地址的頁表條目沒有更改一樣。(直到條目被驅逐并且必須重新加載。)仍然允許讀取(如果它是可寫的,則寫入)。
如果頁面被重新用作新行程的內核堆疊,這將是非常糟糕的,因為執行此操作的行程munmap可能會通過修改回傳地址來接管內核。或者如果它是root行程的用戶空間堆疊,也是一樣的。
或者,如果它被重新用作檔案資料的頁面快取(如/etc/passwd或/etc/shadow),您可能能夠修改該資料在 RAM 中的副本,從而使其他行程從該檔案中讀取與磁盤上的內容不匹配的資料。(作業系統可能不會認為頁面快取是臟的,因此可能不會將該檔案資料寫回磁盤。)
或者更改以 root 身份運行的可執行檔案的位元組。例如,以某種方式使其發生,然后sudo如果它最近沒有從磁盤加載,則運行。希望內核會選擇新釋放的頁面來使用。然后修改機器代碼的快取版本,sudo使其被行程映射為 exec 只讀sudo。(例如,在它要求輸入密碼時修改它,當你輸入錯誤的密碼時改變它的作用。)
或者在一個已經運行的行程中,它的一些錯誤處理函式可能很少被執行,并且在一個頁面中還有其他“冷”函式,因此這些函式已經從 RAM 中被逐出。向該行程提供一種罕見的錯誤輸入將使其呼叫其中一個錯誤處理函式,從而觸發硬頁面錯誤以將其從磁盤帶入新頁面。如果它選擇了您的頁面,您現在可以修改其中一個功能的機器代碼并再次觸發相同的錯誤。繁榮,那個行程正在運行你的機器代碼,成功的代碼注入攻擊。
為了增加這些攻擊起作用的機會,分配大量記憶體以使系統的可用記憶體不足。然后觸摸幾頁以啟動 TLB,munmap這些頁面以任何方式使作業系統忘記使它們無效。這些新頁面將是作業系統可用于新分配的大部分內容。
顯然,在任何試圖進行任何型別隔離的作業系統中,這將是一個絕對嚴重的安全漏洞,并且如果與 use-after 結合使用,則可能很容易損壞檔案(以及即將寫入磁盤的檔案系統元資料)的巨大正確性問題-免費的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/514006.html
標籤:Intel Collective 部件缓存x86cpu架构tlb
下一篇:裝配中的邊界檢查是什么樣的?
