不用 ROP、不用 shellcode:
摘要
這份研究報告提供了針對三星 KantS2 智慧電視韌體中發現的重大權限提升漏洞的完整技術分析。調查重點在於不安全的核心驅動程式介面,這些介面將原始實體記憶體存取暴露給無特權的使用者。透過利用「physmap」核心操作,攻擊者可以繞過現代的資安緩解措施,例如未經授權執行預防 (Unauthorized Execution Prevention, UEP),並透過純資料攻擊 (data-only attack) 取得 root 層級的存取權。此報告詳細說明了漏洞的根本原因、利用方法,以及自動化工具在識別這些缺陷時的策略性運用。
1. 簡介
現代智慧電視的資安架構通常依賴於沙箱(Sandboxing)與核心層級限制的組合,以保護敏感的使用者資料和系統完整性。以使用三星 Tizen 作業系統的 KantS2 平台為例,主要的防禦機制是未經授權執行預防 (UEP),它限制從檔案系統執行未簽章的執行檔 [1] 。然而,廠商專屬核心驅動程式的複雜性常常引入意料之外的攻擊面。此報告分析了如何透過利用整合到三星韌體中的 Novatek 驅動程式堆疊的漏洞,將瀏覽器應用程式環境中的據點提升為完整的系統 root 權限。
2. 技術環境與限制
目標環境具有幾個執行限制,這些限制決定了漏洞利用的策略。瀏覽器程序 (process) 在受限的資安環境中運作,因此需要多階段的方法來達成權限提升。
| 組件 | 技術規格 |
|---|---|
| 平台 | Samsung KantS2 (Tizen OS) |
| 架構 | ARMv7l (32-bit) |
| 資安緩解措施 | 未經授權執行預防 (UEP) |
| 攻擊面 | 全域可寫入的裝置節點:/dev/ntksys, /dev/ntkhdma |
為了繞過 UEP,攻擊者使用
memfd_create
wrapper,這允許直接從記憶體執行 binary,從而繞過對磁碟上簽章檔案的需求
[1]
。此外,資訊收集是透過
/proc/cmdline
進行,以重建實體 RAM 佈局,因為在瀏覽器環境中對
/proc/iomem
的直接存取通常受到限制。
3. 漏洞分析:Physmap 核心操作
核心漏洞位於
/dev/ntksys
驅動程式中,這是 Novatek 堆疊的一個組件。該驅動程式提供了一個用於管理系統記憶體的介面,但未能對使用者提供的參數實施充分的驗證。該驅動程式使用一個名為
ST_SYS_MEM_INFO
的結構來儲存記憶體映射請求。
- /*
- * Source: ker_sys.h
- * Detailed Annotation:
- * This structure is used to pass physical memory mapping requests
- * from user space to the kernel driver.
- */
- typedef struct {
- u32 u32Addr; /* User-controlled physical start address */
- u32 u32Size; /* User-controlled size of the memory region */
- /* ... other fields ... */
- } ST_SYS_MEM_INFO;
漏洞位於
ker_sys.c
中的 IOCTL 處理邏輯。當使用者程序 (process) 提交映射請求時,驅動程式會儲存實體位址和大小,而不驗證請求的範圍是否與特權核心記憶體或其他敏感區域重疊。
- /*
- * Source: ker_sys.c (Simplified Write Path)
- * Detailed Annotation:
- * The driver accepts the physical address (u32Start) and size (u32Size)
- * directly from the user-provided structure without range validation.
- */
- static long ntksys_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
- ST_SYS_MEM_INFO user_info;
- copy_from_user(&user_info, (void __user *)arg, sizeof(ST_SYS_MEM_INFO));
- /* VULNERABILITY: No check on user_info.u32Start or user_info.u32Size */
- g_mem_table[index].phys_addr = user_info.u32Start;
- g_mem_table[index].size = user_info.u32Size;
- return 0;
- }
隨後在
/dev/ntksys
上的
mmap
操作會使用這些未經驗證的值,透過
remap_pfn_range
將任意的實體記憶體映射到呼叫者的位址空間。這提供了一個強大的「physmap」核心操作,允許攻擊者讀取和寫入 CPU 可存取到的任何實體記憶體位址
[1]
。
4. 漏洞利用策略:純資料攻擊 (Data-Only Attack)
與依賴劫持 (hijacking) 核心控制流程(例如透過緩衝區溢位或 Use-After-Free)的傳統漏洞利用不同,此攻擊是「純資料攻擊 (data-only)」。它利用 physmap 核心操作直接修改記憶體中的關鍵核心資料結構。主要目標是
cred
結構,該結構定義了程序 (process) 的權限。
/dev/ntksys] B --> C[Gather Memory Layout:
/proc/cmdline] C --> D[Validate Physmap Primitive
via /dev/ntkhdma] D --> E[Scan Physical RAM
for 'cred' Structure] E --> F[Overwrite UID/GID with 0] F --> G[Achieve Root Shell]
漏洞利用過程首先使用
/dev/ntkhdma
來獲取一個已知有效的實體位址(例如 DMA buffer),以驗證
ntksys
映射是否正常運作。一旦驗證成功,攻擊者就會掃描從開機參數識別出的 RAM 視窗,尋找瀏覽器程序 (process) 的
cred
結構。這個結構是透過搜尋與瀏覽器使用者(例如 UID 5001)關聯的特定 UID 和 GID 模式來識別的。
這種方法與其他核心漏洞(例如在防毒驅動程式中發現的 Double-Fetch 缺陷)有概念上的相似之處 [2] 。雖然三星電視漏洞是直接缺乏驗證而非 race condition,但兩者都利用核心對使用者空間資料的信任來達成區域權限提升 (LPE)。
5. 實作與結果
最終的攻擊包含一個記憶體掃描器和一個修補程式。掃描器會逐一處理實體記憶體範圍,將它們以區塊 (chunk) 方式映射,並搜尋目標的認證 (Credential) 模式。
- /*
- * Exploit Helper: Credential Scanner (Conceptual)
- * Detailed Annotation:
- * This code maps physical memory chunks and searches for the
- * browser's UID (5001) to locate the 'cred' structure.
- */
- void find_and_patch_creds(uint32_t start_phys, uint32_t size) {
- void *mapped = map_phys_mem(start_phys, size);
- for (int i = 0; i < size - sizeof(struct cred); i++) {
- struct cred *c = (struct cred *)(mapped + i);
- if (c->uid == 5001 && c->gid == 100) {
- /* Found the target: Zero out IDs to become root */
- c->uid = c->gid = c->euid = c->egid = 0;
- printf("Success: Root privileges achieved.\n");
- return;
- }
- }
- }
成功覆寫
cred
結構後,瀏覽器程序 (process) 的身份將轉變為 root 使用者 (UID 0)。接著,攻擊者可以啟動 shell 或以完整的系統權限執行任何指令。此攻擊鏈的有效性證明了,即使沒有核心程式碼執行漏洞,不安全的記憶體管理介面也可能導致系統完全被攻陷。
6. 結論
對三星 KantS2 平台的分析顯示,嵌入式系統的安全性常常受到廠商專屬驅動程式的破壞,這些驅動程式繞過了標準的核心資安檢查。
ntksys
驅動程式未能驗證實體記憶體範圍,為權限提升到 root 提供了直接路徑,使得其他如 UEP 的資安緩解措施變得無效。為了減輕此類風險,核心驅動程式必須對所有使用者提供的位址和大小實施嚴格的驗證,並且應使用強健的 DAC/MAC 政策來限制對敏感裝置節點的存取。