防毒軟體在執行。EDR 已經部署。Defender 顯示「您的裝置受到保護」。
但是攻擊者根本不需要繞過它們——他們只要把它們關掉。
不是用社交工程說服使用者關閉。不是利用某個 zero-day。是利用一個你電腦上可能已經有的、Windows 自己信任的、由微軟認可的廠商簽章的合法驅動程式——例如 MSI Afterburner 用來監控顯示卡溫度的那個小工具——讓它執行任意的 kernel 操作,把整個防毒系統的監視機制從記憶體裡刪掉。
這個技術叫 BYOVD(Bring Your Own Vulnerable Driver)。BlackByte、Lazarus、Cuba、BlackCat/ALPHV、AvosLocker、RobbinHood——過去三年最有破壞力的勒索軟體和 APT 攻擊,都用過這招。
這篇文章會從 CPU 的特權模型開始,一路講到 IOCTL handler、kernel callback、Direct Kernel Object Manipulation,把這個攻擊鏈拆給你看。文末會討論 Microsoft 為什麼即使知道這個問題、也沒辦法完全擋住。
Microsoft 維護一份叫 Recommended Driver Block Rules(推薦驅動程式封鎖清單)的文件(來源)。這份清單上的每一條,都是一個「簽章合法、但有可被利用的核心級漏洞」的驅動程式。
清單上有:
RTCore64.sys)——CVE-2019-16098gdrv.sys)——CVE-2018-19320 等dbutil_2_3.sys)——CVE-2021-21551mhyprot2.sys)這些驅動程式全部都通過了 Microsoft 的簽章驗證。這份清單不是「要封鎖的惡意軟體」,是「Windows 自己曾經信任、但被發現可以拿來打進核心的合法軟體」。
要理解這為什麼是個問題,得從 CPU 開始講。
x86/x64 架構的 CPU 有 4 個特權層級,叫 Ring 0 到 Ring 3。這是硬體層的設計,不是軟體規則:
| Ring | 名稱 | 誰在這裡執行 |
|---|---|---|
| Ring 0 | Kernel Mode | OS 核心、device drivers |
| Ring 1 | (現代 OS 不用) | (早期 OS 設計,但 Linux/Windows 沒採用) |
| Ring 2 | (現代 OS 不用) | 同上 |
| Ring 3 | User Mode | 你的瀏覽器、Word、防毒軟體的 UI 部分 |
CPU 的指令集本身就會檢查特權層級。很多指令在 Ring 3 是無法執行的——例如 WRMSR(寫入 Model-Specific Register)、HLT(停止 CPU)、INVLPG(清除 TLB)、直接讀寫物理記憶體。Ring 3 的程式碼想做這些事,必須透過系統呼叫(syscall),讓 CPU 切換到 Ring 0、執行核心提供的服務。
這是個防爆牆:即使 Ring 3 的惡意軟體拿到管理員權限,它仍然不能直接讀寫核心記憶體、不能直接修改其他行程的狀態、不能繞過 OS 的存取控制。它必須請求核心做這些事,而核心會檢查請求是否合法。
只要攻擊者進不到 Ring 0,他能做的事情有上限。
防毒軟體和 EDR 之所以有效,是因為它們有一部分在 Ring 0 執行——所以它們可以在 kernel 層級監視所有 process 的建立、所有 driver 的載入、所有檔案系統的存取。Ring 3 的惡意軟體看不到 EDR 的 kernel 部分、也碰不到。
除非——惡意軟體自己也能進到 Ring 0。
唯一能在 Windows kernel 內執行程式碼的合法管道,是載入 device driver。Driver 是 OS 用來跟硬體(顯示卡、網路卡、印表機...)溝通的程式碼,它必須在 Ring 0 執行才能跟硬體直接互動。
從 Windows Vista 開始,64 位元 Windows 強制要求所有 kernel-mode driver 必須有合法的數位簽章——這個機制叫 Driver Signature Enforcement (DSE)。從 Windows 10 開始,Microsoft 進一步要求所有新的 kernel driver 必須送交 Microsoft 自己簽名(透過 Hardware Dev Center),叫 Kernel Mode Code Signing (KMCS)。
理論上,這個機制應該很安全:
evil.sys 載入到 kernel——沒有合法簽章,DSE 會拒絕問題在於:DSE 檢查的是「這份檔案有沒有合法簽章」,不是「這份檔案的程式碼安不安全」。
任何在過去 15 年內、由任何合法廠商發行、簽過名的 driver——包括那些已經被廠商棄用、有公開 CVE、廠商也不再維護的——仍然會通過 DSE 檢查。
這就是 BYOVD 的入口。
來看 BlackByte 勒索軟體 2022 年的攻擊鏈(Sophos 完整逆向過,來源)。我刻意不寫成可執行的步驟,只描述每一步在系統內發生的事:
BYOVD 不是初始入侵手法。攻擊者必須已經有 local admin 權限才能用這招。通常來自:
重點:BYOVD 是「從 admin 升級到 kernel」的橋梁,不是入口。
BlackByte 的二進位檔案內直接 hardcode 了 RTCore64.sys 的內容(這是 MSI Afterburner 的一個元件)。執行時,它把這個 driver 寫到 %AppData%\Roaming\ 目錄,檔名隨機。
RTCore64.sys 有合法的 Micro-Star International(MSI)數位簽章。Windows 看到這個簽章,會通過。
sc create <random_name> binPath= "<dropped_path>" type= kernel
sc start <random_name>
這需要 admin 權限(SeLoadDriverPrivilege)。Windows 的 service control manager 收到請求後,會把 RTCore64.sys 載入到 kernel——因為它通過 DSE。
到這一步,攻擊者還在 Ring 3。但他現在有一個運作中的 kernel driver 等著被「請求」。
這是技術上最關鍵的一步。
User-mode 程式跟 driver 溝通的標準介面是 IOCTL(I/O Control):user-mode 呼叫 DeviceIoControl() API,傳入一個 IOCTL code 和一塊 buffer,driver 收到後根據 IOCTL code 執行對應的操作。
正常的 driver 會在 IOCTL handler 裡做嚴格的參數驗證——尤其是任何牽涉到記憶體位址的操作。Microsoft 的 Driver Security Checklist 明確要求:「定義允許 caller 讀寫任意 kernel 記憶體位址的 IOCTL code 是危險的」。
RTCore64.sys 就違反了這個規則(CVE-2019-16098 技術分析):
\\.\RTCore64 這個裝置也就是說:攻擊者只要呼叫 DeviceIoControl() 並傳入特定的 IOCTL code,就能讓這個合法的 MSI driver 替他讀寫任何 kernel 位址——包括 Windows 核心結構、其他 driver 的程式碼、防毒軟體的 callback 表。
到這一步,攻擊者實質上有了 kernel R/W 能力——而這一切都是「透過合法簽章的驅動程式」完成的。
Windows kernel 提供了一組 API,讓 driver 可以註冊「通知」,在系統發生特定事件時被呼叫:
| API | 通知時機 |
|---|---|
PsSetCreateProcessNotifyRoutine |
process 被建立或終止 |
PsSetCreateThreadNotifyRoutine |
thread 被建立或終止 |
PsSetLoadImageNotifyRoutine |
DLL 或驅動被載入 |
CmRegisterCallback |
registry 被修改 |
ObRegisterCallbacks |
對特定 object 的 handle 被開啟 |
這就是 EDR 怎麼運作的。 防毒軟體和 EDR 在 kernel driver 裡呼叫這些 API,把自己的 callback 函式登錄進核心。每當系統有 process 建立、檔案被開啟、registry 被改——核心會自動呼叫 EDR 的函式,讓 EDR 決定要不要阻擋、要不要記錄。
這些 callback 的位址被存在 Windows kernel 內部的 array 裡(例如 PspCreateProcessNotifyRoutine 這個變數)。
BlackByte 用 RTCore64.sys 的任意記憶體寫入,直接把這些 array 裡的條目覆寫成零——把 EDR 的眼睛挖掉。
從這一刻起:
Sophos 的逆向發現,BlackByte 內建一份「需要拆 callback 的 EDR/AV 清單」,長度超過 1,000 個產品。這份清單跟開源工具 EDRSandblast 的清單幾乎完全相同——說明攻擊者直接抄了開源 PoC 的程式碼。
防護機制全部拆完之後,BlackByte 才開始投放勒索軟體 payload,加密整個檔案系統。到這個時候,被害人才會看到第一個徵兆——但所有監視機制都已經被悄悄關掉。
過去三年實際被武器化的 driver:
| Driver | 來自 | 漏洞 | 用過的攻擊組織 |
|---|---|---|---|
RTCore64.sys |
MSI Afterburner | CVE-2019-16098 | BlackByte、Cuba、Lazarus |
gdrv.sys |
GIGABYTE | CVE-2018-19320 | RobbinHood(用來關掉 DSE 載入自己的 unsigned rootkit) |
dbutil_2_3.sys |
Dell BIOS 更新工具 | CVE-2021-21551 | UNC3524(APT) |
mhyprot2.sys |
原神反作弊(miHoYo) | 設計上有漏洞 | 多個勒索軟體組織 |
aswArPot.sys |
Avast Antivirus(舊版本) | 設計上有漏洞 | AvosLocker |
procexp.sys |
Sysinternals Process Explorer | 不是漏洞,是設計上的功能 | AuKill(殺 EDR 的工具,被 Medusa Locker、LockBit、Nokoyawa 使用) |
WinRing0 |
多個硬體監控工具 | 開源、提供 MSR 存取 | 多個用來提權 |
procexp.sys 那個案例特別值得停下來想:Microsoft 自己的合法工具,Microsoft 自己簽章,設計上就提供了「終止任何 process」的功能(因為 Process Explorer 本來就是要管理 process 的工具)。AuKill 把這個 driver 載入後,就用它終止所有 EDR/AV 的 user-mode 處理程序——根本沒有「漏洞」這個概念。它做的事情就是 Microsoft 設計它要做的事。
Microsoft 知道這個問題很多年了。他們的對策有四層:
Microsoft 維護一份 XML,內含已知有漏洞的 driver 的 hash 和簽章資訊。Windows 會檢查每個要載入的 driver,如果在這份清單上就拒絕。
限制:
也叫 Memory Integrity。它的設計很巧妙:
這是非常強的防禦——但有限制:
Windows 的 EDR 進程可以被標記為 PPL,讓其他進程(即使是 SYSTEM)不能傷害它的 user-mode 部分。但 BYOVD 是直接在 kernel 動手,PPL 不在這個層級保護。
Defender 有一條 ASR 規則叫 「Block abuse of exploited vulnerable signed drivers」。它會阻止 process 把已知有漏洞的 driver 寫到磁碟上。但對「driver 已經在系統上、攻擊者直接載入」的場景沒幫助。
Linux 的設計哲學不同。Linux kernel 預設不要求 module 必須簽章——你可以 insmod evil.ko 載入任何東西。所以 Linux 早期沒有 DSE 這層,但也不會有 BYOVD(因為攻擊者不需要找有漏洞的舊 driver——他直接載自己的)。
從 Linux 5.4 開始,引入了 Kernel Lockdown LSM(來源),有兩個模式:
啟用 Lockdown 需要:
CONFIG_SECURITY_LOCKDOWN_LSM=y
實務上,啟用 Secure Boot 的 Ubuntu / RHEL / Fedora 預設就在 Lockdown integrity mode——這比 Windows 預設的保護等級更積極。但代價是維護自己的 kernel module 變得複雜(要管理 MOK),所以 server 環境經常會關掉。
個人 Windows 使用者:
企業 IT/資安:
procexp.sys、procexp152.sys 列入封鎖清單——除非有特定的合理使用場景\Device\<driver_name> 的可疑 IOCTL 呼叫模式(許多 EDR 廠商已經把 EDRSandblast / AuKill 加入偵測規則)%AppData% 的——這是 BYOVD 投放的訊號Linux 系統管理員:
CONFIG_MODULE_SIG=y、CONFIG_MODULE_SIG_FORCE=y
init_module() / finit_module() 系統呼叫BYOVD 是個很乾淨的範例,說明為什麼純粹的「簽章驗證」不等於「程式碼安全」。
DSE 的設計沒錯。簽章驗證的目的是「這個 driver 是不是來自你信任的供應商」——這個問題它回答得很好。但攻擊者把問題改成「這個來自合法供應商的 driver 是不是寫得安全」——而簽章機制完全沒辦法回答這個問題。
這也是為什麼**縱深防禦(defense in depth)**這個觀念這麼重要:簽章 + HVCI + Block Rules + EDR + ASR 規則 + 行為監控——任何一層都不夠,必須疊起來才能擋住現代的 kernel 級攻擊。
對於那位看到「您的裝置受到保護」綠色勾勾的使用者來說——那個勾勾的意思是「沒有偵測到威脅」,不是「沒有威脅」。這兩件事之間的距離,就是 BYOVD 攻擊的工作空間。