當前位置:
首頁 > 知識 > ASLR 是如何保護 Linux 系統免受緩衝區溢出攻擊的

ASLR 是如何保護 Linux 系統免受緩衝區溢出攻擊的

ASLR 是如何保護 Linux 系統免受緩衝區溢出攻擊的

打開今日頭條,查看更多圖片

地址空間隨機化(ASLR)是一種內存攻擊緩解技術,可以用於 Linux 和 Windows 系統。了解一下如何運行它、啟用/禁用它,以及它是如何工作的。

-- Sandra Henry-stocker

地址空間隨機化(Address Space Layout Randomization)(ASLR)是一種操作系統用來抵禦緩衝區溢出攻擊的內存保護機制。這種技術使得系統上運行的進程的內存地址無法被預測,使得與這些進程有關的漏洞變得更加難以利用。

ASLR 目前在 Linux、Windows 以及 MacOS 系統上都有使用。其最早出現在 2005 的 Linux 系統上。2007 年,這項技術被 Windows 和 MacOS 部署使用。儘管 ASLR 在各個系統上都提供相同的功能,卻有著不同的實現。

ASLR 的有效性依賴於整個地址空間布局是否對於攻擊者保持未知。此外,只有編譯時作為 位置無關可執行文件(Position Independent Executable)(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

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

【每日安全資訊】三個4G/5G漏洞曝光:可攔截電話和追蹤用戶位置
極客漫畫:Windows 更新

TAG:Linux技術 |