偵測因不安全預設值(寫死的密碼、弱認證、寬鬆安全性設定)而導致的「失效開放」漏洞,使應用程式在正式環境中以不安全方式運作。適用於安全稽核、設定管理審查或環境變數處理分析。
不安全預設值偵測
找出應用程式因缺少設定而以不安全方式運作的失效開放漏洞。區分可被利用的預設值與會安全崩潰的失效安全模式。
- 失效開放(嚴重):
SECRET = env.get('KEY') or 'default'→ 應用程式使用弱密碼執行 - 失效安全(安全):
SECRET = env['KEY']→ 缺少時應用程式會崩潰
使用時機
- 正式環境應用程式的安全稽核(認證、加密、API 安全)
- 部署檔案、IaC 模板、Docker 設定的設定審查
- 環境變數處理與密碼管理的程式碼審查
- 部署前檢查是否有寫死的憑證或弱預設值
不應使用的情況
請勿將此技能用於:
- 明確限定於測試環境的測試用固定程式(
test/、spec/、__tests__/目錄中的檔案) - 範例/模板檔案(
.example、.template、.sample後綴) - 僅開發用的工具(本機開發用 Docker Compose、除錯腳本)
- README.md 或 docs/ 目錄中的文件範例
- 建置時設定(部署時會被取代)
- 缺少即崩潰的行為(應用程式若無正確設定則無法啟動,屬於失效安全)
如有疑慮:追蹤程式碼路徑,判斷應用程式是使用預設值執行還是崩潰。
應拒絕的合理化藉口
- 「這只是開發用的預設值」 → 如果會進入正式環境程式碼,就是發現
- 「正式環境設定會覆蓋它」 → 確認正式環境設定存在;若無,程式碼層級的漏洞仍然存在
- 「沒有正確設定就不會執行」 → 用程式碼追蹤證明;許多應用程式會默默失敗
- 「它位於認證之後」 → 縱深防禦;被攻破的連線階段仍可利用弱預設值
- 「我們會在發佈前修正」 → 現在就記錄;「以後」很少真的發生
工作流程
對每個潛在發現遵循以下流程:
1. 搜尋:進行專案探索並找出不安全預設值
判斷語言、框架及專案慣例。利用這些資訊進一步發現密碼儲存位置、密碼使用模式、第三方整合憑證、加密方式及其他相關設定。並進一步分析不安全的預設設定。
範例
在 **/config/、**/auth/、**/database/ 及環境變數檔案中搜尋模式:
- 備用密碼:
getenv.*\) or ['"]、process\.env\.[A-Z_]+ \|\| ['"]、ENV\.fetch.*default: - 寫死的憑證:
password.*=.*['"][^'"]{8,}['"]、api[_-]?key.*=.*['"][^'"]+['"] - 弱預設值:
DEBUG.*=.*true、AUTH.*=.*false、CORS.*=.*\* - 加密演算法:
MD5|SHA1|DES|RC4|ECB用於安全相關情境
根據探索結果調整搜尋方式。
專注於正式環境可達的程式碼,而非測試固定程式或範例檔案。
2. 驗證:實際行為
對每個匹配項,追蹤程式碼路徑以了解執行時期行為。
需回答的問題:
- 這段程式碼何時執行?(啟動時 vs. 執行時期)
- 如果缺少某個設定變數會發生什麼事?
- 是否有驗證機制強制執行安全設定?
3. 確認:正式環境影響
判斷此問題是否會進入正式環境:
如果正式環境設定提供了該變數 → 嚴重性較低(但仍是程式碼層級的漏洞)
如果正式環境設定缺少或使用預設值 → 嚴重
4. 回報:附上證據
回報範例:
發現:寫死的 JWT 密碼備用值
位置:src/auth/jwt.ts:15
模式:const secret = process.env.JWT_SECRET || 'default';
驗證:應用程式在缺少 JWT_SECRET 時仍可啟動;密碼用於 jwt.sign() 第 42 行
正式環境影響:Dockerfile 缺少 JWT_SECRET
利用方式:攻擊者使用 'default' 偽造 JWT,取得未經授權的存取
快速驗證檢查清單
備用密碼: SECRET = env.get(X) or Y
→ 驗證:應用程式在缺少環境變數時仍可啟動?密碼用於加密/認證?
→ 跳過:測試固定程式、範例檔案
預設憑證: 寫死的 username/password 配對
→ 驗證:在部署設定中是否啟用?沒有執行時期覆蓋?
→ 跳過:已停用的帳號、文件範例
失效開放安全: AUTH_REQUIRED = env.get(X, 'false')
→ 驗證:預設值是否不安全(false/disabled/permissive)?
→ 安全:應用程式崩潰或預設值安全(true/enabled/restricted)
弱加密: 在安全相關情境中使用 MD5/SHA1/DES/RC4/ECB
→ 驗證:是否用於密碼、加密或令牌?
→ 跳過:檢查碼、非安全用途的雜湊
寬鬆存取: CORS *、權限 0777、預設公開
→ 驗證:預設值是否允許未經授權的存取?
→ 跳過:有明確理由的明確設定寬鬆權限
除錯功能: 堆疊追蹤、內省、詳細錯誤訊息
→ 驗證:預設是否啟用?是否暴露在回應中?
→ 跳過:僅記錄、非使用者可見
如需詳細範例與反例,請參閱 examples.md。






