Linux 核心作為系統信任基底,其漏洞影響面極廣。本文從四大經典漏洞類別切入,剖析技術細節、利用條件、修補演進與防禦策略,助開發者與安全研究人員建立核心安全視野。
影響:Linux 2.4/2.6 早期版本,本地用戶獲取 root
技術細節:
brk() 系統呼叫調整堆疊頂端,內部呼叫 do_brk()do_brk() 未驗證 len 參數:無大小上限、無正負檢查、無 addr + len > TASK_SIZE 檢查len,使 vm_area_struct 跨越 TASK_SIZE 邊界,映射核心空間記憶體cred 結構體提權利用鏈:rsync 堆疊溢出 (CVE-2003-0962) 觸發 brk() 擴展 → 核心記憶體覆寫 → 提權
修補演進:
len 邊界檢查security_capable()、LSM (SELinux/AppArmor) 限制 brk 行為vm.mmap_min_addr 防止低位址映射、CONFIG_STRICT_DEVMEM、KPTI (Kernel Page Table Isolation) 隔離用戶/核心頁表概念啟示:用戶空間擴展侵入核心空間 成為新攻擊面,後續發現類似 mremap、mmap、shmat 邊界檢查缺失。
原理:SSE 指令集使用 MXCSR 控制/狀態寄存器,高 16 bits 必須為 0,否則 CPU 產生 #GP 例外導致 Panic
缺陷:核心 get_fpxregs()/set_fpxregs() (ptrace/核心執行緒切換) 處理 MXCSR 時,極端記憶體壓力下複製路徑跳過清零高位
利用條件:需本地登入,觸發特定記憶體佈局,僅造成 DoS,無提權
教訓:核心記憶體複製路徑需原子性保證關鍵位元,不可依賴「正常路徑一定執行」
演算法:rt_hash_code() 僅用 IP 位址位元交換、XOR、位移,無隨機種子
static inline unsigned rt_hash_code(u32 daddr, u32 saddr, u8 tos) {
unsigned hash = ((daddr & 0xF0F0F0F0) >> 4) | ((daddr & 0x0F0F0F0F) << 4);
hash ^= saddr ^ tos;
hash ^= (hash >> 16);
return (hash ^ (hash >> 8)) & rt_hash_mask;
}
攻擊:構造大量特定 (daddr, saddr, tos) 三元組,使所有封包落入同一 hash bucket,鏈表退化 O(n²) 查找,CPU 100%
影響面:路由快取、IP 分片重組、連線追蹤、Perl 5 hash、Squid、IDS/IPS、防火牆 — 所有使用弱 hash 的資料結構
修補:
jhash / siphash + 每啟動隨機種子 (net.core.hash_rnd)hashdist 統計監控、rhash 可調整 hash 函數PERL_HASH_SEED、Python PYTHONHASHSEED程式碼:
static inline u32 *decode_fh(u32 *p, struct svc_fh *fhp) {
int size; // 有號整數!
fh_init(fhp, NFS3_FHSIZE);
size = ntohl(*p++); // 攻擊者控制: 傳入 0xFFFFFFFF (-1)
if (size > NFS3_FHSIZE) // -1 > 1024? False (有號比較)
return NULL;
memcpy(&fhp->fh_handle.fh_base, p, size); // size 轉為無號 size_t -> 巨大複製
fhp->fh_handle.fh_size = size;
return p + XDR_QUADLEN(size);
}
觸發條件:攻擊者需具備 NFS 掛載權限,發送惡意 RPC 封包
後果:核心記憶體破壞 → Panic (DoS),理論可構造 ROP 鏈提權但極難
修補:
unsigned int size / size_tif (size > NFS3_FHSIZE || size < 0) return NULL; 雙重檢查check_add_overflow(), check_mul_overflow() 輔助巨集-fwrapv (有號溢出定義行為)、-ftrapv (執行期陷阱)、CONFIG_UBSAN (Undefined Behavior Sanitizer)| 攻擊 | 原理 | 防禦 |
|---|---|---|
| Blind Spoofing | 預測 ISN 發送偽造資料,無回應通道 | 隨機 ISN (RFC 6528), TCP SYN Cookie |
| Non-blind (Man-in-the-middle) | 攔截回應封包,雙向通訊 | 加密傳輸 (TLS/IPsec), 入站過濾 (BCP 38) |
| Reflection/Amplification | 偽造受害者 IP 向放大器發送請求 (DNS/NTP/SSDP) | 來源位址驗證 (SAV/BCP 38), 速率限制, 關閉開放解析器 |
| TCP RST/FIN Injection | 偽造 RST 斷開連線 | TCP MD5 Signature (RFC 2385), TCP-AO (RFC 5925) |
| 層級 | 技術 | 防禦目標 |
|---|---|---|
| 編譯期 | FORTIFY_SOURCE, CFI (Clang CFI), UBSAN, KASAN, KMSAN | 緩衝區溢出、整數溢出、使用後釋放、未初始化記憶體 |
| 載入期 | Module signature enforcement, Lockdown mode, IMA/EVM | 惡意模組、Rootkit、啟動鏈完整性 |
| 執行期-記憶體 | KPTI, SMEP, SMAP, PXN, KASLR, FG-KASLR, Shadow Stacks (CET) | 核心記憶體洩漏、ROP/JOP、提權 |
| 執行期-控制流 | SELinux/AppArmor, Landlock, seccomp-bpf, Capability bounding | 權限最小化、容器逃逸、横向移動 |
| 網路層 | XDP/eBPF 過濾, TC-BPF, nftables, WireGuard, TLS 1.3 | DDoS、封包欺騙、側信道、中間人 |
linux-kernel 郵件列表、oss-security、CVE/NVD、發行版安全公告 (RHSA/USN/DSA)dnf/yum/apt update kernel、kpatch/kgraft (無重啟熱修補)、容器映像重建kselftest、LTP、自動化回歸測試核心安全無終點,唯有纵深防禦、自動化修補、持續監控、最小權限四大支柱。