security-review
包括的なセキュリティ分析:コードの詳細な検査、脆弱性の検出、OWASP Top 10のチェック、シークレット(認証情報)のスキャン、依存関係の監査を実施します。「security review」「check security」「find vulnerabilities」「security audit」などのキーワードで起動します。
description の原文を見る
Comprehensive security analysis: code deep dive, vulnerability detection, OWASP Top 10 checks, secrets scanning, dependency audit. Triggers: 'security review', 'check security', 'find vulnerabilities', 'security audit'.
SKILL.md 本文
セキュリティレビュースキル
コード探索、脆弱性検出、プロジェクト固有のベストプラクティスを備えた深度なセキュリティ分析。
引数
<path>- 分析するディレクトリ(デフォルト:.)--scope-file <path>- scope.json へのパス(premerge から)--changed- メインブランチ以降の変更ファイルのみ--fetch-reports- 最近の CVE/セキュリティアドバイザリを取得--deep- 徹底的な分析を有効にする(低速、より詳細)
自律動作モード
このスキルは以下に焦点を当ててデフォルトで自律的に動作します:
- 問題の発見 - すべての OWASP カテゴリ全体における包括的な検出
- 安全な問題の自動修正 - 動作を変更しない修正を適用
- 検出結果の優先順位付け - Critical/High は即座に対応
- 協働 - 検出結果を他のスキルと共有して総合的なレビュー実施
哲学:修正が明白な場合、セキュリティ問題は人間のレビューを待つべきではありません。安全な修正を適用し、人間の判断が必要な事項にフラグを立てます。
自動修正ポリシー
確認なしに自動的に適用:
| 問題 | 自動修正アクション |
|---|---|
| 本番環境以外のテストで硬くコードされたシークレット | テストリソースに移動 |
リクエスト DTO での @Valid 欠落 | バリデーションアノテーションを追加 |
ハンドラーの printStackTrace() | 適切なログに置き換え |
セキュリティ関連フィールドの final 欠落 | final 修飾子を追加 |
dev 設定のみの CORS * | dev 専用であることを示すコメントを追加 |
| リクエストボディのデバッグログ出力 | 機密フィールドをマスク |
自動的に適用してから報告:
| 問題 | 自動修正アクション |
|---|---|
| レート制限アノテーション欠落 | デフォルト値で @RateLimited を追加 |
| エラーレスポンスの公開スタックトレース | 汎用メッセージでラップ |
| エンドポイントの認証アノテーション欠落 | @Authenticated を追加(意図を確認するため報告) |
| 弱い BCrypt コスト係数(<10) | コスト 12 にアップグレード |
人間の判断が必要:
| 問題 | 理由 |
|---|---|
| 本番環境設定での硬くコードされたシークレット | 適切なシークレット管理をセットアップする必要 |
| 認可ロジック欠落 | ビジネスルールが必要 |
| 潜在的なインジェクション脆弱性 | 修正はコンテキストに依存 |
| 暗号化アルゴリズムの選択 | セキュリティ/パフォーマンスのトレードオフ |
| WebSocket 認証設計 | アーキテクチャ上の決定 |
クイックフロー
- スコープを読み込む - 分析するファイル/コミットを決定
- セキュリティベストプラクティスを読み込む - プロジェクト固有のガイドラインを読む
- コード深掘り分析 - セキュリティ関連領域を探索(スコープ内)
- セキュリティレポートを取得 - 最近の CVE と依存関係の脆弱性を取得
- OWASP Top 10 チェック - 一般的な Web 脆弱性を検出(スコープ内)
- シークレット検出 - ハードコードされた認証情報、キー、トークンを検出(スコープ内)
- 認証/認可 - 認証パターンをレビュー(スコープ内)
- 入力バリデーション - リクエストバリデーションを確認(スコープ内)
- 依存関係セキュリティ - サードパーティライブラリを監査
- 暗号化の使用法 - 暗号化実装をレビュー(スコープ内)
- 安全な問題を自動修正 - 動作を変更せずに修正を適用
- レポートを生成 - 検出結果と修正を含む
security-review.jsonを作成 - 協働 - 重大な検出結果を他のスキルと共有
- サマリーを提示 - 実行可能なセキュリティ推奨事項
ステップ -1: スコープを読み込む
# premerge から呼び出された場合(スコープファイルが存在)
if [[ -f .review-output/scope.json ]]; then
SCOPE=$(jq -r '.scope' .review-output/scope.json)
FILES=$(jq -r '.files[]' .review-output/scope.json)
FILE_COUNT=$(echo "$FILES" | wc -l)
echo "Using scope: $SCOPE ($FILE_COUNT files)"
# スコープ内のファイルを一時ファイルに書き込む
echo "$FILES" | grep "\.java$" > /tmp/java-files.txt
echo "$FILES" | grep -E "\.(properties|yaml|yml|env)$" > /tmp/config-files.txt
# チェック用スコープフラグを設定
SCOPED=true
elif [[ "$1" == "--changed" ]]; then
# 従来の --changed フラグ
MAIN=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
git diff --name-only $(git merge-base $MAIN HEAD) > /tmp/all-files.txt
cat /tmp/all-files.txt | grep "\.java$" > /tmp/java-files.txt
cat /tmp/all-files.txt | grep -E "\.(properties|yaml|yml|env)$" > /tmp/config-files.txt
SCOPED=true
else
# デフォルト:リポジトリ全体を分析
find . -type f -name "*.java" | grep -v target > /tmp/java-files.txt
find . -type f \( -name "*.properties" -o -name "*.yaml" -o -name "*.yml" -o -name "*.env" \) > /tmp/config-files.txt
SCOPED=false
fi
# スコープに基づいてチェックを調整
if [[ "$SCOPED" == "true" ]]; then
echo "Running focused security checks on $(cat /tmp/java-files.txt | wc -l) Java files"
else
echo "Running full security scan"
fi
ステップ 0: セキュリティベストプラクティスを読み込む
references/security-best-practices.md からプロジェクト固有のセキュリティガイドラインを読み込み、以下の内容をコンテキストとして取得します:
- Lightning Engine 固有の脅威(モジュール分離、コマンドキュー、WebSocket)
- プロジェクトのセキュリティパターンとアンチパターン
- バリデーション要件と例
ステップ 1: コード深掘り分析
チェック実行前にセキュリティアーキテクチャを理解するためにコードベースを探索します。
セキュリティ関連領域の探索
# ステップ -1 から利用可能なスコープ内ファイルを使用、それ以外は全リポジトリで検索
if [[ -f /tmp/java-files.txt ]]; then
SEARCH_FILES=$(cat /tmp/java-files.txt)
else
SEARCH_FILES=$(find . -type f -name "*.java" | grep -v target)
fi
# 認証 & 認可
echo "$SEARCH_FILES" | xargs grep -l "authenticate\|authorize\|JWT\|BCrypt\|login\|password" 2>/dev/null > /tmp/auth-files.txt || touch /tmp/auth-files.txt
# API エンドポイント(エントリーポイント)
echo "$SEARCH_FILES" | xargs grep -l "@Path\|@GET\|@POST\|@PUT\|@DELETE" 2>/dev/null > /tmp/api-files.txt || touch /tmp/api-files.txt
# データベースアクセス
echo "$SEARCH_FILES" | xargs grep -l "Repository\|MongoClient\|executeQuery\|createQuery" 2>/dev/null > /tmp/db-files.txt || touch /tmp/db-files.txt
# WebSocket エンドポイント
echo "$SEARCH_FILES" | xargs grep -l "@ServerEndpoint\|WebSocket" 2>/dev/null > /tmp/websocket-files.txt || touch /tmp/websocket-files.txt
# コマンドハンドラー(ユーザー入力)
echo "$SEARCH_FILES" | grep -E "Handler\.java$|Command\.java$" > /tmp/command-files.txt || touch /tmp/command-files.txt
# 設定ファイルは既にスコープから /tmp/config-files.txt にあります
深掘り分析
Task ツールと Explore エージェントを使用して以下を理解します:
- 認証フロー(JWT 生成、検証、保存)
- 認可チェック(ロールベースアクセス制御)
- API エンドポイント全体の入力バリデーションパターン
- データベースクエリ構築方法
- WebSocket 認証/セッション管理
- モジュールロードセキュリティ(ClassLoader 分離)
- コマンドキューバリデーション
ステップ 2: セキュリティレポートを取得
最近の CVE チェック
# --fetch-reports フラグが設定されているか確認
if [[ "$1" == "--fetch-reports" ]]; then
echo "Fetching recent security advisories..."
# WebSearch を使用して最近の Java/Quarkus CVE を検出
# 結果を /tmp/cve-reports.txt に保存
fi
依存関係の脆弱性スキャン
# Maven 依存関係チェック
if command -v mvn &> /dev/null; then
echo "Running OWASP Dependency Check..."
mvn org.owasp:dependency-check-maven:check -DskipTests 2>&1 | tee /tmp/dependency-check.log
# 結果を解析
if [[ -f target/dependency-check-report.html ]]; then
grep -oP "severity[^<]+" target/dependency-check-report.html | sort | uniq -c > /tmp/vuln-summary.txt
fi
fi
既知の脆弱性データベース
既知の脆弱性バージョンの依存関係をチェック:
- Log4j < 2.17.1(Log4Shell)
- Spring Framework RCE 脆弱性
- Jackson デシリアライゼーション問題
- Netty、Undertow セキュリティパッチ
- MongoDB ドライバーの脆弱性
ステップ 3: OWASP Top 10 チェック
A01:2021 - 破られたアクセス制御
チェック 1: 認可チェック欠落
# @RolesAllowed または認可チェックのないエンドポイントを検出
for f in $(cat /tmp/api-files.txt); do
if grep -q "@Path" "$f"; then
if ! grep -q "@RolesAllowed\|@Authenticated\|securityContext.isUserInRole" "$f"; then
echo "HIGH: $f - Endpoint missing authorization check"
fi
fi
done
チェック 2: 直接オブジェクト参照(IDOR)
# 所有権バリデーションのない UUID/ID パスパラメータを検出
grep -rn "@PathParam.*UUID\|@PathParam.*id" --include="*.java" | while read line; do
file=$(echo "$line" | cut -d: -f1)
# ファイルが所有権を検証するか確認
if ! grep -q "validateOwnership\|checkPermission\|belongsToUser" "$file"; then
echo "HIGH: $file - Possible IDOR vulnerability"
fi
done
A02:2021 - 暗号化の失敗
チェック 1: 弱いパスワードハッシング
grep -rn "MessageDigest\|MD5\|SHA1" --include="*.java" . && \
echo "HIGH: Weak hashing algorithm detected (use BCrypt/Argon2)"
# BCrypt コスト係数を検証
grep -rn "BCrypt" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
grep -A5 -B5 "BCrypt" "$file" | grep -oP "cost.*\d+"
done
チェック 2: ハードコードされたシークレット
# シークレットパターン
grep -rn --include="*.java" --include="*.properties" --include="*.yaml" \
-E "(password|secret|api[_-]?key|private[_-]?key|token|jwt[_-]?secret)\s*=\s*['\"][^'\"]+['\"]" . \
| grep -v "CHANGEME\|YOUR_" \
> /tmp/hardcoded-secrets.txt
# AWS キー
grep -rn --include="*.java" --include="*.properties" --include="*.yaml" \
-E "AKIA[0-9A-Z]{16}" . >> /tmp/hardcoded-secrets.txt
# JWT シークレット
grep -rn "jwt.secret\|jwt-secret" --include="*.properties" --include="*.yaml" . | \
grep -v "\${" >> /tmp/hardcoded-secrets.txt
チェック 3: 不安全な TLS/SSL
grep -rn "SSLContext\|TrustManager" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if grep -q "TrustAllCertificates\|X509TrustManager.*{}" "$file"; then
echo "CRITICAL: $file - Insecure TLS configuration (trusts all certificates)"
fi
done
A03:2021 - インジェクション
チェック 1: SQL インジェクション
# クエリ文字列の連結を検出
grep -rn --include="*.java" \
-E "executeQuery\s*\(.*\+|createQuery\s*\(.*\+" . \
> /tmp/sql-injection.txt
# MongoDB クエリインジェクション
grep -rn --include="*.java" \
-E "Filters\.eq\(.*\+|new Document\(.*\+" . \
>> /tmp/sql-injection.txt
チェック 2: コマンドインジェクション
# ユーザー入力を使用した Runtime.exec を検出
grep -rn --include="*.java" \
-E "Runtime\.getRuntime\(\)\.exec|ProcessBuilder.*\(" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
linenum=$(echo "$line" | cut -d: -f2)
# 入力がサニタイズされているか確認
if ! grep -A10 -B10 "^$linenum" "$file" | grep -q "validate\|sanitize\|escape"; then
echo "CRITICAL: $file:$linenum - Possible command injection"
fi
done
チェック 3: LDAP インジェクション
grep -rn --include="*.java" \
-E "LdapContext|DirContext.*search" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if grep -q "String.*+\|concat" "$file"; then
echo "HIGH: $file - Possible LDAP injection"
fi
done
チェック 4: XML インジェクション(XXE)
# セキュアな設定のない XML パーサーを検出
grep -rn --include="*.java" \
-E "DocumentBuilderFactory|SAXParserFactory|XMLInputFactory" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
# セキュアなデフォルトを確認
if ! grep -q "setFeature.*FEATURE_SECURE_PROCESSING\|disallow-doctype-decl" "$file"; then
echo "HIGH: $file - XML parser may be vulnerable to XXE"
fi
done
A04:2021 - 不安全な設計
チェック 1: レート制限欠落
# エンドポイントがレート制限を持つか確認
if ! grep -rq "@RateLimited\|RateLimiter\|Bucket4j" --include="*.java" .; then
echo "MEDIUM: No rate limiting detected on API endpoints"
fi
チェック 2: 無制限のリソース消費
# サイズ制限のないファイルアップロードを検出
grep -rn "@Consumes.*multipart" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "maxFileSize\|ContentLength\|size.*limit" "$file"; then
echo "MEDIUM: $file - File upload without size restriction"
fi
done
A05:2021 - セキュリティの設定ミス
チェック 1: 公開されたスタックトレース
grep -rn "printStackTrace\|e\.getMessage" --include="*.java" . | \
grep -E "Resource\.java|ExceptionMapper" | \
while read line; do
echo "MEDIUM: $line - Stack trace may leak in HTTP response"
done
チェック 2: 詳細なエラーメッセージ
# 例外マッパーをチェック
find . -name "*ExceptionMapper.java" | while read f; do
if grep -q "ex\.getMessage\|ex\.toString" "$f"; then
echo "MEDIUM: $f - Exception details exposed to client"
fi
done
チェック 3: CORS 設定ミス
grep -rn "Access-Control-Allow-Origin.*\*" --include="*.java" --include="*.properties" . && \
echo "HIGH: CORS allows all origins"
チェック 4: 本番環境でのデバッグモード
grep -rn "debug\s*=\s*true\|quarkus\.log\.level\s*=\s*DEBUG" \
--include="*.properties" --include="*.yaml" . | \
grep -v "application-dev" && \
echo "MEDIUM: Debug mode enabled in production config"
A06:2021 - 脆弱で古いコンポーネント
ステップ 2(依存関係セキュリティ)で対応。
A07:2021 - 認識と認証の失敗
チェック 1: 弱い JWT 設定
# JWT 有効期限を確認
grep -rn "jwt.*expir\|token.*expir" --include="*.java" --include="*.properties" . | while read line; do
if echo "$line" | grep -qE "[0-9]{5,}|365|999"; then
echo "MEDIUM: $line - JWT expiration too long"
fi
done
# JWT アルゴリズムを確認
grep -rn "Algorithm\." --include="*.java" . | while read line; do
if echo "$line" | grep -q "Algorithm.none\|HMAC.*none"; then
echo "CRITICAL: $line - JWT with 'none' algorithm"
fi
done
チェック 2: ブルートフォース保護欠落
# ログインエンドポイントを確認
grep -rn "@POST.*login\|authenticate" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "RateLimiter\|LoginAttempt\|throttle" "$file"; then
echo "HIGH: $file - Login endpoint without brute force protection"
fi
done
チェック 3: 不安全なセッション管理
# セッション固定保護を確認
grep -rn "HttpSession" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "invalidate\|changeSessionId" "$file"; then
echo "MEDIUM: $file - Possible session fixation vulnerability"
fi
done
A08:2021 - ソフトウェアおよびデータ整合性の失敗
チェック 1: 署名されていないモジュール JAR
# モジュールロードが署名を検証するか確認
grep -rn "loadModule\|ClassLoader" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "verifySignature\|checksum\|hash" "$file"; then
echo "HIGH: $file - Module loading without integrity check"
fi
done
チェック 2: 不安全なデシリアライゼーション
grep -rn "ObjectInputStream\|readObject\|XMLDecoder" --include="*.java" . && \
echo "HIGH: Java deserialization detected (potential RCE)"
# Jackson デシリアライゼーション
grep -rn "@JsonTypeInfo\|enableDefaultTyping" --include="*.java" . && \
echo "HIGH: Jackson polymorphic deserialization (potential RCE)"
A09:2021 - セキュリティログとモニタリングの失敗
チェック 1: セキュリティイベントログ欠落
# 認証失敗がログされているか確認
grep -rn "authenticate\|login" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "log\.warn\|log\.error\|logger\." "$file"; then
echo "MEDIUM: $file - Authentication without logging"
fi
done
チェック 2: 機密データのログ記録
# パスワード/トークンのログを検出
grep -rn "log.*password\|log.*token\|log.*secret" --include="*.java" . | \
grep -v "password.*\*\*\*\|token.*\*\*\*" | \
while read line; do
echo "HIGH: $line - Sensitive data in logs"
done
A10:2021 - サーバーサイドリクエストフォージェリ(SSRF)
チェック 1: 未検証の URL フェッチング
# ユーザー制御 URL を使用する HTTP クライアントを検出
grep -rn "HttpClient\|WebClient\|RestClient" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if grep -q "request.*\+" "$file" && ! grep -q "validateUrl\|isAllowed\|whitelist" "$file"; then
echo "HIGH: $file - Possible SSRF (unvalidated URL)"
fi
done
ステップ 4: Lightning Engine 固有のセキュリティ
モジュールシステムセキュリティ
チェック 1: ClassLoader 分離
# モジュール分離を確認
grep -rn "ContainerClassLoader" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if grep -q "getSystemClassLoader\|getParent.*null" "$file"; then
echo "HIGH: $file - ClassLoader may bypass isolation"
fi
done
チェック 2: 悪意のあるモジュールからの保護
# SecurityManager の使用を確認
if ! grep -rq "SecurityManager\|AccessController" --include="*.java" .; then
echo "MEDIUM: No SecurityManager for module sandboxing"
fi
# モジュールバリデーションを確認
grep -rn "install.*module\|loadModule" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "validate\|scan\|verify" "$file"; then
echo "HIGH: $file - Module installation without security scan"
fi
done
コマンドキューセキュリティ
チェック 1: コマンドバリデーション
find . -name "*CommandHandler.java" -o -name "*Command.java" | while read f; do
if ! grep -q "@Valid\|validate\|check" "$f"; then
echo "HIGH: $f - Command handler missing input validation"
fi
done
チェック 2: コマンド発信元検証
grep -rn "CommandQueue\|queueCommand" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "userId\|playerId\|sessionId" "$file"; then
echo "MEDIUM: $file - Command without origin tracking"
fi
done
WebSocket セキュリティ
チェック 1: WebSocket 認証
find . -name "*WebSocket.java" | while read f; do
if grep -q "@ServerEndpoint" "$f"; then
if ! grep -q "@OnOpen.*authenticate\|validate.*session\|checkAuth" "$f"; then
echo "CRITICAL: $f - WebSocket without authentication"
fi
fi
done
チェック 2: メッセージバリデーション
grep -rn "@OnMessage" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -A10 "@OnMessage" "$file" | grep -q "validate\|sanitize"; then
echo "HIGH: $file - WebSocket message without validation"
fi
done
リソースアップロードセキュリティ
チェック 1: パストラバーサル
grep -rn "uploadResource\|saveFile\|writeFile" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "normalize\|canonicalize\|\\.\\." "$file"; then
echo "CRITICAL: $file - File upload vulnerable to path traversal"
fi
done
チェック 2: ファイルタイプバリデーション
grep -rn "@Consumes.*multipart" --include="*.java" . | while read line; do
file=$(echo "$line" | cut -d: -f1)
if ! grep -q "contentType\|mime\|extension" "$file"; then
echo "HIGH: $file - File upload without type validation"
fi
done
ステップ 5: 設定セキュリティ
シークレット管理
# 環境変数の使用を確認
if grep -rq "System\.getenv\|@ConfigProperty" --include="*.java" .; then
echo "✓ Using environment variables for config"
else
echo "MEDIUM: Secrets may be hardcoded"
fi
# .env ファイルが .gitignore にあるか確認
if [[ -f .gitignore ]] && ! grep -q "\.env" .gitignore; then
echo "HIGH: .env not in .gitignore"
fi
# コミットされたシークレットを検出
git log --all --full-history --source -- "*.env" "*.properties" | grep -q "password\|secret\|key" && \
echo "CRITICAL: Secrets found in git history"
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- samanthaci
- ライセンス
- MIT
- 最終更新
- 2026/2/6
Source: https://github.com/samanthaci/stormstack / ライセンス: MIT