ASLR 是如何保護 Linux 系統免受緩衝區溢位攻擊的
地址空間隨機化(ASLR)是一種記憶體攻擊緩解技術,可以用於 Linux 和 Windows 系統。瞭解一下如何執行它、啟用/禁用它,以及它是如何工作的。
地址空間隨機化(ASLR)是一種作業系統用來抵禦緩衝區溢位攻擊的記憶體保護機制。這種技術使得系統上執行的程式的記憶體地址無法被預測,使得與這些程式有關的漏洞變得更加難以利用。
ASLR 目前在 Linux、Windows 以及 MacOS 系統上都有使用。其最早出現在 2005 的 Linux 系統上。2007 年,這項技術被 Windows 和 MacOS 部署使用。儘管 ASLR 在各個系統上都提供相同的功能,卻有著不同的實現。
ASLR 的有效性依賴於整個地址空間佈局是否對於攻擊者保持未知。此外,只有編譯時作為位置無關可執行檔案(PIE)的可執行程式才能得到 ASLR 技術的最大保護,因為只有這樣,可執行檔案的所有程式碼節區才會被載入在隨機地址。PIE 機器碼不管絕對地址是多少都可以正確執行。
ASLR 的侷限性
儘管 ASLR 使得對系統漏洞的利用更加困難了,但其保護系統的能力是有限的。理解關於 ASLR 的以下幾點是很重要的:
- 它不能解決漏洞,而是增加利用漏洞的難度
- 並不追蹤或報告漏洞
- 不能對編譯時沒有開啟 ASLR 支援的二進位制檔案提供保護
- 不能避免被繞過
ASLR 是如何工作的
透過對攻擊者在進行緩衝區溢位攻擊時所要用到的記憶體佈局中的偏移做了隨機化,ASLR 加大了攻擊成功的難度,從而增強了系統的控制流完整性。
通常認為 ASLR 在 64 位系統上效果更好,因為 64 位系統提供了更大的熵(可隨機的地址範圍)。
ASLR 是否正在你的 Linux 系統上執行?
下面展示的兩條命令都可以告訴你的系統是否啟用了 ASLR 功能:
$ cat /proc/sys/kernel/randomize_va_space
2
$ sysctl -a --pattern randomize
kernel.randomize_va_space = 2
上方指令結果中的數值(2
)表示 ASLR 工作在全隨機化模式。其可能為下面的幾個數值之一:
0 = Disabled
1 = Conservative Randomization
2 = Full Randomization
如果你關閉了 ASLR 並且執行下面的指令,你將會注意到前後兩條 ldd
的輸出是完全一樣的。ldd
命令會載入共享物件並顯示它們在記憶體中的地址。
$ sudo sysctl -w kernel.randomize_va_space=0 <== disable
[sudo] password for shs:
kernel.randomize_va_space = 0
$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
如果將其重新設定為 2
來啟用 ASLR,你將會看到每次執行 ldd
,得到的記憶體地址都不相同。
$ sudo sysctl -w kernel.randomize_va_space=2 <== enable
[sudo] password for shs:
kernel.randomize_va_space = 2
$ ldd /bin/bash
linux-vdso.so.1 (0x00007fff47d0e000) <== first set of addresses
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1cb7ce0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1cb7cda000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cb7af0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1cb8045000)
$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffe1cbd7000) <== second set of addresses
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fed59742000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed5973c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed59552000)
/lib64/ld-linux-x86-64.so.2 (0x00007fed59aa7000)
嘗試繞過 ASLR
儘管這項技術有很多優點,但繞過 ASLR 的攻擊並不罕見,主要有以下幾類:
- 利用地址洩露
- 訪問與特定地址關聯的資料
- 針對 ASLR 實現的缺陷來猜測地址,常見於系統熵過低或 ASLR 實現不完善。
- 利用側通道攻擊
總結
ASLR 有很大的價值,尤其是在 64 位系統上執行並被正確實現時。雖然不能避免被繞過,但這項技術的確使得利用系統漏洞變得更加困難了。這份參考資料可以提供 在 64 位 Linux 系統上的完全 ASLR 的有效性 的更多有關細節,這篇論文介紹了一種利用分支預測 繞過 ASLR 的技術。
via: https://www.networkworld.com/article/3331199/linux/what-does-aslr-do-for-linux.html
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:leommxj 校對:wxy
相關文章
- 緩衝區溢位攻擊
- 緩衝區溢位攻擊是什麼意思?防禦措施有哪些?
- 如何保護企業免受黑客攻擊?黑客
- 緩衝區溢位實驗
- 如何保護Windows網路免受勒索軟體攻擊Windows
- 緩衝區溢位小程式分析
- Kernel Stack棧溢位攻擊及保護繞過
- 保護您的資料免受網路攻擊的技巧
- Redis緩衝區溢位及解決方案Redis
- oscp-緩衝區溢位(持續更新)
- 如何保護您不瞭解的資料資產免受網路攻擊?
- 做個試驗:簡單的緩衝區溢位
- 緩衝區溢位漏洞的原理及其利用實戰
- pwntools緩衝區溢位與棧沒對齊
- 緩衝區溢位漏洞那些事:C -gets函式函式
- 微軟釋出 ElectionGuard 開源軟體,保護美國大選系統免受攻擊微軟
- 嵌入式學習資源——突破C++的虛擬指標-C++程式的緩衝區溢位攻擊C++指標
- 一鍵遮蔽惡意IP!保護你的伺服器免受攻擊伺服器
- CVE 2015-0235: GNU glibc gethostbyname 緩衝區溢位漏洞
- CVE-2010-2883-CoolType.dll緩衝區溢位漏洞分析
- [譯文]4種簡單的方法保護您的公司免受網路攻擊
- 保護你的 Fedora 系統免受這個 DHCP 漏洞
- 探秘“棧”之旅(II):結語、金絲雀和緩衝區溢位
- 棧溢位漏洞利用(繞過ASLR)
- MikroTik RouterOS 中發現了可遠端利用的緩衝區溢位漏洞ROS
- 使用SRI保護你的網站免受第三方CDN惡意攻擊網站
- Linux 命令 管道 緩衝區Linux
- Smart海外代理—IP是如何保護跨境電商店鋪不被攻擊的?
- iOS移動應用安全加固:保護您的App免受惡意攻擊的重要步驟iOSAPP
- Linux核心記憶體保護機制:aslr和canaryLinux記憶體
- AFP溢位攻擊模組afp/loginext
- MS15-002 telnet服務緩衝區溢位漏洞分析與POC構造
- 加密你的資料並使其免受攻擊者的攻擊加密
- cc攻擊是什麼?如何防護
- 如何保護網路免受DOS和DDOS的侵害呢?
- 什麼是CC攻擊?如何有效防護?
- 基於BIGINT溢位錯誤的SQL隱碼攻擊SQL
- 汽車經銷行業如何免受網路攻擊行業