ASLR在Windows與Linux系統之間的差別

2021-06-25 16:51:49 字數 2321 閱讀 8572

hi **們,我在

上篇文章

中討論了linux平台上nx的特性。我們已經知道一般情況下nx(windows平台上稱其為dep)和位址空間分布隨機化(aslr)會同時工作,所以也值得看一下aslr在linux平台是如何工作的。事實證明,linux上aslr的實現與windows上的有些顯著的差異。

在windows平台,aslr不會影響執行時的效能,只是會拖慢模組載入的速度。根據文件《windows isvsoftware security defenses》的描述,要使windows上的程式或庫相容aslr特性,只需要在鏈結時新增了/dynamicbase選項。

通常情況下,aslr不會影響效能,在某些執行32位系統的場景中甚至會有一些效能提高。但是在執行比較慢的系統中,當有很多需要載入到隨機位址時,可能會產生卡頓現象。因為要考慮影象的資料和大小等因素,我們很難量化aslr對效能的影響。但是其對堆或棧隨機化的效能影響可以說是微乎其微的。

因此,我們當然沒有理由在鏈結時不使用/dynamicbase選項來啟用aslr了。啟用/dynamicbase後,模組的載入位址是隨機的,也就沒那麼容易受到rop(returnoriented programming)攻擊了。所以我們建議所有windows應用程式在編譯時都啟用dep和aslr,以及其它在文件《windows isv software security defenses》中指出的所有安全屬性。如果程式在編譯時沒有使用/dynamicbase選項,使用者也可以通過使用微軟的emet強制其啟用aslr。

在linux平台,aslr會給系統帶來效能損耗,這種損耗在x86架構上尤其大,也最容易被感知。要使linux程式在執行時相容aslr,其在編譯時必須指定pie(positionindependent executable)選項。根據**《toomuch pie is bad for performance》[pdf],「我們的分析顯示,32位的x86系統上過量的pie會帶來高於基準26%的效能開銷,而一般平均開銷(統計資料)為10%左右。

大概是由於這種潛在的效能損失,linux發行版並沒有對所有可執行檔案啟用pie特性。例如,在ubuntu系統上,「在擁有少量暫存器的架構上(如x86)pie有較大(5%-10%)效能損耗,所以這種特性只用於那些事關安全的重要的軟體包……」

redhat系統也持

類似觀點:

fedora工程指導委員會(the fedora engineering steering committee)維護著乙個保守的軟體包列表,這個列表中的軟體在編譯時必須使用gcc的安全特性。不在這個列表中的軟體,其安全特性在軟體包的描述中啟用。目前對哪些二進位制程式需要使用這些安全增強特性還沒有達成乙個共識,因此這種程式的使用也就成了乙個有爭議的話題。大多數爭論可以簡單概括為使用這些安全特性帶來的效能損耗是否值得。

既然aslr的目標是使可執行程式在執行時位於乙個不可預知的位址,為什麼windows上與linux上的實現會有這麼大的差別呢?很重要的一點是windows上的aslr是乙個鏈結時(link-time)選項,而在linux上是乙個編譯時(compile-time)選項。

在windows上,**在執行時因重定位才被patch。但在linux與unix的世界,該技術被稱為text重定位。在linux上,aslr用不同的方式實現,除了在**執行時patch,其在編譯時就用某種方式使其位址無關。也就是說,可以將其載入到記憶體位址的任意位置,都可以正常執行。

至少在x86平台,這種位址無關功能是通過乙個通用暫存器實現的,而程式少用乙個暫存器就無法正常執行了。這種限制在暫存器少的架構上最明顯,如x86平台。

為什麼linux開發者選擇使用這種技術實現aslr?在大多數情況下,安全其實就是一種權衡。由於text重定位涉及到patching,載入這種模組會觸發「寫時拷貝(copy-on-write)」,因此增加了系統的記憶體占用。位址無關**不需要patching,因此不會觸發「寫時拷貝」。要了解linux上位址無關**的實現細節,以及其與載入時(load-time)重定位的比較,可以參考eli bendersky的博文:《positionindependent code (pic) in shared libraries》。

對大多數linux使用者來說這意味著什麼?

1.在大部分linux發行版上,aslr並不像在windows系統上那麼普遍。

2.在linux系統上沒辦法強制啟用aslr特性,但在windows上用emet可以做到。

讀者需要了解的是,隨著時間的推移,該特性在x86架構上正變得沒那麼重要了。因為位址無關**不會使x86_64架構產生明顯效能損耗,因為x86_64幾乎有兩倍於x86架構的暫存器,而且與x86架構不同,x86_64架構支援pc相關的位址策略,可以使系統對aslr的使用幾乎變得無處不在。

感謝the pax team對本文提供的資訊。

other links:  

ASLR在Windows與Linux系統之間的差別

hi 們,我在上篇文章中討論了linux平台上nx的特性。我們已經知道一般情況下nx windows平台上稱其為dep 和位址空間分布隨機化 aslr 會同時工作,所以也值得看一下aslr在linux平台是如何工作的。事實證明,linux上aslr的實現與windows上的有些顯著的差異。在wind...

windows遠端ssh與scp操作linux

1 安裝winscp與putty,兩個要放在乙個目錄下。前者負責scp,後者負責ssh。2 winscp使用方法一目了然 3 putty輸入 顯示中文需要進行設定。a 把伺服器端預設編碼改為gb2312。以下是偶的linux端 etc sysconfig i18n lang zh cn.gb1803...

ASLR 與 PIE 的同與異

對於 aslr 和 pie 一直沒有系統歸納,部分概念時常混淆,做個筆記記錄一下。aslr 是 linux作業系統的功能選項,作用於程式 elf 裝入記憶體執行時。是一種針對緩衝區溢位的安全保護技術,通過對載入位址的隨機化,防止攻擊者直接定位攻擊 位置,到達阻止溢位攻擊的一種技術。檢視當前系統asl...