insecure-defaults

insecure-defaults

熱門

偵測因不安全預設值(寫死的密碼、弱認證、寬鬆安全性設定)而導致的「失效開放」漏洞,使應用程式在正式環境中以不安全方式運作。適用於安全稽核、設定管理審查或環境變數處理分析。

6336星標
545分支
更新於 2026/7/30
SKILL.md
唯讀
名稱
insecure-defaults
描述

偵測因不安全預設值(寫死的密碼、弱認證、寬鬆安全性設定)而導致的「失效開放」漏洞,使應用程式在正式環境中以不安全方式運作。適用於安全稽核、設定管理審查或環境變數處理分析。

不安全預設值偵測

找出應用程式因缺少設定而以不安全方式運作的失效開放漏洞。區分可被利用的預設值與會安全崩潰的失效安全模式。

  • 失效開放(嚴重): 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.*=.*trueAUTH.*=.*falseCORS.*=.*\*
  • 加密演算法: 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