地址空間布局隨機化(ASLR)是一項增加安全性的技術,攻擊者發現漏洞之後開始編寫exploit時如果要考慮繞過ASLR這會增加編寫exploit的難度,最早是2001年Grsecurity社區(強悍的社區,直到今天還在為各種各樣的加固為自由軟件安全社區作出持續而傑出的貢獻)針對GNU/Linux的PaX補丁中出現,後來GNU/Linux內核對用戶態地址隨機化的支持在2005年的2.6.12版本合並到了mainline,但直到今天內核中還是使用固定的虛擬地址。2011年的時候,Dan Rosenberg提議增加內核ASLR的功能但後來一直沒有實施下去,最近Kees Cook向社區提交內核地址隨機化的補丁,社區可能會在最近把這個補丁合並到mainline upstream repo裡去。
繞過ASLR並不是一門新的技術,早在2002年的Phrack Issue 59中就已經有一篇論文詳細的描述了原理和細節,個人認為內核空間的ASLR是非常有必要的,在內存和硬盤上隱藏內核空間地址是一個暫時的方案,比如:
測試平台:SUSE Linux Enterprise Server 11 SP2
[檢查默認的內核配置]
* 從硬盤鏡像上獲得地址
www.linuxidc.com @linuxidc:~> grep do_fork /boot/System.map-3.0.42-0.7-default ffffffff81058cd0 T do_fork
ffffffff8143959a t do_fork_idle
* 從內存中獲得地址
www.linuxidc.com @linuxidc:~> cat /proc/kallsyms | grep do_fork
ffffffff81058cd0 T do_fork
ffffffff8143959a t do_fork_idle
[簡單的加固]
* 使用root執行:
linux-7kz0:/home/shawn # chmod o-r /boot/System.map-3.0.42-0.7-default
linux-7kz0:/home/shawn # sysctl -w kernel.kptr_restrict=1
[驗證結果]
www.linuxidc.com @linuxidc:~> grep do_fork /boot/System.map-3.0.42-0.7-default grep: /boot/System.map-3.0.42-0.7-default: Permission denied
www.linuxidc.com @linuxidc:~> cat /proc/kallsyms | grep do_fork 0000000000000000 T do_fork 0000000000000000 t do_fork_idle
這個方法只能針對特殊定制的內核,但對於發部分GNU/Linux發行版,內核鏡像都是一樣的,攻擊者可以通過其他方式獲得固定地址,KASLR可以在一定程度上延緩攻擊者的速度,但實現上可能帶給內核一些副作用,有人堅決反對在內核空間實現地址隨機化。