共用方式為


狀態分隔

狀態區隔是改善的服務和安全性模型,其使用更清楚的安全性界限來:

  • 協助提高關鍵系統區域的安全性
  • 啟用更快速且更簡潔的更新和系統重設

此模型會用於所有 Factory OS 映射中。 安全性界限會依下列狀態分類:

State 描述 範例
除非操作系統本身,否則無法永久變更此區域。
  • 操作系統二進位檔
  • 登錄區: HKLM\SYSTEMHKLM\SOFTWARE
可變動、高價值 您可以進行變更,並預期它們會在重新啟動或更新之後保存,但無法在系統重設之後保存
  • 系統設定
  • 記錄檔
  • 程序數據。
    注意:使用 API 或環境變數,例如 %PROGRAMDATA% 參考這些資料夾。 如果您的程式代碼包含像是 C:\Program Data\ 或寫入其他系統區域的絕對路徑,寫入作業可能會因為存取違規而失敗。
可變動、低值 您可以進行變更,但它們會在重新啟動或系統重設后消失。 某些元件可能需要寫入登錄區,例如 HKLM\SYSTEMHKLM\SOFTWARE。 這些登錄區域會載入為揮發性,因此您的元件仍然可以針對特定運行時間執行寫入作業。 下次重新啟動時,變更將會消失。
用戶數據 可以變更。 每個用戶數據配置檔都會在自己的分割區上加密,因此變更只會影響使用者登入
  • NT 使用者配置檔
  • 登錄區: HKCU

針對處理站測試,在數據分割或 %PROGRAMDATA%中儲存記錄檔和其他測試檔案是可以的。

狀態分隔違規

狀態區隔違規會在:

  • 元件會嘗試寫入MainOS磁碟區上的檔案系統。
  • 元件會 HKLM\SYSTEM 寫入 或 HKLM\SOFTWARE 登錄區。

為了協助您開發符合這些規則的元件,每當元件嘗試寫入其中一個位置時,Windows 都可以記錄。

請注意,因為 Windows 追蹤寫入作業不一定表示發生問題:元件有時會刻意寫入HKLM\SYSTEMHKLM\SOFTWARE或登錄區,預期變更會變動。

檢測

有幾個方法可以收集登錄和文件系統活動的記錄。 判斷要使用的適當方法取決於使用案例,以及在開機順序中,驅動程序變成作用中時。 下表摘要說明何時使用每個方法來尋找狀態分隔和 驅動程式隔離 違規。

方法 何時要執行? 它找到什麼?
早期開機自動記錄器 想要尋找 驅動程式驗證器找不到的檔案 違規,或想要查看相同追蹤中的檔案和登錄違規 所有檔案違規和大部分的登錄違規
隨選記錄器 想要尋找 驅動程式驗證器找不到的檔案 違規,或想要查看相同追蹤中的檔案和登錄違規 所有檔案違規和大部分的登錄違規
開機追蹤 想要有導致違規的詳細堆疊資訊 所有檔案和登錄作業,不論其是否為違規
驅動程式驗證器驅動程式隔離檢查 想要在裝置啟動、一般驅動程序測試和/或認證測試期間尋找所有登錄違規 沒有檔案違規和所有登錄違規

違規的實時檢視

追蹤狀態分離違規最簡單的方法是透過 Windows 裝置入口網站即時檢閱 Windows 事件追蹤(ETW)。

注意

提供此遙測的篩選驅動程式可能會在元件之後載入。 如果您的元件在開機程式中很早地練習,您將需要查看下一節。

  1. 登入受測裝置上的 Windows 裝置入口網站
  2. 移至左側的 [ETW 記錄] 索引標籤。
  3. 在 [自定義提供者] 下,啟用下列提供者:d6e1490c-c3a6-4533-8de2-18b16ce47517
  4. 重現您的案例。 違規會出現在數據表中。
  5. 當您收集到足夠的數據時,請按兩下 [儲存至檔案 ] 以取得包含所擷取違規的文字檔(.csv)。 使用下載的數據通常比進行即時分析更容易。

早期開機 AutoLogger

