Linux 高風險漏洞 Copy Fail 解讀與修補
| | | 0 | |
4 月底,資安公司 Theori 揭露 Linux 核心有個高風險漏洞 CVE-2026-31431 ,其嚴重程度評分高達 7.8 分,影響範圍甚度,2017 迄今的多個主流版本都受影響,遍及 Ubuntu、Amazon Linux、RHEL、SUSE...。問題源於 Linux 核心處理加密驗證 authencesn 時存在個邏輯漏洞,其利用門檻不高,不必製造 Race Window/Kernel-Specific Offset 情境,不需網路存取或預先安裝指令,即可完成本機提權 (Local Privilege Escalation,讓一般使用者具有管理者權限)。由於這個邏輯漏洞允許對任何檔案的分頁快取 (Page Cache) 寫入 4 個 Byte,資安研究人員實測只需一支 732 Bytes 的 Python 惡意程式,便能透過修改 setuid 權限執行檔 (如:/usr/bin/passwd、/usr/bin/su) 取得 root 權限。(參考:Linux系統核心存在高風險漏洞Copy Fail,本機使用者能藉此奪取root權限,廣泛影響多個主流Linux版本 by iThome)
這個漏洞源自 2017 年 7 月左右,Linux 核心有個 Commit 72548b093ee3(crypto: algif_aead - operate in-place where possible),將 AEAD (Authenticated Encryption with Associated Data) 操作改為 In-Place 處理以優化效能,但未正確處理 Source 和 Destination 來自不同 Memory Mappings 的情況。2026 年 4 月,Theori / Xint Code 研究人員發現並公開,並附了攻擊成功的 PoC 影片。
目前 Upstream Kernel 在 2026 年 4 月初做了 Revert 退回 Out-of-Place 操作,主要 stable 版本陸續納入修補 (例如 6.19.12、6.18.22 等,舊 LTS 版本也有對應 backport)。
我對 Linux 核心了解有限,本次漏洞爆發點 Kernel Crypto API / 使用者空間存取介面 AF_ALG 我聽都沒聽過,聽到這個消息,只想知道:惡意程式可能的攻擊手法?如何檢查確認 Linux 版本存在漏洞?未升級核心前是否有 Workaround?如何升級並確認版本安全?
以下是門外漢的研究心得:(如發現有錯,歡迎指正)
惡意程式可能的攻擊手法
攻擊者首先會建立一個 AF_ALG 類型的通訊端 (Socket),並指定使用 aead (如 gcm(aes)),使用 splice() 呼叫讀取 /usr/bin/sudo 等 setuid 權限執行檔,因為 algif_aead 邏輯有錯,檔案分頁快取的頁面會被當成加解密操作的目標輸出緩衝區。 接著攻擊者提供一串「偽造的加密資料」,核心解密資料,並嘗試將結果寫入預先設定好的目標緩衝區(剛才被 splice 載入的檔案頁面)完成覆寫,後續 AEAD 的驗證標籤 (Authentication Tag) 比對會因資料是偽造而發生失敗,但攻擊者已成功覆寫四個 Byte,而且修改僅發生在快取記憶體,檔案不會有痕跡,造成事後鑑識困難。
雖然只能覆寫 4 個位元組,但透過精心設計還是可以搞出很多花樣,篡改 ELF 標頭或指令,拿掉 sudo 某個 if 條件邏輯,讓 sudo 不問密碼直接升級到 root 權限... 等等。 由以上看來,前題是攻擊者有能力在系統跑程式完成建立 Socket、splice() 讀檔、呼叫解密等動作,並非知道主機 IP 就能進攻,不需過度恐慌。如何知道目前的版本是否有漏洞
執行uname -a可顯示包含核心版本的 Linux 版本資訊:

參考作業系統官方資訊,確認已完成修補的版號:(我的 debian13 要升到 6.12.85-1 才安全)

未升級核心前的 Workaround
若一時無法升級,可先modprobe -r algif_aead停用 algif_aead 模組。
大多數常見應用程式(如網頁瀏覽器、SSH 伺服器、資料庫)多是使用 OpenSSL、NSS 或 GnuTLS 等第三方程式庫,不會直接呼叫核心加密介面。因此,禁用此模組大多數系統不致受影響,但特定 VPN 工具如 strongSwan 的某些插件會利用 AF_ALG 來存取核心加密引擎,可能會無法建立加密隧道。
另外,有些加密硬體、加解密工具(如 cryptsetup)是少數會因 algif_aead 模組關閉受影響的功能。如何升級核心及確認完成修補
以 Debian/Ubuntu 為例,sudo apt update && sudo apt full-upgrade應該就可以了:(註:full-upgrade 舊稱 dist-upgrade,會處理複雜的依賴關係,確保新版本的 Linux 核心被正確下載並安裝)

更新完核心sudo reboot重開機,再次檢查uname -a看到核心版本已更新,修補完成。

Comments
Be the first to post a comment