Share via


/guard (啟用控制流程防護)

啟用控制流程防護安全性檢查的編譯器產生。

語法

/guard:cf
/guard:cf-

備註

選項 /guard:cf 會導致編譯器分析間接呼叫目標的控制流程,然後在執行時間插入程式碼來驗證目標。 預設為 /guard:cf off,且必須明確啟用。 若要明確停用此選項,請使用 /guard:cf-

Visual Studio 2017 和更新版本 :此選項會新增產生跳躍資料表之語句的 switch 防護。

/guard:cf指定控制流程防護 (CFG) 選項時,編譯器和連結器會插入額外的執行時間安全性檢查,以偵測嘗試危害程式碼。 在編譯和連結期間,程式碼中的所有間接呼叫都會經過分析,以尋找程式碼正確執行時所能到達的每個位置。 這項資訊會儲存在二進位編碼檔案標頭中的額外結構。 編譯器也會在程式碼的每個間接呼叫之前注入檢查,以確保目標是其中一個已驗證的位置。 如果在 CFG 感知作業系統上執行階段的檢查失敗,作業系統會關閉該程式。

常見的軟體攻擊,會利用在處理極端或未預期輸入方面的錯誤。 精心製作的應用程式輸入可能會覆寫包含可執行程式碼之指標的位置。 這項技術可用來將控制流程重新導向至攻擊者所控制的程式碼。 CFG 執行時間檢查不會修正可執行檔中的資料損毀錯誤。 反而是讓攻擊者更難利用它們執行任意程式碼。 CFG 是一種緩和工具,可防止呼叫程式碼中非函式進入點的位置。 這類似于資料執行防止 (DEP)、 /GS 堆疊檢查和 /DYNAMICBASE /HIGHENTROPYVA 位址空間配置隨機化 (ASLR) 降低程式碼成為惡意探索向量的機會。

選項 /guard:cf 必須傳遞至編譯器和連結器,才能建置使用 CFG 惡意探索風險降低技術的程式碼。 如果您的二進位檔是使用單一 cl 命令建置,則編譯器會將選項傳遞給連結器。 如果您分別進行編譯和連結,則必須同時在編譯器和連結器命令設定選項。 /DYNAMICBASE 連結器選項也是必要的。 若要確認您的二進位檔有 CFG 資料,請使用 dumpbin /headers /loadconfig 命令。 具有 CFG 功能的二進位檔在 EXE 或 DLL 的特性清單中會有 Guard ,而防護旗標則包括 CF InstrumentedFID table present

此選項 /guard:cf/ZI [編輯後繼續偵錯資訊] 或 /clr [Common Language Runtime 編譯] 不相容。

使用 /guard:cf 編譯的程式碼可以連結至未使用 選項編譯的程式庫和物件檔。 只有此程式碼使用 選項連結 /guard:cf ,並在 CFG 感知作業系統上執行時,才具有 CFG 保護。 因為未使用 選項編譯的程式碼不會停止攻擊,因此建議您在編譯的所有程式碼上使用 選項。 CFG 檢查的執行時間成本很小,但編譯器分析會嘗試將間接跳躍的檢查優化,這可證明是安全的。

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [ 屬性頁 ] 對話方塊。 如需詳細資訊,請參閱 設定編譯器和建置屬性

  2. 選取 [ 組態屬性 > C/C++ > 程式碼產生 ] 屬性頁。

  3. 選取 [控制流程防護] 屬性。

  4. 在下拉式清單控制項中,選擇 [是] 啟用控制流程防護,或選擇 [否] 將其停用。

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法