Agent Skills by ALSEL
Anthropic Claudeセキュリティ⭐ リポ 0品質スコア 60/100

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 - 徹底的な分析を有効にする(低速、より詳細)

自律動作モード

このスキルは以下に焦点を当ててデフォルトで自律的に動作します:

  1. 問題の発見 - すべての OWASP カテゴリ全体における包括的な検出
  2. 安全な問題の自動修正 - 動作を変更しない修正を適用
  3. 検出結果の優先順位付け - Critical/High は即座に対応
  4. 協働 - 検出結果を他のスキルと共有して総合的なレビュー実施

哲学:修正が明白な場合、セキュリティ問題は人間のレビューを待つべきではありません。安全な修正を適用し、人間の判断が必要な事項にフラグを立てます。

自動修正ポリシー

確認なしに自動的に適用:

問題自動修正アクション
本番環境以外のテストで硬くコードされたシークレットテストリソースに移動
リクエスト DTO での @Valid 欠落バリデーションアノテーションを追加
ハンドラーの printStackTrace()適切なログに置き換え
セキュリティ関連フィールドの final 欠落final 修飾子を追加
dev 設定のみの CORS *dev 専用であることを示すコメントを追加
リクエストボディのデバッグログ出力機密フィールドをマスク

自動的に適用してから報告:

問題自動修正アクション
レート制限アノテーション欠落デフォルト値で @RateLimited を追加
エラーレスポンスの公開スタックトレース汎用メッセージでラップ
エンドポイントの認証アノテーション欠落@Authenticated を追加(意図を確認するため報告)
弱い BCrypt コスト係数(<10)コスト 12 にアップグレード

人間の判断が必要:

問題理由
本番環境設定での硬くコードされたシークレット適切なシークレット管理をセットアップする必要
認可ロジック欠落ビジネスルールが必要
潜在的なインジェクション脆弱性修正はコンテキストに依存
暗号化アルゴリズムの選択セキュリティ/パフォーマンスのトレードオフ
WebSocket 認証設計アーキテクチャ上の決定

クイックフロー

  1. スコープを読み込む - 分析するファイル/コミットを決定
  2. セキュリティベストプラクティスを読み込む - プロジェクト固有のガイドラインを読む
  3. コード深掘り分析 - セキュリティ関連領域を探索(スコープ内)
  4. セキュリティレポートを取得 - 最近の CVE と依存関係の脆弱性を取得
  5. OWASP Top 10 チェック - 一般的な Web 脆弱性を検出(スコープ内)
  6. シークレット検出 - ハードコードされた認証情報、キー、トークンを検出(スコープ内)
  7. 認証/認可 - 認証パターンをレビュー(スコープ内)
  8. 入力バリデーション - リクエストバリデーションを確認(スコープ内)
  9. 依存関係セキュリティ - サードパーティライブラリを監査
  10. 暗号化の使用法 - 暗号化実装をレビュー(スコープ内)
  11. 安全な問題を自動修正 - 動作を変更せずに修正を適用
  12. レポートを生成 - 検出結果と修正を含む security-review.json を作成
  13. 協働 - 重大な検出結果を他のスキルと共有
  14. サマリーを提示 - 実行可能なセキュリティ推奨事項

ステップ -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
リポジトリ
samanthaci/stormstack
ライセンス
MIT
最終更新
2026/2/6

Source: https://github.com/samanthaci/stormstack / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: samanthaci · samanthaci/stormstack · ライセンス: MIT