共用方式為


處理UMDF 1.x 驅動程式中的用戶端模擬

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的UMDF驅動程式都應該使用UMDF 2撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上對 UMDF 1 的支援有限。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在 Windows 11 版本 22H2 - 2022 年 5 月驅動程式範例更新中找到

如需詳細資訊,請參閱 開始使用UMDF

UMDF 驅動程式通常會在 LocalService 帳戶下執行,而且無法存取需要使用者認證的檔案或資源,例如受保護的檔案或其他受保護的資源。 UMDF 驅動程式通常會在用戶端應用程式與裝置之間流動的命令和數據上運作。 因此,大部分的 UMDF 驅動程式都不會存取受保護的資源。

不過,某些驅動程式可能需要存取受保護的資源。 例如,UMDF 驅動程式可能會從用戶端應用程式提供的檔案將韌體載入裝置。 檔案可能有訪問控制清單 (ACL),可防止未經授權的使用者修改檔案並控制裝置。 不幸的是,此 ACL 也會防止 UMDF 驅動程式存取檔案。

架構提供模擬功能,可讓驅動程式模擬驅動程式的用戶端,並取得用戶端對受保護資源的存取權。

啟用身份模仿

UMDF 驅動程式的安裝套件和用戶端應用程式都必須啟用架構的模擬功能,如下所示:

  • UMDF 驅動程式安裝套件的 INF 檔案必須包含 UmdfImpersonationLevel 指示詞,並設定允許的最高模擬層級。 只有在 INF 檔案包含 UmdfImpersonationLevel 指示詞時,才會啟用模擬。 如需設定模擬層級的詳細資訊,請參閱 在 INF 檔案中指定 WDF 指示詞

  • 用戶端應用程式必須為每個檔案控制代碼設定允許的冒充層級。 應用程式會使用 Microsoft Win32 CreateFile 函式中的品質的服務(QoS)設定來設定允許的模擬身份層級。 如需這些設定的詳細資訊,請參閱 Windows SDK 文件中的 CreateFile 的 dwFlagsAndAttributes 參數。

處理 I/O 要求的冒名頂替

UMDF 驅動程式和架構會依下列順序處理 I/O 要求的模擬:

  1. 司機會呼叫 IWDFIoRequest::Impersonate 方法來指定必要的模擬層級和 IImpersonateCallback::OnImpersonate 回呼函式。

  2. 架構會檢查要求的模擬等級。 如果要求的層級大於 UMDF 驅動程式安裝套件和用戶端應用程式允許的層級,模擬要求就會失敗。 否則,架構會偽裝用戶端,並立即呼叫 OnImpersonate 回呼函式。

OnImpersonate 回調函式只能執行需要所需模擬層級的操作,例如開啟受保護的檔案。

UMDF 不允許驅動程式的OnImpersonate回呼函式呼叫任何框架的物件方法。 這可確保驅動程式不會向其他驅動程式回呼函式或其他驅動程序公開模擬層級。

附註 在 UMDF 1.0 到 1.7 版中,IWDFIoRequest.Impersonate 授予用戶端應用程式和 INF 檔案允許的最高模擬級別,即使驅動程式要求的模擬層級較低也是如此。 在 UMDF 1.9 版及更高版本中,模擬方法僅授予驅動程式要求的模擬層級。

將認證傳遞至驅動程式堆疊

當驅動程式收到 WdfRequestCreate 型別的 I/O 要求時,驅動程式可能會將 I/O 要求向下轉送至核心模式驅動程式。 核心模式驅動程式不具備 IWDFIoRequest::Impersonate 提供給 UMDF 型驅動程式的模擬功能。

因此,如果您想要讓核心模式驅動程式接收用戶端的用戶認證(而不是驅動程式主機進程的認證),驅動程式必須在呼叫 IWDFIoRequest::Send 時設定 WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT 旗標,以將建立要求傳送至 I/O 目標。 Send 方法會在模擬嘗試失敗時傳回錯誤碼,除非驅動程式也會設定 WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE 旗標。

驅動程式不需要先呼叫 #B0 IWDFIoRequest::Impersonate #C1,才能將要求傳送至 I/O 目標。

如果較低階層的驅動程式也轉送請求,則用戶端的模擬層級會向下移動驅動程式堆疊。

減少安全性威脅

若要降低「提高許可權」攻擊的機會,您應該:

  • 嘗試避免使用冒充。

    例如,若要避免使用模擬來開啟驅動程式必須使用的檔案,用戶端應用程式可以開啟檔案,並使用 I/O 作業將檔案內容傳送至驅動程式。

  • 使用驅動程式所需的最低模仿層級。

    將驅動程式 INF 檔案中的模擬層級設定為盡可能低。 如果您的驅動程式不需要任何模擬,請勿在 INF 檔案中包含 UmdfImpersonationLevel 指令。

  • 將攻擊者利用驅動程序的機會降到最低。

    您的 OnImpersonate 回調函式應該包含一小段程式碼,只執行需要模擬的作業。 例如,如果您的驅動程式存取受保護的檔案,則只有在開啟檔案句柄時,才需要模擬。 它不需要模擬來讀取或寫入檔案。