即使開發者對密碼或金鑰進行了加密,但如果儲存這些憑證的檔案或系統本身存在漏洞,導致攻擊者可以輕易存取,那麼再強的加密也形同虛設。這就是「憑證保護不足」漏洞。
什麼是憑證保護不足?
此漏洞指的是,應用程式雖然對敏感憑證(如資料庫密碼、API 金鑰)進行了加密或保護,但卻將它們存放在一個不安全的地方。攻擊者可以透過其他漏洞(如路徑穿越、檔案包含)來直接讀取這些憑證,從而繞過加密機制。
核心問題在於:保護憑證的「容器」本身不安全。
攻擊原理與範例
想像一個網站,它將資料庫的連線帳號密碼存放在一個設定檔 config.php
中。
- 發現其他漏洞:攻擊者在網站上發現了一個「檔案包含 (File Inclusion)」或「路徑穿越 (Directory Traversal)」漏洞。
- 讀取設定檔:利用這個漏洞,攻擊者可以建構一個惡意請求,讓伺服器讀取並回傳
config.php
檔案的內容,例如:1
http://example.com/index.php?page=../../config.php
- 取得憑證:
config.php
的原始碼被洩漏,其中包含了明文或經過簡單編碼的資料庫帳號密碼。 - 入侵資料庫:攻擊者使用竊取到的憑證,直接連線到網站的資料庫,竊取或竄改所有使用者的財務資料和銀行詳細資訊。
風險與影響
- 系統完全被接管:攻擊者可能取得資料庫、後台系統或其他關鍵服務的管理權限。
- 大規模資料洩漏:所有儲存在資料庫中的使用者資料都可能被竊取。
- 供應鏈攻擊:如果洩漏的是 API 金鑰,攻擊者可能進一步攻擊與之串連的其他系統。
防禦與預防措施
防禦的關鍵在於,必須假設攻擊者總有一天能存取到你儲存憑證的地方,因此要讓他們即使拿到了檔案也無法輕易解讀。
1. 使用安全的秘密管理系統
- 不要將憑證以明文形式存放在程式碼或設定檔中。
- 應使用專門的秘密管理工具(如 HashiCorp Vault, AWS Secrets Manager, Azure Key Vault)來集中儲存、管理和存取憑證。應用程式在執行時才動態地向這些服務請求所需的金鑰。
2. 強化檔案與目錄權限
- 嚴格設定設定檔和金鑰檔案的檔案系統權限,確保只有應用程式的執行使用者有權限讀取。
- 將敏感檔案存放在網站根目錄之外,防止透過 Web 直接存取。
3. 避免在程式碼中硬編碼
- 絕對不要將密碼、API 金鑰等直接寫在原始碼中。
- 使用環境變數 (Environment Variables) 來傳遞憑證,這是一種更安全的業界標準作法。
4. 定期掃描與審計
- 使用靜態程式碼分析工具 (SAST) 定期掃描程式碼庫,找出潛在的硬編碼憑證。
- 定期審計所有使用的第三方服務和其存取權限。
說些什麼吧!