- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 1083字
- 2020-10-30 17:56:47
2.6.8 檢測和恢復(fù)
地址空間布局隨機(jī)化(Address Space Layout Randomization,ASLR)是許多操作系統(tǒng)的一項(xiàng)安全功能,其目的是為了防止執(zhí)行任意代碼。該功能對(duì)程序所使用的內(nèi)存頁的地址隨機(jī)化。ASLR不能防止在棧上的返回地址被基于棧的溢出覆寫。然而,通過對(duì)棧頁地址隨機(jī)化,可以防止攻擊者正確地預(yù)測外殼代碼、系統(tǒng)函數(shù),或他們想調(diào)用的面向返回值編程的小工具地址。一些ASLR實(shí)現(xiàn)在每次程序運(yùn)行時(shí)對(duì)內(nèi)存地址隨機(jī)化。因此,如果重新啟動(dòng)該程序(也許是因?yàn)楸罎ⅲ孤┑膬?nèi)存地址就沒用了。
ASLR降低成功攻擊的可能性,但并沒有消除這種可能性。因?yàn)樵诶碚撋希粽呤怯锌赡苷_地預(yù)測或猜測他們的外殼代碼的地址并用這個(gè)值覆寫棧上的返回指針的。
此外,即使基于每次調(diào)用都隨機(jī)化地址的實(shí)現(xiàn),ASLR仍可以被一個(gè)長期運(yùn)行的進(jìn)程上的攻擊者繞過。如果攻擊者能發(fā)現(xiàn)它的地址,他們就可以執(zhí)行他們的外殼代碼,而無須終止進(jìn)程。例如,通過利用一個(gè)格式字符串漏洞或其他信息泄露來顯示內(nèi)存的內(nèi)容,就可以做到這一點(diǎn)。
Linux。ASLR技術(shù)于2000年首次引入到Linux的PaX項(xiàng)目。雖然PaX補(bǔ)丁并沒有被提交到主流Linux內(nèi)核,但它的許多功能都被納入主流的Linux發(fā)行版。例如,自2008年以來和自2007年以來的ASLR一直是Ubuntu和Debian的一部分。這兩個(gè)平臺(tái)都允許通過下面的命令對(duì)ASLR進(jìn)行精細(xì)的調(diào)優(yōu):
sysctl -w kernel.randomize_va_space=2
大多數(shù)平臺(tái)在引導(dǎo)過程中執(zhí)行此命令。randomize_va_space參數(shù)可能會(huì)取以下值:
0.完全關(guān)閉ASLR。這僅在不支持此功能的平臺(tái)上是默認(rèn)的。
1.對(duì)棧、庫和位置無關(guān)的二進(jìn)制程序打開ASLR。
2.對(duì)堆以及對(duì)由選項(xiàng)1隨機(jī)化的內(nèi)存打開ASLR。
Windows。自從Vista以來,ASLR一直在Windows中可用。在Windows中,當(dāng)系統(tǒng)啟動(dòng)后,ASLR把可執(zhí)行映像移動(dòng)到任意位置,使利用代碼更難執(zhí)行可預(yù)見的操作。對(duì)于一個(gè)支持ASLR技術(shù)的組件,它加載的所有組件也必須支持ASLR。例如,如果A.exe依賴于B.dll和C.dll,那么所有這三個(gè)程序都必須支持ASLR。默認(rèn)情況下,Windows Vista和Windows操作系統(tǒng)的后續(xù)版本對(duì)系統(tǒng)的動(dòng)態(tài)鏈接庫(DLL)和可執(zhí)行文件(EXE文件)進(jìn)行隨機(jī)化。然而,自定義DLL和EXE的開發(fā)人員必須選擇使用/DYNAMICBASE鏈接器選項(xiàng)以支持ASLR。
Windows的ASLR也隨機(jī)化堆和棧內(nèi)存。堆管理器會(huì)在一個(gè)隨機(jī)位置創(chuàng)建堆,以幫助減少企圖利用基于堆的緩沖區(qū)溢出的漏洞利用獲得成功的機(jī)會(huì)。對(duì)運(yùn)行于Windows Vista和更高版本上的所有應(yīng)用程序,默認(rèn)情況下,堆隨機(jī)化都是啟用的。當(dāng)一個(gè)線程在一個(gè)用/DYNAMICBASE鏈接的進(jìn)程中啟動(dòng)時(shí),Windows Vista和更高版本的Windows把線程的棧移動(dòng)到一個(gè)隨機(jī)位置,以幫助減少基于棧的緩沖區(qū)溢出的利用代碼獲得成功的機(jī)會(huì)。
要在Microsoft Windows下啟用ASLR,你應(yīng)該遵循如下規(guī)范。
·用微軟的鏈接器版本8.00.50727.161(第一個(gè)支持ASLR的版本)或更高版本來鏈接
·用/DYNAMICBASE鏈接開關(guān)鏈接,若使用微軟鏈接器版本10.0或更高版本,則默認(rèn)啟用/DYNAMICBASE
·在Windows Vista和更高版本測試你的應(yīng)用程序,并記錄和修復(fù)由于使用ASLR產(chǎn)生的故障
- Android Development with Kotlin
- MySQL 8 DBA基礎(chǔ)教程
- 編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議
- Swift 3 New Features
- Windows Presentation Foundation Development Cookbook
- Python程序設(shè)計(jì)案例教程
- Learn React with TypeScript 3
- R語言與網(wǎng)絡(luò)輿情處理
- 響應(yīng)式架構(gòu):消息模式Actor實(shí)現(xiàn)與Scala、Akka應(yīng)用集成
- WordPress Search Engine Optimization(Second Edition)
- 軟件測試技術(shù)
- 零基礎(chǔ)學(xué)SQL(升級(jí)版)
- 基于MATLAB的控制系統(tǒng)仿真及應(yīng)用
- Mastering Unity 2017 Game Development with C#(Second Edition)
- Elasticsearch實(shí)戰(zhàn)(第2版)