使用早期開機 AutoLogger 來擷取在開機路徑中早期執行的作業 ETW 追蹤:

  1. 使用 TShell 連線到裝置。

  2. 執行 Tracelog 以設定自動記錄器以接聽提供者 GUID:d6e1490c-c3a6-4533-8de2-18b16ce47517。

    將緩衝區設定為128 KB,至少12個緩衝區和最多34個緩衝區(較低的值可能會導致卸除事件)。

    針對會話 GUID,您可以使用 來產生 GUIDuuidgen,然後在它之前新增數位符號(#),或者您可以提供包含 GUID 的檔名。

    您可以在任何地方儲存記錄檔,不過我們建議在使用者或應用程式資料資料夾中使用位置,例如 -f %ProgramData%\Fabrikam\log.etl

    Tracelog.exe -addautologger StateSeparationViolationsAutologger -sessionguid #aabbccdd-1234-5678-90ab-a00bb00ccdd -f %ProgramData%\Fabrikam\log.etl -guid #d6e1490c-c3a6-4533-8de2-18b16ce47517 -b 128 -min 12 -max 34
    
  3. 重新啟動裝置以開始自動記錄程序追蹤會話

  4. 使用 TShell 連線到裝置。

  5. 停止自動記錄器:

    Tracelog.exe -stop StateSeparationViolationsAutologger
    
  6. 取得 ETL 檔案並檢閱資料:

    a. 擷取裝置 ProgramData 目錄的值(例如 , E:\ProgramData

    cmd-device -InformationVariable echoInfo echo %ProgramData% $deviceProgramData = $echoInfo[0]
    

    b. 使用此值,將 ETL 檔案從裝置複製到本機電腦。 範例:

    PS C:\> getd E:\ProgramData\Fabrikam\log.etl C:\hostdir\log.etl
    
  7. 檢閱使用 Windows Performance Analzyer (WPA) 或其他工具的追蹤記錄活動數據。

隨選記錄器

使用隨選記錄器來擷取隨選 ETW 追蹤。

  1. 設定記錄會話以接聽提供者 GUID d6e1490c-c3a6-4533-8de2-18b16ce47517:

    Tracelog.exe -start StateSeparationViolations -f <path to save ETL> -guid #d6e1490c-c3a6-4533-8de2-18b16ce47517
    
  2. 重現您的案例或執行測試(只要裝置未重新啟動)。

  3. 停止記錄會話。

    Tracelog.exe -stop StateSeparationViolations
    
  4. 從裝置複製 ETL 檔案。

    PS C:\> getd C:\ProgramData\Fabrikam\log.etl C:\hostdir\log.etl
    
  5. 開啟記錄檔,並使用 Windows 效能分析器 檢閱追蹤記錄活動數據。

開機追蹤

在正確設定早期開機 ETW 追蹤之後,所有登錄作業和/或檔案作業都可以在追蹤中擷取,並針對每個作業擷取堆疊,詳細說明導致該登錄作業的程式代碼路徑。

  1. 使用 TShell 連線到裝置

  2. 註冊開機追蹤 (登錄、fileio 或兩者)

    wpr -boottrace -addboot registry
    wpr -boottrace -addboot fileio
    
  3. 重新啟動裝置以開始擷取追蹤。

  4. 再次使用TShell連線到裝置。

  5. 停止追蹤:

    wpr -boottrace -stopboot <path where to write ETL>
    
  6. 從裝置複製 ETL 檔案。

    PS C:\> getd C:\<path on device to the>\log.etl C:\hostdir\log.etl
    
  7. 開啟記錄檔,並使用 Windows 效能分析器 開啟追蹤記錄活動數據。

  8. 在 WPA 中,告知它載入符號,以便在堆疊追蹤中解析正在調查的二進位檔,然後開啟登錄摘要數據表。

    建議您篩選數據表,只顯示 SYSTEM 和 SOFTWARE Hives 的作業。 如果檢視 [基底機碼樹狀目錄] 資料行,請展開 [登錄],然後展開 [MACHINE]。 多重選取 [系統 ] 和 [軟體],以滑鼠右鍵按下並選取 [ 篩選至選取專案]。

    我們建議您將數據表篩選為只將堆疊牽涉到正在調查的二進位檔的作業。 此篩選可以在篩選之上完成,只對上述建議的 SYSTEMSOFTWARE Hive 進行篩選。 按兩下 [ 堆疊] 資料行,然後開啟搜尋方塊。 輸入正在調查的二進位檔名稱,然後按兩下 [ 尋找全部]。 以滑鼠右鍵按兩下堆疊中包含二進位名稱的其中一個醒目提示行,然後選取 [ 篩選至選取範圍]。

驅動程式驗證器驅動程式隔離檢查

驅動程式驗證器 (DV) 是隨附於 Windows 的工具,可用來監視驅動程式是否有不正確的函式呼叫或可能損毀系統的動作。 從OS組建19568開始,驅動程式驗證器具有新功能,可藉由監視驅動程式套件隔離需求的違規,來支援Windows驅動程式開發人員。 驅動程式套件隔離是處理站OS系統上必須遵循的主要需求驅動程式,才能遵守狀態區隔需求。

驅動程式驗證器會監視 Factory OS 系統上不允許的登錄讀取和寫入不當。 在驅動程序開發初期使用此工具,瞭解並修正您的元件違反驅動程序隔離需求的位置。

語法:

注意

如果在處理站OS系統上啟用,請參閱 使用SSH連線以透過SSH 從遠端連線到處理站OS系統

verifier /rc 33 36 /driver myDriver.sys

這會啟用目標驅動程式的驅動程式隔離檢查(myDriver.sys)。 您也可以使用空白分隔清單來選取多個驅動程式:

verifier /rc 33 36 /driver myDriver1.sys myDriver2.sys

需要重新啟動,才能啟用驗證設定。 您可以藉由指定下列方式來執行此動作:

shutdown /r /t 0

預期的行為 - 遙測模式

在驅動程序啟動的初始階段, 這些檢查的建議行為是遙測模式。 這是預設行為,而且會提供一種方式讓開發人員檢視所有違規,而不會造成錯誤檢查中斷進度。

建議使用上一節中指定的語法來啟用 DV 驅動程式隔離檢查,並附加核心調試程式。 重新啟動啟用 DV 設定之後,您將能夠在核心調試程式輸出中看到違規。

以下是驅動程式違反驅動程式隔離需求的幾個範例案例,以及一般輸出的外觀:

案例:使用完整絕對路徑的 ZwCreateKey:

「DRIVER_ISOLATION_VIOLATION:驅動程式名稱>:<登錄作業不應該使用絕對路徑。 偵測到建立未解決的登錄機碼 '\Registry\Machine\SYSTEM'”

案例: ZwCreateKey 使用相對於不是來自已核准 API 之句柄的路徑:

「DRIVER_ISOLATION_VIOLATION:驅動程式名稱>:<登錄作業應該只使用從 WDF 或 WDM API 傳回的金鑰句柄。 偵測到建立未解決的登錄機碼 '\REGISTRY\MACHINE\SYSTEM\SomeKeyThatShouldNotExist'”

利用遙測模式為您的元件建立所有違規的基準,並開始逐一修正這些違規,並隨用測試。

預期的行為 - Bucheck 模式:

此外,在驅動程式開發程式中,啟用驅動程式隔離檢查在模式中可能會明顯顯示違規,這十分有價值。 DV 可以設定為在違規發生時引發檢查。

這會產生記憶體轉儲,提供違規發生位置的精確詳細數據。 若要在錯誤檢查模式中啟用 DV,請使用下列語法:

verifier /onecheck /rc 33 36 /driver myDriver1.sys

當驅動程式接近生產整備程度,且正在進行驗證和測試的最後階段時,此模式很有用。

最大化程式代碼路徑:

DV 驅動程式隔離規則可以在 IHV 執行其現有的測試架構期間啟用。 這有助於最大化所測試驅動程式所練習的程式代碼路徑。

透過命令行進行裝置基本概 念測試是測試的良好基準,可用來練習驅動程式的一般程式代碼路徑。 開發人員可以使用 DV 驅動程式隔離檢查來啟用這些測試,以盡可能儘早攔截驅動程式隔離違規的可能性。

開發模式:停用強制

為了開發目的,您可以在狀態分離開發模式中執行 ,以關閉強制狀態分離。 這可讓您開發、測試及執行不符合需求的應用程式和驅動程式(例如原廠測試應用程式)。

在開發模式中:

  • MainOS 分割區是可寫入的。
  • 中的 HKLM\SYSTEM變更,並在 HKLM\SOFTWARE 重新啟動時保存。
  • Windows 會繼續監視會中斷狀態分隔規則的活動。

您可以在映像建立時設定開發模式,方法是將 功能取代為 STATESEPARATION_DEVMODESTATESEPARATION_ON

下表詳細說明每個模式之間的差異。

狀態分離模式 不可變檔案系統存取 不可變的登錄存取
強制執行模式 不允許寫入 登錄變更不會在重新啟動時保存
ETW 和調試程序輸出中的違規警告 ETW 和調試程序輸出中的違規警告
開發模式 允許讀取/寫入 登錄變更會在重新啟動時持續發生
ETW 和調試程序輸出中的違規警告 ETW 和調試程序輸出中的違規警告