跳到主要內容

ASLR 深度解析:作業系統如何透過記憶體位址隨機化抵禦緩衝區溢位攻擊

什麼是 ASLR?

緩衝區溢位攻擊的核心前提是「攻擊者能預測目標記憶體位址」。ASLR(Address Space Layout Randomization)正是針對這點的作業系統防禦機制——每次程式執行時,將堆疊、堆積、共享函式庫等區段載入至隨機化的記憶體位址,讓攻擊者的跳轉目標失效。

ASLR 如何抵禦攻擊?

傳統緩衝區溢位攻擊(如 ret2libc)需要硬編碼 system()/bin/sh 的固定位址。啟用 ASLR 後,每次執行的 libc 基址皆不同,攻擊者必須先洩漏(leak)記憶體位址才能繼續利用漏洞,大幅提高攻擊複雜度。Linux 核心以 /proc/sys/kernel/randomize_va_space 控制 ASLR 等級:0 為關閉,1 為部分隨機化,2 為完整隨機化(預設值)。

# 查看目前 ASLR 狀態(Linux)
cat /proc/sys/kernel/randomize_va_space

# 執行兩次,觀察 libc 載入位址是否不同
ldd /bin/ls | grep libc
ldd /bin/ls | grep libc

💡 重點整理

  • 隨機化範圍:涵蓋堆疊(stack)、堆積(heap)、共享函式庫(libc 等)三大區段。
  • 必要搭配:ASLR 需與 PIE(Position Independent Executable) 同時啟用,才能隨機化主程式本體位址。
  • 已知限制:32 位元系統熵值(entropy)僅約 16 bits,可被暴力破解(brute-force);64 位元系統熵值達 28~40 bits,實務上難以暴力破解。
  • 常見繞過手法:資訊洩漏(info leak)、部分位址覆寫(partial overwrite)、Heap Spray 等仍可削弱 ASLR 防護效果。

ASLR 是現代作業系統(Linux、Windows、macOS)的標配防禦層。它無法單獨杜絕所有攻擊,但能與 Stack CanaryNX(No-Execute) 共同構成縱深防禦,顯著提高漏洞利用的門檻與成本。

📚 參考文獻

  1. Linux Kernel Documentation — kernel.randomize_va_space 官方說明
  2. PaX Team — ASLR 原始設計文件(PaX Project)
  3. OWASP — Buffer Overflow Attack 技術說明

⚠️ 本文內容基於撰寫時的最新資訊,實際應用時請參考官方文件的最新版本。

留言