W^X(“write xor execute”,發音為 W xor X)是作業系統和虛擬機中的一項安全功能。這是一種記憶體保護策略,行程或內核地址空間中的每個頁面都可以是可寫的或可執行的,但不能兩者兼而有之。
對于為什么這是一個好的安全功能,我的基本觀點是,理論上系統的所有者有機會在內核中,或者特別是在 VirtualAlloc 函式中,掛鉤一些分析函式以在允許新撰寫的代碼之前執行一些安全驗證在機器上執行。
我已經熟悉DEP,但直到現在才意識到它與 Windows 中的 W^X 有關:
Windows 上的可執行空間保護稱為“資料執行保護”(DEP)。在 Windows XP 或 Server 2003 下,NX 保護默認專門用于關鍵 Windows 服務。如果 x86 處理器在硬體上支持此功能,則默認情況下,NX 功能在 Windows XP/Server 2003 中自動打開。如果 x86 處理器不支持該功能,則不提供保護。DEP 的早期實作沒有提供地址空間布局隨機化 (ASLR),這允許潛在的回傳 libc 攻擊,這些攻擊本可以在攻擊期間用于禁用 DEP。
我的印象是 W^X一般適用于 Windows ,不需要配置行程。但我只是注意到VirtualProtect
允許選項PAGE_EXECUTE_READWRITE
,它被記錄為:
啟用對已提交頁面區域的執行、只讀或讀/寫訪問。
這似乎完全違背了 W^X 的概念。那么 W^X 不是 Windows 上強制執行的安全策略,除非啟用了 DEP?
uj5u.com熱心網友回復:
如果您關閉 DEP,則不會強制執行 W^X。當 DEP 打開時,W^X 由所有請求它的記憶體頁面強制執行(當硬體支持它時)。它是 x86 上頁表中的第 63 位,稱為 NX 位。
現在問題變成了,這個位是什么時候設定的?
PE 標頭有一個位指示是否支持 DEP/W^X ( IMAGE_DLLCHARACTERISTICS_NX_COMPAT
),如果支持,則檔案中沒有 write 屬性的代碼部分在將該代碼映射到記憶體時設定 NX 位。
對于在運行時動態分配的記憶體,開發人員可以進行選擇。PAGE_EXECUTE_READWRITE
沒有故意設定 NX 位。如果他們有舊代碼可以動態更改可執行代碼,同時仍然在 PE 上設定了 DEP 位,那么這很有用,因此他們的大部分代碼是 W^X。
uj5u.com熱心網友回復:
早期的 x86 CPU 不支持沒有 eXec 許可的頁面。在傳統的 32 位 x86 頁表中,只有一個用于寫入權限的位,即 R/W 位。(讀取權限始終隱含在有效頁面中,無論該頁面是否可寫)。x86-64 也使用的頁表條目的 PAE 格式添加了一個 NX 位(“no exec”),又名 XD(eXecute Disable)。
作業系統仍然必須決定哪些頁面不可執行。Windows 似乎使用 DEP 來描述將邏輯頁權限實際映射到硬體頁表的功能,由 CPU 強制執行。
在糟糕的過去,當每個可讀頁面都是可執行的時,一些程式可能會草率地告訴作業系統他們希望頁面是可執行的。特別是那些只針對 32 位 x86 的。這就是 Windows 通過要求可執行檔案選擇加入 DEP 來滿足的要求,以表明它們知道并兼容沒有對未明確標記為這種方式的頁面的 exec 權限。
一些作業系統,尤其是 OpenBSD,真正強制執行W^X。例如,mmap(..., PROT_WRITE | PROT_EXEC, ...)
將在 OpenBSD 上回傳錯誤。他們的mmap(2)
手冊頁記錄了這樣的 mmap 或 mprotect 系統呼叫將回傳
[ENOTSUP]
prot
不允許引數中請求的訪問。特別是,除非已掛載檔案系統并且行程在鏈接時標記為 ,PROT_WRITE | PROT_EXEC
否則不允許映射。(另請參閱以了解診斷故障的方法)。wxallowed
wxneeded
kern.wxabort
sysctl(2)
大多數其他作業系統(包括 Linux 和 Windows)允許用戶空間同時創建可寫和可執行的頁面。 但是標準工具鏈和動態鏈接機制默認情況下是為了 W^X 合規性,如果你不使用任何類似gcc -zexecstack
的選項將使作業系統創建一個帶有一些 R|W|X 頁面的程序映像。
例如,較舊的 32 位 x86 Linux 使用 PLT 條目(動態鏈接存根)和jmp rel32
直接跳轉,并重寫機器代碼以具有正確的位移以到達共享庫在??記憶體中加載的任何位置。但是現在,PLT 代碼使用間接跳轉(通過 GOT = 全域偏移表),因此可執行的 PLT 代碼可以位于只讀頁面中。
像這樣的更改已經消除了使用標準工具構建的正常行程中對 write exec 頁面的任何需求。
但在 Windows、MacOS 和 Linux 上,作業系統不強制執行W^X 。VirtualAlloc
像 Windows /VirtualProtect
和它們的 POSIX 等價物mmap
/這樣的系統呼叫mprotect
可以正常作業。
@Ander 的回答說 DEP 不強制執行 W^X,只是讓作業系統在創建 .text / .data / .bss 和堆疊空間的初始映射時尊重可執行檔案中的 exec 權限設定,以及在行程啟動期間的類??似內容.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504371.html
標籤:Intel Collective 视窗 x86 部门