verify-security について
ソースコードと設定をローカルで検査し、セキュリティ上のアンチパターンや脆弱性の可能性を確認するスキルです。秘密情報、依存関係、入力処理、エラー情報、安全でない設定、機密データのログを対象とします。
主な機能
- 01ハードコードされた秘密情報の検出
- 02依存関係のバージョン固定確認
- 03外部入力処理のレビュー
- 04エラー詳細の露出を指摘
- 05セキュリティ関連の既定値を確認
- 06ログ内の機密データを検索
活用シーン
- 01リポジトリ内の認証情報の監査
- 02依存関係の宣言の確認
- 03入力処理とエラーレスポンスの点検
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aurite-ai/ agent-verifier --skill verify-securityインストール後、Claude Code で/verify-securityを入力して読み込まれたか確認します。
詳細
セキュリティ検証
目的
セキュリティ上のアンチパターンや脆弱性がないか、コードを検証します。分析はすべてローカルで行われ、コードが端末の外に送信されることはありません。
使用するタイミング
ユーザーが次のように依頼したときに、このスキルを実行します。
- 「エージェントのセキュリティを検証して」
- 「セキュリティを検証して」
- 「シークレットを確認して」
- 「脆弱性をスキャンして」
- 「セキュリティ監査をして」
注: パターン、品質、言語固有のチェックを含む完全な検証を行うには、ユーザーに 「エージェントを検証して」 と伝えるよう案内してください。
プロセス
ステップ 1:ファイルを特定する
分析対象のファイルを探します。
設定ファイル:
package.json、pyproject.toml、Cargo.toml— 依存関係.env.example— 環境設定テンプレート(実際のシークレットに見える値があれば指摘).gitignore—.envと.env.localが無視されていることを確認(無視されていない場合は問題として指摘)config.py、settings.py、config.ts— 設定
ソースファイル:
*.py、*.ts、*.js、*.go、*.rs— ソースコード- ファイル名に
auth、api、client、secret、configが含まれるファイルを優先します。
除外対象:
node_modules/、.venv/、venv/、__pycache__/*.test.*、*.spec.*、*_test.go.env、.env.local、.env.*.local— 絶対に開かないでください。これらにはユーザーの実際のシークレットが含まれています。gitignore されているかどうかだけを確認します。
ステップ 2:セキュリティチェックを実行する
チェックの分類
[PATTERN]— 機械的なチェックです。記載どおりに適用します。[HEURISTIC]— 判断が必要です。検出結果を明確に示します。
検出結果にはすべて、パターンの場合は [P]、ヒューリスティックの場合は [H] を付けます。
2.1 [PATTERN] ハードコードされたシークレット
次のパターンに一致する代入をスキャンします(大文字・小文字を区別しません)。
| 変数パターン | 不合格条件 |
|---|---|
API_KEY | 文字列リテラルが代入されている |
SECRET | 文字列リテラルが代入されている |
PASSWORD | 文字列リテラルが代入されている |
TOKEN | 文字列リテラルが代入されている |
PRIVATE_KEY | 文字列リテラルが代入されている |
AWS_ACCESS_KEY_ID | 文字列リテラルが代入されている |
AWS_SECRET_ACCESS_KEY | 文字列リテラルが代入されている |
不合格の例:
# ❌ Issue
API_KEY = "sk-abc123..."
password = "hunter2"
OPENAI_API_KEY = "sk-proj-..."
# ✅ Pass (value loaded at runtime from env or a secrets manager, never a literal)
api_key = settings.api_key
password = secret_store.get("db-password")
次のパターンも指摘します:
- 既知の API キーパターンに一致する文字列リテラル:
sk-...(OpenAI)sk-ant-...(Anthropic)AKIA...(AWS)ghp_...(GitHub)xoxb-...(Slack)
重大度:❌ 問題
2.2 [PATTERN] 依存関係のバージョン固定
Python(requirements.txt):
| パターン | 重大度 |
|---|---|
package>=1.0 | ❌ 問題 |
package>1.0 | ❌ 問題 |
package(バージョンなし) | ❌ 問題 |
package==1.0.0 | ✅ 合格 |
package~=1.0 | ✅ 合格 |
Python(pyproject.toml):
[project.dependencies] と [tool.poetry.dependencies] を確認します。
- バージョンが固定されていない、または
>=のバージョン → ❌ 問題 ==、^、または~で固定されたバージョン → ✅ 合格
JavaScript/TypeScript(package.json):
| パターン | 重大度 |
|---|---|
"package": "*" | ❌ 問題 |
"package": "latest" | ❌ 問題 |
"package": ">=1.0.0" | ⚠️ 警告 |
"package": "^1.0.0" | ✅ 合格 |
"package": "~1.0.0" | ✅ 合格 |
"package": "1.0.0" | ✅ 合格 |
2.3 [HEURISTIC] 入力検証
外部データの処理を確認します。
次を探します:
- HTTP リクエストハンドラー(
@app.route、router.getなど) - ユーザー入力の処理(
request.body、req.params、input()) - ファイルのアップロード
- ユーザー入力を使用するデータベースクエリ
次の場合は指摘します:
- ユーザー入力がサニタイズされず、データベースクエリに直接渡されている
- ユーザー入力からファイルパスが検証なしに構築されている
- 外部データがスキーマ検証なしで JSON 解析されている
重大度:⚠️ 警告
指摘対象となるパターンの例:
# ⚠️ Warning - SQL without parameterization
query = f"SELECT * FROM users WHERE id = {user_id}"
# ⚠️ Warning - Path traversal risk
file_path = os.path.join(base_dir, user_filename)
# ✅ Pass - Parameterized query
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
2.4 [HEURISTIC] エラーメッセージの露出
情報漏えいがないか、エラー処理を確認します。
次の場合は指摘します:
- HTTP レスポンスにスタックトレースが返されている
- データベースのエラーメッセージがユーザーに公開されている
- エラーメッセージに内部パスやシステム情報が含まれている
- 本番コードでデバッグモードが有効になっている
次を探します:
# ⚠️ Warning
except Exception as e:
return {"error": str(e)} # Exposes internal details
# ⚠️ Warning
app = Flask(__name__)
app.debug = True # Debug in production
# ✅ Pass
except Exception as e:
logger.error(f"Error: {e}")
return {"error": "An error occurred"}
重大度:⚠️ 警告
2.5 [HEURISTIC] セキュアなデフォルト設定
安全でないデフォルト設定がないか、構成を確認します。
| 設定 | 安全でない設定 | 安全な設定 |
|---|---|---|
| CORS | *(すべて許可) | 特定のオリジン |
| SSL 検証 | verify=False | verify=True または省略 |
| デバッグモード | debug=True | debug=False |
| Cookie のセキュリティ | secure=False | secure=True |
| CSRF | 無効 | 有効 |
例:
# ⚠️ Warning
requests.get(url, verify=False)
app.config["SESSION_COOKIE_SECURE"] = False
CORS(app, origins="*")
# ✅ Pass
requests.get(url) # verify=True is default
app.config["SESSION_COOKIE_SECURE"] = True
CORS(app, origins=ALLOWED_ORIGINS) # explicit allowlist
重大度:⚠️ 警告
2.6 [HEURISTIC] 機密データのログ記録
機密データをログに記録するステートメントがないか確認します。
ログに以下が含まれている場合は、問題として報告します:
- パスワードまたはトークン
- API キー
- 個人を特定できる情報(PII)
- クレジットカード番号
- セッショントークン
次の項目を確認します:
# ⚠️ Warning
logger.info(f"User login: {username} with password {password}")
print(f"API response: {response.json()}") # May contain tokens
# ✅ Pass
logger.info(f"User login: {username}")
logger.debug(f"Request to {url}") # No sensitive data
重大度:⚠️ 警告
ステップ 3:レポートを生成する
# Security Verification Report
**Project:** [name or path]
**Date:** [current date]
**Files analyzed:** [count]
## Summary
✅ X checks passed | ⚠️ Y warnings | ❌ Z issues
## Secrets
- [x] No hardcoded secrets found
- [ ] ❌ Hardcoded secret at `[file:line]`
## Dependencies
- [x] All dependencies pinned
- [ ] ❌ Unpinned dependencies in `[file]`
## Input Validation
- [x] External input properly validated
- [ ] ⚠️ Potential injection at `[file:line]`
## Error Handling
- [x] Errors properly sanitized
- [ ] ⚠️ Information leakage at `[file:line]`
## Findings
> `[P]` = pattern-matched · `[H]` = heuristic
### ✅ Passing
- `[P]` No hardcoded API keys or secrets
- `[P]` Dependencies properly pinned
### ⚠️ Warnings
- `[H]` [Check]: [description]
- **Location:** [file:line]
- **Risk:** [what could go wrong]
- **Suggestion:** [how to fix]
### ❌ Issues
- `[P]` [Check]: [description]
- **Location:** [file:line]
- **Rule:** [which rule violated]
- **Fix:** [specific remediation]
## Recommendations
1. [Priority recommendation]
2. [Additional improvements]
パターン、品質、言語固有のチェックを含む完全な検証を行うには、「verify agent」と入力してください。