insecure-defaults

insecure-defaults

熱門

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

6336星標
545分支
更新於 2026/7/30
SKILL.md
readonlyread-only
name
insecure-defaults
description

Detects fail-open insecure defaults (hardcoded secrets, weak auth, permissive security) that allow apps to run insecurely in production. Use when auditing security, reviewing config management, or analyzing environment variable handling.

不安全預設值偵測

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

  • 失效開放(嚴重): 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