insecure-defaults について
設定が欠けた際に、弱い設定や許容的な設定でアプリケーションが動作する問題を探すセキュリティ監査スキルです。実行時の挙動と本番環境への影響を追跡し、フェイルオープンと安全な停止を区別します。テストやサンプルコードは対象外です。
主な機能
- 01フォールバックの秘密情報や認証情報を検索
- 02弱いセキュリティ初期値を確認
- 03設定不足時の挙動を追跡
- 04本番環境への影響を評価
- 05テスト用データとサンプルを除外
活用シーン
- 01本番環境の認証設定の監査
- 02デプロイとインフラ設定のレビュー
- 03環境変数と秘密情報の扱いの確認
- 04デプロイ前の安全でない初期値の点検
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trailofbits/ skills --skill insecure-defaultsインストール後、Claude Code で/insecure-defaultsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlassets/trail-of-bits-mark.svgreferences/examples.md詳細
安全性の低いデフォルト設定の検出
設定が不足している場合にアプリが安全性の低い状態で実行される、フェイルオープンの脆弱性を検出します。悪用可能なデフォルト設定と、安全にクラッシュするフェイルセキュアなパターンを区別します。
- フェイルオープン(重大):
SECRET = env.get('KEY') or 'default'→ アプリは脆弱なシークレットで実行されます - フェイルセキュア(安全):
SECRET = env['KEY']→ 値がない場合、アプリはクラッシュします
使用する場面
- 本番アプリケーションのセキュリティ監査(認証、暗号化、API セキュリティ)
- デプロイファイル、IaC テンプレート、Docker 設定の構成レビュー
- 環境変数の処理やシークレット管理に関するコードレビュー
- ハードコードされた認証情報や脆弱なデフォルト設定に対するデプロイ前チェック
使用しない場面
次の用途には、このスキルを使用しないでください。
- テスト用フィクスチャで、テスト環境に明確に限定されているもの(
test/、spec/、__tests__/内のファイル) - サンプル/テンプレートファイル(
.example、.template、.sampleの接尾辞が付いたファイル) - 開発専用ツール(開発用のローカル Docker Compose、デバッグスクリプト)
- README.md や docs/ ディレクトリ内のドキュメントのサンプル
- デプロイ時に置き換えられるビルド時設定
- 適切な設定がないとアプリが起動しない設定不足時にクラッシュする動作(フェイルセキュア)
判断に迷う場合は、コードパスをたどり、アプリがデフォルト設定で実行されるのか、クラッシュするのかを確認してください。
見過ごしてはならない言い訳
- 「これは開発用のデフォルト設定にすぎない」 → 本番コードに含まれるなら、検出対象です
- 「本番設定で上書きされる」 → 本番設定が存在することを確認してください。存在しない場合、コードレベルの脆弱性は残ります
- 「適切な設定なしでは実行されない」 → コードをたどって証明してください。多くのアプリはエラーを表面化させずに動作します
- 「認証の背後にある」 → 多層防御が必要です。セッションが侵害されれば、脆弱なデフォルト設定が悪用されます
- 「リリース前に修正する」 → 今すぐ記録してください。「後で」はほとんど実現しません
ワークフロー
検出候補ごとに、次のワークフローに従ってください。
1. SEARCH:プロジェクトを調査し、安全性の低いデフォルト設定を探す
言語、フレームワーク、プロジェクトの規約を特定します。この情報を使って、シークレットの保存場所、シークレットの使用パターン、認証情報を使うサードパーティー連携、暗号化、その他の関連設定をさらに調査します。得られた情報を使い、安全性の低いデフォルト設定を分析します。
例
**/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. VERIFY:実際の動作を確認する
一致した箇所ごとに、コードパスをたどって実行時の動作を把握します。
確認する項目:
- このコードはいつ実行されるか(起動時か、実行時か)
- 設定変数がない場合、何が起きるか
- 安全な設定を強制する検証があるか
3. CONFIRM:本番環境への影響を確認する
この問題が本番環境に及ぶかどうかを判断します。
本番設定で変数が指定されている場合 → 深刻度は低くなります(ただし、コードレベルの脆弱性は残ります) 本番設定で変数が指定されていない、またはデフォルト値が使われている場合 → 重大
4. REPORT:根拠を示して報告する
報告例:
Finding: Hardcoded JWT Secret Fallback
Location: src/auth/jwt.ts:15
Pattern: const secret = process.env.JWT_SECRET || 'default';
Verification: App starts without JWT_SECRET; secret used in jwt.sign() at line 42
Production Impact: Dockerfile missing JWT_SECRET
Exploitation: Attacker forges JWTs using 'default', gains unauthorized access
クイック確認チェックリスト
シークレットのフォールバック: SECRET = env.get(X) or Y
→ 確認:環境変数がなくてもアプリは起動しますか?シークレットは暗号処理や認証に使われていますか?
→ 対象外:テスト用フィクスチャ、サンプルファイル
デフォルト認証情報: ハードコードされたusername/passwordの組み合わせ
→ 確認:デプロイ時の設定で有効ですか?実行時に上書きできませんか?
→ 対象外:無効化されたアカウント、ドキュメントのサンプル
フェイルオープンのセキュリティ: AUTH_REQUIRED = env.get(X, 'false')
→ 確認:デフォルトが安全でない状態(false/無効/制限なし)ですか?
→ 安全:アプリがクラッシュするか、デフォルトが安全(true/有効/制限あり)である
脆弱な暗号方式: セキュリティ関連の用途におけるMD5/SHA1/DES/RC4/ECB → 確認:パスワード、暗号化、またはトークンに使われていますか? → 対象外:チェックサム、セキュリティ目的ではないハッシュ
過度に許可されたアクセス: CORS *、権限0777、デフォルトでの公開
→ 確認:デフォルトで不正なアクセスが許可されますか?
→ 対象外:正当な理由を伴い、明示的に設定された過度な許可
デバッグ機能: スタックトレース、イントロスペクション、詳細なエラー → 確認:デフォルトで有効ですか?レスポンスに含まれていますか? → 対象外:ログにのみ出力され、ユーザーに表示されないもの
詳しい例と反例については、examples.mdを参照してください。