首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Visual C++ 安全防護機制完整指南:/GS、SafeSEH、DEP、ASLR、安全 CRT

     編輯:更多程式設計知識

前言

C/C++ 直接記憶體操作帶來高效能,也引入緩衝區溢位、指標竄改等風險。MSVC 提供編譯器/連結器層面的多重防護,預設開啟多數選項,構建「纈深防禦」體系。

一、緩衝區溢位偵測 /GS (Buffer Security Check)

  • 原理:函式序言插入 Security Cookie (亂數值) 於堆疊框架,結束前驗證是否被竄改。
  • 保護範圍:含有陣列、結構體、alloca、_alloca 的函式。
  • 編譯選項:/GS (預設開啟),/GS- 關閉。
  • 限制:無法防禦堆積溢位、格式化字串攻擊、Cookie 洩漏 (資訊洩漏) 攻擊。

二、安全例外處理 /SAFESEH (Safe Exception Handlers)

  • 背景:SEH 鏈結儲存在堆疊,溢位可覆寫 Handler 指標劫持控制流。
  • 機制:連結器建立合法 Handler 表 (`.safeseh` 區段),例外發生時 OS 驗證 Handler 是否在表內。
  • 需求:僅限 32 位元 x86;x64 採用表格式例外處理 (UNWIND_INFO) 已內建保護。
  • 選項:/SAFESEH (預設開啟),/SAFESEH:NO 關閉。

三、資料執行防護 /NXCOMPAT (DEP 相容)

  • DEP:標記資料頁面 (堆疊、堆積) 為不可執行,阻止 Shellcode 執行。
  • 編譯器角色:在 PE 標頭設定 IMAGE_DLLCHARACTERISTICS_NX_COMPAT 旗標,告知 OS 此模組相容 DEP。
  • 選項:/NXCOMPAT (預設開啟),/NXCOMPAT:NO 關閉。
  • 注意:若使用 JIT (如 .NET、V8、LuaJIT) 需動態配置可執行記憶體 (VirtualAlloc(..., PAGE_EXECUTE_READWRITE))。

四、位址空間配置隨機化 /DYNAMICBASE (ASLR)

  • ASLR:載入基址、堆疊、堆積、記憶體對應檔案隨機化,增加攻擊者猜測難度。
  • 編譯器角色:PE 標頭設定 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,要求 OS 隨機化基址。
  • 選項:/DYNAMICBASE (預設開啟),/DYNAMICBASE:NO 關閉。
  • 相依:需連結時指定 /FIXED:NO (預設),強制固定基址會失效 ASLR。

五、安全 CRT 函數 (Secure CRT)

  • 問題:strcpy, sprintf, gets 等不檢查緩衝區長度。
  • 替代:strcpy_s, sprintf_s, gets_s 等 `_s` 後綴版本,需傳遞目的緩衝區大小。
  • 強制遷移:定義 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 讓標準名稱自動對應安全版本,或 _CRT_SECURE_NO_WARNINGS 抑制警告 (不推薦)。
  • 範例:
    
    char dst[32];
    strcpy_s(dst, _countof(dst), "Hello");   // 安全
    // strcpy(dst, "Hello");                 // 警告 C4996
    

六、C++ operator new 失敗處理

  • 標準 new 失敗拋出 std::bad_alloc。
  • new (std::nothrow) 失敗回傳 nullptr,適合不支援例外的環境。
  • 自訂 new_handler (std::set_new_handler) 可在記憶體不足時嘗試釋放快取、記錄日誌、終止程式。

七、SDL (Security Development Lifecycle) 建議編譯旗標組合


/GS /GL /analyze /W4 /WX /sdl
/SAFESEH /NXCOMPAT /DYNAMICBASE
/D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1
/guard:cf           // Control Flow Guard (VS2015+)
/guard:ehcont       // EH Continuation Guard (VS2022+)
/CETCOMPAT          // Intel CET Shadow Stacks (VS2022+)

八、防禦繞過與局限

技術常見繞過手法補充防禦
/GSCookie 洩漏 (資訊洩漏)、例外處理器覆寫、長跳轉 (longjmp) 繞過驗證/SAFESEH, /guard:cf, 靜態分析 (/analyze)
DEPROP (Return-Oriented Programming)、JIT 噴射ASLR, CFG, CET
ASLR資訊洩漏揭露基址、部分模組未啟用 ASLR強制所有模組 /DYNAMICBASE, 核心模組隨機化
SafeSEH僅限 x86,x64 不適用x64 使用 UNWIND_INFO + CFG

結語

MSVC 的 /GS、/SAFESEH、/NXCOMPAT、/DYNAMICBASE、安全 CRT、/guard:cf 等機制構建多層防禦,**預設開啟**即可獲得基礎保護。但**沒有任何單一機制能完全阻止攻擊**,必須結合安全編碼規範 (CERT C++、C++ Core Guidelines)、靜態分析 (/analyze、Coverity、SonarQube)、模糊測試 (AFL、libFuzzer) 並定期更新工具鏈,才能將風險降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved