首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

資安專家十大守則:助開發者脫離安全困境

     編輯:關於C++

前言

Michael Howard 與 Keith Brown (Microsoft 資安團隊) 提煉出十大實務守則,涵蓋輸入驗證、記憶體安全、加密、最小權限、錯誤處理、模擬風險、非管理員執行等核心面向。遵循這些原則可大幅降低應用程式被攻擊風險。

1. 永不信任使用者輸入

核心:所有外部資料 (表單、QueryString、Cookie、HTTP 標頭、檔案、資料庫、IPC、註冊表) 皆視為惡意,直到經過嚴格驗證。信任輸入導致緩衝區溢位、XSS、SQL Injection、命令注入、路徑遍歷等漏洞。

2. 防禦緩衝區溢位

  • C/C++ 最高風險。使用安全字串函式 (strcpy_s, strcat_s, sprintf_s, StringCchCopy, StringCchPrintf) 取代 strcpy/sprintf/gets。
  • 嚴格檢查長度:memcpy(dest, src, min(destSize, srcLen))。
  • 啟用編譯器保護:/GS (Stack Cookie)、/DYNAMICBASE (ASLR)、/NXCOMPAT (DEP)、/guard:cf (Control Flow Guard)。
  • 使用標準容器 (std::string, std::vector) 避免手動緩衝區管理。

危險 vs 安全範例


// 危險
void Bad(char* src, DWORD len) { char buf[32]; memcpy(buf, src, len); }

// 安全
void Good(char* src, DWORD len) {
    const size_t DEST_SIZE = 32;
    char buf[DEST_SIZE];
    memcpy(buf, src, min(DEST_SIZE, len)); // 截斷而非溢位
    buf[DEST_SIZE-1] = '\0'; // 確保結尾
}

3. 防禦跨站腳本 (XSS)

  • 輸入驗證:白名單正則表達式限制允許字元 (如 ^[\w]{1,40}$),拒絕清單不可靠。
  • 輸出編碼:所有動態內容輸出到 HTML/JS/CSS/URL 時必須編碼。ASP.NET: HttpUtility.HtmlEncode, JavaScriptStringEncode;ASP: Server.HTMLEncode;Razor 自動編碼。
  • 設定 HttpOnly、Secure、SameSite Cookie 旗標。
  • 實作內容安全政策 (CSP) 標頭限制腳本來源。

4. 防禦 SQL Injection

  • 絕不拼接 SQL 字串。一律使用參數化查詢 / 預存程序:cmd.Parameters.Add("@Id", id)。
  • 資料庫連線最小權限帳號,嚴禁使用 sa / root / administrator。
  • 錯誤訊息不回顯給使用者 (避免資訊洩漏)。
  • ORM (Entity Framework, Dapper, Hibernate) 內建參數化,優先使用。

危險 vs 安全


// 危險:'1001' DROP TABLE shipping --
sql = "SELECT * FROM shipping WHERE id = '" + id + "'";

// 安全:參數化
cmd.CommandText = "SELECT * FROM shipping WHERE id = @Id";
cmd.Parameters.Add("@Id", id);

5. 禁止自行設計加密演算法

  • 自行設計的加密 100% 不安全,攻擊者有除錯器、時間、知識破解。
  • 使用經過同行審查、標準化的演算法與庫:
    • Windows: CNG (BCrypt API) / CAPI (CryptAPI) (舊)。
    • .NET: System.Security.Cryptography (AES, RSA, ECDSA, SHA-256, HMAC, PBKDF2, HKDF)。
    • 跨平台: OpenSSL, libsodium (NaCl), BoringSSL。
  • 密鑰管理:使用金鑰保管庫 (Azure Key Vault, AWS KMS, HashiCorp Vault, Windows DPAPI)。

6. 減少攻擊面

  • 功能預設不安裝/不啟用 (Opt-in),除非 >90% 使用者需要。
  • 服務以最低權限帳號 執行 (非 SYSTEM/Administrator/root)。
  • 關閉不必要的連接埠、移除未使用的程式碼/元件/範例/文件。
  • IIS 6.0+ 採用應用程式集區隔離、動態壓縮模組 按需載入。

7. 最小權限原則

  • 程式碼只擁有完成任務所需的最小權限、最短時間。
  • 高權限操作隔離到獨立進程 (Windows 服務、COM+ 應用程式、.NET AppDomain/Assembly 隔離),透過 IPC (Named Pipe, WCF, gRPC, COM) 呼叫。
  • .NET CAS (Code Access Security) / .NET Core 權限模型:對組件施加 PermissionSet、Deny/PermitOnly 限制插件權限。
  • 插件/擴充點:載入前 new PermissionSet(PermissionState.None).AddPermission(...).PermitOnly() 限制權限。

8. 重視失敗模式 (Fail-Safe)

  • 錯誤處理程式碼同等重要,必須完整測試 (單步除錯、單元測試覆蓋 catch 區塊)。
  • 預設拒絕/安全狀態:bool access = false; try { ... access = true; } catch(...) { /* 保持 false */ }。
  • 失敗時不洩漏敏感資訊 (堆疊追蹤、SQL、路徑、金鑰) 給使用者,記錄完整日誌供開發者。
  • 資源獲取即初始化 (RAII) / using / try/finally 確保資源釋放。

危險 vs 安全


// 危險:樂觀預設
bool ok = true;
try { File.Open(...); } catch(SecurityException) { ok = false; } catch(...) { /* ok 仍為 true! */ }

// 安全:悲觀預設
bool ok = false;
try { File.Open(...); ok = true; } catch(...) { /* ok 保持 false */ }

9. 謹慎使用模擬

  • 模擬 (ImpersonateLoggedOnUser, RevertToSelf, ASP.NET <identity impersonate="true">) 讓執行緒以呼叫者身分存取資源,方便但風險高:
  • 權限提升:攻擊者利用漏洞呼叫 RevertToSelf 取得進程權限 (常為 SYSTEM)。
  • COM 傳播失效:跨 Apartment 呼叫時模擬權杖不傳播,導致以進程身分執行。
  • 核心物件快取:首次開啟檢查 ACL 後快取,切換模擬身分仍可存取先前開啟的控制代碼。
  • 對策:避免模擬,改用明確的存取檢查 (AccessCheck)、以服務帳號統一存取資源、若必須模擬則嚴格限制範圍並及時 RevertToSelf。

10. 撰寫非管理員可執行的應用程式

  • 開發/測試務必使用標準使用者帳號,遇到權限問題即刻修正 (ACL、註冊表寫入位置、資料目錄)。
  • 資料寫入 %LOCALAPPDATA%、%APPDATA%、%TEMP%,不可寫入 Program Files、Windows、System32、HKLM。
  • 需管理員權限的操作 (安裝服務、驅動、修改系統設定) 獨立為安裝程式/管理工具,以 UAC 提權執行 (runas、ShellExecuteEx(..., "runas"))。
  • 開發工具 (編譯器、偵錯器、編輯器) 不需管理員權限,勿以管理員身分執行 IDE。

總結檢查清單

#守則關鍵行動
1不信任輸入白名單驗證、輸出編碼、參數化查詢
2防緩衝區溢位安全函式、/GS、ASLR、DEP、標準容器
3防 XSSHtmlEncode、CSP、HttpOnly Cookie
4防 SQL Injection參數化、最小權限帳號、隱藏錯誤
5不用自製加密CNG/CAPI/OpenSSL/libsodium、金鑰保管庫
6減少攻擊面最小安裝、最低權限服務、關閉未用埠
7最小權限隔離高權限進程、CAS/PermitOnly 限制插件
8失敗安全悲觀預設、RAII、不洩漏錯誤細節
9慎用模擬避免模擬、改用 AccessCheck、及時 RevertToSelf
10非管理員執行標準用戶開發、資料寫用戶目錄、安裝程式分離
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved