Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心漏洞深度剖析:權限提升、拒絕服務、整數溢出與 IP 欺騙

編輯:Linux 教學

前言

Linux 核心作為系統信任基底,其漏洞影響面極廣。本文從四大經典漏洞類別切入,剖析技術細節、利用條件、修補演進與防禦策略,助開發者與安全研究人員建立核心安全視野。

一、權限提升漏洞

案例:do_brk() 邊界檢查不足 (CVE-2003-0961)

影響: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() 擴展 → 核心記憶體覆寫 → 提權

修補演進:

  1. 核心 2.6.0-test6 加入 len 邊界檢查
  2. 後續引入 security_capable()、LSM (SELinux/AppArmor) 限制 brk 行為
  3. 現代核心:vm.mmap_min_addr 防止低位址映射、CONFIG_STRICT_DEVMEM、KPTI (Kernel Page Table Isolation) 隔離用戶/核心頁表

概念啟示:用戶空間擴展侵入核心空間 成為新攻擊面,後續發現類似 mremap、mmap、shmat 邊界檢查缺失。

二、拒絕服務漏洞

案例 1:IA32 MXCSR 寄存器處理缺陷 (CVE-2004-0415)

原理:SSE 指令集使用 MXCSR 控制/狀態寄存器,高 16 bits 必須為 0,否則 CPU 產生 #GP 例外導致 Panic

缺陷:核心 get_fpxregs()/set_fpxregs() (ptrace/核心執行緒切換) 處理 MXCSR 時,極端記憶體壓力下複製路徑跳過清零高位

利用條件:需本地登入,觸發特定記憶體佈局,僅造成 DoS,無提權

教訓:核心記憶體複製路徑需原子性保證關鍵位元,不可依賴「正常路徑一定執行」

案例 2:路由快取 Hash 碰撞 DoS (CVE-2003-0567 / Rice Univ. 2003)

演算法: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 的資料結構

修補:

  • 核心 2.6.12+ 引入 jhash / siphash + 每啟動隨機種子 (net.core.hash_rnd)
  • hashdist 統計監控、rhash 可調整 hash 函數
  • 應用層:Perl 5.8.1+ PERL_HASH_SEED、Python PYTHONHASHSEED

三、整數溢出漏洞

案例:NFSv3 XDR 解碼負數大小 (CVE-2003-0453)

程式碼:

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 鏈提權但極難

修補:

  1. 變數改 unsigned int size / size_t
  2. 加入 if (size > NFS3_FHSIZE || size < 0) return NULL; 雙重檢查
  3. 核心通用 check_add_overflow(), check_mul_overflow() 輔助巨集
  4. 編譯器強化:-fwrapv (有號溢出定義行為)、-ftrapv (執行期陷阱)、CONFIG_UBSAN (Undefined Behavior Sanitizer)

四、IP 位址欺騙與 TCP/IP 協議缺陷

根本原因

  • IP 協議不驗證來源位址,路由轉發僅依目的位址
  • TCP 三向交握可被旁路:攻擊者預測 ISN (Initial Sequence Number) 完成握手
  • ICMP 重導向、原始 Socket 允許構造任意封包

攻擊類型

Linux 核心防禦機制

# 1. 反向路徑驗證 (rp_filter)
net.ipv4.conf.all.rp_filter = 1      # Strict mode
net.ipv4.conf.default.rp_filter = 1

# 2. TCP SYN Cookie (防 SYN Flood)
net.ipv4.tcp_syncookies = 1

# 3. 封包過濾 (iptables/nftables)
# 入站: 丟棄私有/保留位址來源
nft add rule ip filter input ip saddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16 } drop
# 出站: 僅允許本機合法位址
nft add rule ip filter output ip saddr != { 本機IP } drop

# 4. 核心編譯選項
CONFIG_INET_RAW_DIAG=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_NETFILTER_INGRESS=y

五、現代核心防禦纵深體系

攻擊原理防禦
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.3DDoS、封包欺騙、側信道、中間人

六、漏洞生命週期管理

  1. 監控:linux-kernel 郵件列表、oss-security、CVE/NVD、發行版安全公告 (RHSA/USN/DSA)
  2. 評估:CVSS 分級、受影響版本 (git log --grep=CVE)、利用代碼公開狀態
  3. 修補:dnf/yum/apt update kernel、kpatch/kgraft (無重啟熱修補)、容器映像重建
  4. 驗證:kselftest、LTP、自動化回歸測試
  5. 追蹤:SBOM (Software Bill of Materials) 記錄核心版本、配置、模組、編譯選項

核心安全無終點,唯有纵深防禦、自動化修補、持續監控、最小權限四大支柱。

Copyright © Windows教程網 All Rights Reserved