Windows 安全性功能測試
測試應用程式,確認它使用 Windows 安全性功能及強式 ACL。
背景
變更預設的 Windows 安全性保護會讓客戶面臨較高的風險。
測試詳細資料
執行 BinScope 二元分析器與 Attack Surface Analyzer 以測試應用程式的安全性。
修正動作
疑難排解並修正測試所找到的問題。重新建置並重新測試應用程式。
BinScope 二元分析器測試
BinScope 二元分析器測試會檢驗應用程式的二進位檔,檢查編碼和建置做法是否讓應用程式較不容易受到攻擊或是做為攻擊媒介。
BinScope 二元分析器測試會檢查是否正確使用下列安全性相關的功能:
- AllowPartiallyTrustedCallersAttribute
- /SafeSEH 例外狀況處理保護
- 資料執行防止
- 位址空間配置隨機載入
- 讀取/寫入共用的 PE 區段
- AppContainerCheck
- ExecutableImportsCheck
- WXCheck
AllowPartiallyTrustedCallersAttribute
**Windows 應用程式認證套件錯誤訊息:**APTCACheck 測試失敗
AllowPartiallyTrustedCallersAttribute (APTCA) 屬性可從已簽署組件中部分信任的程式碼,存取可完全信任的程式碼。當您對組件套用 APTCA 屬性時,部分信任的呼叫者可以在該組件存留期內存取組件,如此會危害安全性。
如果您的應用程式未通過這個測試,應該怎麼辦?
請勿在強式命名的組件上使用 APTCA 屬性,除非您的專案需要,而且您充分了解風險。若有必要,請務必使用適當的程式碼存取安全性要求來保護所有 API。當組件是 Windows 市集應用程式的一部分時,APTCA 沒有任何作用。
備註
這個測試只會在 Managed 程式碼 (C#、.NET 等) 執行。
/SafeSEH 例外狀況處理保護
**Windows 應用程式認證套件錯誤訊息:**SafeSEHCheck 測試失敗
當應用程式發生像是除以零錯誤的例外狀況時,例外處理常式就會執行。因為呼叫函式時,在堆疊儲存例外處理常式的位址,所以如果有些惡意軟體意欲覆寫該堆疊,就會讓緩衝區溢位攻擊者有機可趁。
如果您的應用程式未通過這個測試,應該怎麼辦?
建置您的應用程式時,在連結器命令中啟用 /SAFESEH 選項。在 Visual Studio 的發行組態中,這個選項預設會處於開啟。針對您應用程式中的所有可執行檔模組,確認建置指示中的這個選項已經啟用。
備註
測試不會在 64 位元的二進位檔或 ARM 晶片組二進位檔上執行,原因是兩者不會在堆疊上儲存例外處理常式位址。
資料執行防止
**Windows 應用程式認證套件錯誤訊息:**NXCheck 測試失敗
這個測試會確認應用程式不會執行儲存在資料區段中的程式碼。
如果您的應用程式未通過這個測試,應該怎麼辦?
建置您的應用程式時,在連結器命令中啟用 /NXCOMPAT 選項。在支援資料執行防止 (DEP) 的連結器版本中,這個選項預設會處於開啟。
備註
建議您在支援 DEP 的 CPU 上測試應用程式,並修正由 DEP 所導致的任何失敗。
位址空間配置隨機載入
**Windows 應用程式認證套件錯誤訊息:**DBCheck 測試失敗
位址空間配置隨機載入 (ASLR) 會將可執行檔映像載入記憶體中無法預期的位置,使惡意軟體難以預測會在哪個特定虛擬位址載入程式來運作。您的應用程式與其所使用的所有元件都必須支援 ASLR。
如果您的應用程式未通過這個測試,應該怎麼辦?
建置您的應用程式時,在連結器命令中啟用 /DYNAMICBASE 選項。確認您應用程式使用的所有模組也都使用這個連結器選項。
備註
通常 ASLR 不會影響效能。但在某些情況下,可稍微改善 32 位元系統上的效能。系統若將許多影像載入多個不同的記憶體位置而發生嚴重壅塞,可能會使效能降低。
這個測試只能在以 Managed 程式碼 (如 C# 或 .NET Framework) 撰寫的應用程式上執行。
讀取/寫入共用的 PE 區段
**Windows 應用程式認證套件錯誤訊息:**SharedSectionsCheck 測試失敗。
含有標示為共用可寫入區段的二進位檔便是一個安全性威脅。除非必要,否則不要建置含有共用可寫入區段的應用程式。使用 CreateFileMapping 或 MapViewOfFile 建立有適當安全保護的共用記憶體物件。
如果您的應用程式未通過這個測試,應該怎麼辦?
從應用程式中移除任何共用的區段,然後搭配適當的安全性屬性來呼叫 CreateFileMapping 或 MapViewOfFile 以建立共用的記憶體物件,然後重新建置您的應用程式。
備註
這個測試只能在以 Unmanaged 語言 (如 C 或 C++) 撰寫的應用程式上執行。
AppContainerCheck
**Windows 應用程式認證套件錯誤訊息:**AppContainerCheck 測試失敗。
AppContainerCheck 會確認可執行二進位檔的可攜式執行檔 (PE) 標頭中的 appcontainer 位元已設定。 Windows 市集應用程式必須在所有 .exe 檔案和所有 Unmanaged DLL 上設定 appcontainer 位元才能正確執行。
如果您的應用程式未通過這個測試,應該怎麼辦?
如果原始可執行檔未通過這個測試,請確定您使用了最新的編譯器和連結器來建立檔案,並在連結器上使用 /appcontainer 旗標。
如果 Managed 可執行檔未通過測試,請確定您使用了最新的編譯器和連結器 (如 Microsoft Visual Studio) 來建置 Windows 市集應用程式。
備註
這個測試會在所有 .exe 檔案和 Unmanaged DLL 上執行。
ExecutableImportsCheck
**Windows 應用程式認證套件錯誤訊息:**ExecutableImportsCheck 測試失敗。
如果可攜式執行檔 (PE) 映像的匯入表格被放置到可執行程式碼區段中,就無法通過這個測試。 如果您將 Visual C++ 連結器的 /merge 旗標設成 /merge:.rdata=.text 以對 PE 映像啟用 .rdata 合併,就會發生這種情形。
如果您的應用程式未通過這個測試,應該怎麼辦?
不要將匯入表格合併到可執行程式碼區段中。確定 Visual C++ 連結器的 /merge 旗標沒有設定為將 “.rdata” 區段合併到程式碼區段中。
備註
這個測試會在完全 Managed 組件以外的所有二進位程式碼上執行。
WXCheck
**Windows 應用程式認證套件錯誤訊息:**WXCheck 測試失敗。
這個檢查有助於確保二進位檔沒有任何對應為可寫入或可執行的頁面。 如果二進位檔有可寫入和可執行的區段,或如果二進位檔的 SectionAlignment 小於 PAGE_SIZE,就會發生這種情形。
如果您的應用程式未通過這個測試,應該怎麼辦?
確認二進位檔沒有可寫入或可執行的區段,而且二進位檔的 SectionAlignment 值至少等於其 PAGE_SIZE。
備註
這個測試會在所有 .exe 檔案和原生的 Unmanaged DLL 上執行。
如果可執行檔在建置時啟用了 [編輯後繼續] (/ZI),則可執行檔便可能有可寫入和可執行的區段。停用 [編輯後繼續] 即可不顯示無效的區段。
可執行檔的 SectionAlignment 預設為 PAGE_SIZE。
Windows 市集中禁止的檔案
**Windows 應用程式認證套件錯誤訊息:**禁止的檔案檢查測試失敗。
Windows 市集應用程式不應包含某些檔案。這些檔案有較新的版本可供使用,提供重要的安全性、可靠性或其他改進功能。Microsoft 在 Windows 應用程式認證套件中封鎖了這些檔案,以確保所有開發人員都使用當前的版本。
Windows 應用程式認證套件中禁止的檔案檢查目前會檢查下列檔案:
Bing.Maps.JavaScript\js\veapicore.js
當應用程式使用的是 "Release Preview" 版檔案,而不是最新的正式版檔案時,這項檢查通常會失敗。 若要更正這個問題,請使用適用於 Windows 市集應用程式的最新版 Bing 地圖 SDK。
Attack Surface Analyzer
Attack Surface Analyzer 測試會檢查安裝和執行應用程式後變更的系統狀態、執行階段參數以及安全物件,藉此找出特定的安全性弱點。修正這些弱點並不會對效能有負面影響。如果您的應用程式出現任何這些安全性弱點,您的應用程式便無法通過 Windows 市集的認證。
Attack Surface Analyzer 測試適用於所有程式設計語言,並會在應用程式中尋找這些安全性弱點。
- 包含弱式 ACL 的安全可執行檔
- 包含物件及弱式 ACL 的安全目錄
- 包含弱式 ACL 的安全登錄機碼
- 允許存取非系統管理員帳戶而且容易被竄改的服務
- 啟動快速或 24 小時內重新啟動兩次以上的服務
包含弱式 ACL 的安全可執行檔
這個測試會檢查系統管理員擁有的每個新的或變更的可執行檔上的存取控制清單 (ACL),尋找包含弱式 ACL 的安全可執行檔。這些檔案上的 ACL 必須禁止被系統管理員以外的人員修改。Attack Surface Analyzer 不但會測試可執行檔 (.exe),也會測試包含可執行內容 (如指令碼和說明檔) 的檔案。
如果您的應用程式未通過這個測試,應該怎麼辦?
如果在您的應用程式中偵測到這個弱點,請檢查任何非系統管理員帳戶並移除下列權限:GENERIC_ALL、 GENERIC_WRITE、WRITE_OWNER、WRITE_DAC、FILE_WRITE_ATTRIBUTES、FILE_WRITE_EA、FILE_APPEND_DATA 或 FILE_WRITE_DATA, DELETE。
備註
弱式 ACL 允許不是系統管理員的人員更改可執行檔。可執行檔遭到更改後,可能就無法如預期執行。如果沒有正確設定存取權限,攻擊者就能夠取代或更改檔案的內容,讓檔案產生惡意行為。
包含物件及弱式 ACL 的安全目錄
這個測試會在新的或變更的資料夾階層檢查 ACL,尋找包含物件及弱式 ACL 的安全目錄。階層式 ACL (或繼承的 ACL) 會控制對資料夾內所有檔案及資料夾的存取。這些資料夾上的 ACL 必須禁止不是系統管理員的人員修改這些資料夾或其中的內容。
這個測試不會使用旗標標示每個不安全的可執行檔和子資料夾,而是識別出階層中包含弱式 ACL 的最上層資料夾。
如果您的應用程式未通過這個測試,應該怎麼辦?
如果在您的應用程式中偵測到這個弱點,請在由測試找出的目錄上檢查所有非系統管理員帳戶並移除下列權限,讓這些權限無法繼續被繼承:GENERIC_ALL、GENERIC_WRITE、WRITE_OWNER、WRITE_DAC、FILE_ADD_FILE、FILE_ADD_SUBDIRECTORY、FILE_WRITE_ATTRIBUTES、FILE_WRITE_EA、FILE_APPEND_DATA、FILE_WRITE_DATA、FILE_DELETE_CHILD 以及 DELETE。這可能需要變更根目錄 ACL 上的 Inherited 旗標。
修正根目錄上的權限之後,可能也需要修正個別可執行檔中的權限,如包含弱式 ACL 的安全可執行檔中所述。
備註
這個測試會找出所有包含弱式 ACL 的目錄及其檔案的階層,因為它們會授與非系統管理員不適當的權限。這種階層關係是由不正確的繼承權限所造成,請先檢查繼承權限,然後再變更子系目錄及檔案中的權限。
包含弱式 ACL 的安全登錄機碼
這個測試會檢查 Local Machine 登錄區 (HKLM) 中新的或變更之機碼的存取控制清單 (ACL),藉此檢查包含弱式 ACL 的安全登錄機碼。只有系統管理員具有寫入 Local Machine 登錄區的權限。
如果您的應用程式未通過這個測試,應該怎麼辦?
請從測試找出的物件上針對所有非系統管理員帳戶移除這些權限:GENERIC_ALL、GENERIC_WRITE、WRITE_OWNER、WRITE_DAC、KEY_SET_VALUE、KEY_CREATE_SUBKEY 以及 DELETE。
備註
這個小節中的登錄值可以判斷在哪裡可以找到 .exe 和 .dll 之類的可執行檔。應用程式也會使用 Local Machine 登錄區中的登錄機碼來儲存或讀取可執行檔的路徑。如果攻擊者更改了這個機碼 (例如將值變更為不受信任的可執行檔路徑),應用程式就會執行錯誤的檔案。
如果登錄機碼會參照可執行檔,則這個測試會檢查機碼的 ACL,看看是否將不適當的權限授與非系統管理員帳戶。
允許存取非系統管理員帳戶而且容易被竄改的服務
這個測試會檢查允許存取非系統管理員帳戶的服務上的 ACL,尋找新的或變更的服務。 新的服務在二進位檔案路徑、主機 DLL、登錄機碼或服務本身不能夠有弱式 ACL,因為這些新的服務可能會允許非系統管理員變更服務執行的方式。
如果您的應用程式未通過這個測試,應該怎麼辦?
使用包含弱式 ACL 的安全可執行檔中所述的方式來修正個別檔案。
備註
同時與一般和服務特定權限關聯的服務這個測試會尋找授與非系統管理員帳戶的不適當權限。 如果權限不是安全的,攻擊者可能會在服務啟動時,將服務重新導向以執行不受信任的檔案。
例如,攻擊者可能會呼叫 ChangeServiceConfig 來變更服務的可執行檔路徑。
啟動快速或 24 小時內重新啟動兩次以上的服務
這個測試會檢查服務的設定,尋找可能頻繁重新啟動的服務。服務不可以在 24 小時內重新啟動兩次以上。
如果您的應用程式未通過這個測試,應該怎麼辦?
變更服務的 Reset Period,讓它無法在 24 小時內重新啟動兩次以上。
備註
這個測試會尋找與位址空間配置隨機載入 (ASLR) 相關的弱點。ASLR 是將可執行程式碼載入記憶體中隨機位置的功能,因此較不易遭受安全性弱點的攻擊。如果攻擊者可以讓服務重複地重新啟動,則攻擊者就會使用暴力攻擊將可執行程式碼載入所有可能的位置,進而擊潰 ASLR。
這個測試會針對 SC_ACTION_REBOOT 和 SC_ACTION_RESTART 值檢查 Service Failure Actions 結構的 lpsaActions 元素。呼叫 ChangeServiceConfig2 即可設定這些值。
這個測試會判斷是否有兩個以上的動作、它們的延遲值是否少於 24 小時以及伺服器重設期間是否少於 24 小時。