2009-06-29 31 views
12

Windows如何防止用戶模式線程將CPU任意轉換爲內核模式?Windows如何保護轉換到內核模式?

我瞭解這些東西都是真實的:

  1. 用戶模式線程實際上已轉移到內核模式時,系統調用是通過NTDLL製成。
  2. 向內核模式的轉換是通過特定於處理器的指令完成的。

那麼通過NTDLL這些系統調用有什麼特別之處呢?爲什麼用戶模式線程不能僞造它並執行特定於處理器的指令以轉換到內核模式?我知道我在這裏錯過了一些關鍵的Windows體系結構......它是什麼?

+0

用戶模式線程可以僞造它,但是與僅使用ntdll.dll有什麼不同?在問題中加入更多關於爲什麼這會涉及到你的信息。 – 2009-06-29 16:13:54

+2

我認爲OP是擔心轉換到環0,然後在環0中運行任意非O/S代碼。 – ChrisW 2009-06-29 16:18:58

+1

Windows對它暴露(對用戶模式)參數執行驗證。如果不知道,你就無法傳遞無效數據。是的,有被忽視的角落案件。只是,查找本地特權升級漏洞。有一大堆 – unixman83 2011-09-24 19:57:03

回答

17

您可能認爲以用戶模式運行的線程正在調用Ring 0,但這不是實際發生的事情。用戶模式線程正在引發由Ring 0代碼捕獲的異常。用戶模式線程暫停,CPU切換到內核/環0線程,然後可以檢查用戶模式線程的上下文(例如,調用堆棧和寄存器)以找出要執行的操作。在系統調用之前,它確實是一個異常,而不是調用環0代碼的特殊例外。

如果您接受其他響應的建議並閱讀the Intel manuals,您會看到syscall/sysenter不接受任何參數 - 操作系統決定發生了什麼。你不能調用任意代碼。 WinNT使用映射到用戶模式代碼將執行的內核模式函數的函數編號(例如,NtOpenFile是我的Windows   XP計算機上的fnc 75h(數字始終在變化;它是NTDll的工作之一是映射函數調用一個fnc編號,將它放入EAX,將EDX指向傳入的參數,然後調用sysenter)

9

英特爾CPU使用所謂的「保護環」來強制執行安全措施。

其中有4個,編號從0到3.在ring 0中運行的代碼具有最高權限;它可以(幾乎)根據您的計算機進行任何操作。另一方面,第3環中的代碼始終處於緊繃的狀態;它只有有限的權力來影響事物。而環1和環2目前根本不用於任何目的。

運行在權限較高的環(例如環0)中的線程可以隨意轉換到較低權限環(例如環1,2或3)。但是,相反的過渡是嚴格管制的。這就是如何保持高特權資源(如內存)等的安全性。

自然地,您的用戶模式代碼(應用程序和所有)在環3中運行,而OS的代碼在環0中運行。這確保用戶模式線程不會混淆操作系統的數據結構和其他關鍵資源。請參閱this文章。另外,您可能還需要閱讀英特爾手冊,特別是第1卷和第3A卷,您可以下載here

這是英特爾處理器的故事。我相信其他架構有類似的情況發生。

7

我認爲(我可能是錯的),那它使用過渡的機制很簡單:

  • 用戶模式代碼執行軟件中斷
  • 這個(中斷)使轉移到一個位置在中斷描述符表(IDT)

防止用戶模式代碼篡奪這件事情如下:你需要被授予特權寫入IDT;所以只有內核能夠指定中斷執行時會發生什麼。

4

用戶模式(Ring 3)中運行的代碼不能任意更改爲內核模式(Ring 0)。只能使用特殊路由 - 跳閘,中斷和sysenter向量,這些路由受到高度保護,輸入被清理,以至於不好的數據不能(不應該)導致不良行爲。

所有這些由內核設置,通常在啓動時設置,只能在內核模式下配置,因此User-Mo de代碼不能修改它。

3

這可能是公平的,它以與Linux相似的方式進行。在這兩種情況下,它都是CPU特定的,但在x86上可能是帶有INT指令的軟件中斷,或者是通過SYSENTER指令。

查看Linux如何執行它的優點是,您可以在沒有Windows源許可證的情況下執行此操作。

userspace source part is here here在LXR和 kernel space bit - 看entry_32.S和entry_64.S

在x86上的Linux有三種不同的機制,INT 0x80的,系統調用和SYSENTER。

C庫調用由內核調用vdso在運行時構建的庫來實現syscall函數,該函數根據CPU使用不同的機制以及系統調用它的方式。然後內核擁有這些機制的處理程序(如果它們存在於特定的CPU變體中)。