Tamiz Uddin

Originally published on tamiz.pro.

簡介

GhostLock 漏洞(CVE-2023-1228)揭露了 Linux 核心中一個可追溯至 2008 年的堆疊 use-after-free(UAF)缺陷。這個存在 15 年之久的錯誤凸顯了記憶體安全與核心開發所面臨的重大挑戰。了解其運作機制,能為安全系統程式設計提供重要啟示。

什麼是堆疊 Use-After-Free?

use-after-free 指的是軟體在所參照的記憶體已被釋放後,仍然繼續使用該記憶體指標。在堆疊上,這會變得特別危險,因為:

  1. 堆疊記憶體會快速被重複使用
  2. 函式返回指標經常位於附近
  3. 攻擊者可覆寫控制流程結構
// Simplified UAF example
void vulnerable_function() {
    char *ptr = malloc(100);
    free(ptr);
    // Vulnerability window
    strcpy(ptr, "exploit"); // Use after free
}

Enter fullscreen mode Exit fullscreen mode

GhostLock 技術分析

此漏洞存在於 Linux 的 tty_ldisc 結構處理中。以下是利用鏈:

  1. 初始化:使用 TTSL_DEFAULT 規範配置 tty 結構
  2. 雙重釋放:觸發 tty_ldisc 參照計數中的競爭條件
  3. 堆疊樞紐:透過已釋放的堆疊指標覆寫返回位址
  4. 權限提升:以核心權限執行任意程式碼

記憶體時間軸

Stack Layout Before Free:
[refcount] -> 2
[tty_disc] -> TTY_LDISC

Race Window:
Thread 1: decrement refcount to 0
Thread 2: use_discipline()

Stack Layout After Free:
[refcount] -> 0 (freed)
[tty_disc] -> attacker-controlled data

Enter fullscreen mode Exit fullscreen mode

利用模式

攻擊者利用此漏洞來:

  • 覆寫核心控制結構
  • 在使用者空間與核心空間之間製造競爭條件
  • 透過 gadget chaining 繞過 SMEP/SMEP 保護
; x86_64 ROP gadget example
pop rdi; ret
mov eax, 1; int 0x80
; Used to bypass kernel protections

Enter fullscreen mode Exit fullscreen mode

緩解策略

Linux 透過以下方式修補此漏洞:

  1. 參照計數修正
// Before
ldisc_put(ldisc);

// After
atomic_dec_and_lock(&ldisc->users, &ldisc->lock);

Enter fullscreen mode Exit fullscreen mode

  1. 堆疊 Canary 改進(於 5.10 核心中引入)
  2. KASAN(Kernel Address Sanitizer) 用於執行時期偵測

開發者要點

  1. 在核心模組開發中務必驗證參照計數
  2. 在使用者空間測試中使用 Valgrind 或 AddressSanitizer 等工具
  3. 針對競爭條件實作適當的鎖定機制
  4. 遵循 Linux Kernel Self Protection Project (LKSP) 指南

結論

GhostLock 展示了關鍵系統中記憶體安全問題的長期風險。透過研究這些模式,開發者可以實作更強健的防禦式程式設計實務。靜態分析工具、執行時期保護與徹底的程式碼審查的結合,對於安全的核心開發仍然至關重要。