Featured image of post Claude Codeで公式セキュリティプラグインを試してみた:Next.jsリポジトリ診断の実測レポート

Claude Codeで公式セキュリティプラグインを試してみた:Next.jsリポジトリ診断の実測レポート

Claude Code公式プラグインで、自分のNext.jsリポジトリを実際に診断。約5分で返ったLOWの指摘、実行条件、成果物と診断の限界を紹介します。

個人開発や小規模チームの日常開発で、AIコーディングアシスタントを活用する場面が当たり前になりました。一方で、「書いたコードのセキュリティ診断をしたいけれど、専門家を雇うほどではない」「SaaS型のSASTを入れるハードルが高い」と感じている方も多いはずです。

今回は、Claude Codeで動く公式プラグイン claude-security を使い、筆者が管理するNext.jsアプリのリポジトリに対してセキュリティ診断を実施してもらうよう、Claude Code担当エージェントへ依頼しました。

本記事では、実際にどのような流れで診断が行われ、何が成果物として返ってきたのか、実測値とともに整理して紹介します。

診断の実行条件と全体像

今回診断対象としたのは、筆者が個人で管理している非公開のNext.jsアプリケーションです。

安全性を考慮し、元リポジトリから一時的に作成した作業用cloneディレクトリ上で実施しました。元リポジトリにあった未追跡の .env ファイルや認証情報はコピーしていません。また、ローカルCLIの実行ではあるものの、コード情報を外部モデルへ送って解析するため、オフラインで完結する仕組みではない点には留意が必要です。

実測の基本条件は以下の通りです。

項目条件・内容
対象非公開 Next.js アプリ(一時clone、約450ファイル)
実行環境WSL / Linux
使用ツールClaude Code 2.1.302 / 公式 claude-security@claude-plugins-official v0.12.0
診断オプションwhole repository / effort: low
実行範囲静的解析・コード読解(修正提案・コード/テスト/exploitの実行・本番アクセスなし)

セットアップと初回実行でのつまずき

claude-security は、ホスト型サービスではなく、Claude Code内で動作する公式プラグインです。利用にあたっては、有料プラン/API等の契約、Python 3.9以上(python3で実行可能)、Linux/macOS/Windows環境、および差分スキャンやパッチ提案用のGitが必要となります(※全ファイルのスキャン自体にはGitは必須ではありません)。

通常の手動セットアップであれば、以下のコマンドで導入できます。

# マーケットプレイス未登録の場合
/plugin marketplace add anthropics/claude-plugins-official

# プラグインのインストールとリロード
/plugin install claude-security@claude-plugins-official
/reload-plugins

動的ワークフロー(Dynamic workflows)のエラーと対処

今回、Claude Codeエージェントに依頼して初期実行した際、診断が開始する前にストップしました。原因は、セッション内でWorkflow機能が無効になっていたためです。

永続的な設定を変更せず、当該セッションのみで動的に有効化するため、CLI起動時のオプションを指定して再実行しました。

--settings '{"enableWorkflows":true}'

なお、通常の対話型操作で永続化・確認を行いたい場合は、/config コマンド等で設定状態を案内・変更できます。

診断の経過と実際の処理時間

ワークフローの有効化後、再実行したセッションは正常に完了しました。

  • セッション全体の処理時間:約4分43秒
  • 準備時間を除いた成功セッションの実行時間:約5分

今回指定した effort: low では、大規模なプロファイリング(詳細inventory、脅威モデル作成、breadth sweepなど)が省略されました。実際に行われた処理は、調査役による候補摘出(1件)から始まり、到達可能性・影響・既存の防御措置という3つの観点からの検証、正式レポート作成、最終的な認証情報マスク確認という流れでした。

今回の実行で動いたのはこのような限定的なステップであり、プラグインが持つ一般的な全工程(全effort)が網羅されたわけではありません。

診断結果と得られた成果物

今回の effort: low による診断結果は以下の通りです。

深刻度検出件数
CRITICAL0件
HIGH0件
MEDIUM0件
LOW1件

指摘された内容は要約すると、「不正な繰り返しリクエストに対する制御が不足しており、利用回数や一部の限定機能の扱いに影響する可能性がある」というものでした(具体的な対象コードや攻撃手法は非公開)。コード読解による検証役からも同指摘が支持されました。

なお、対応方針を検討するため、後続のIssueへ登録済みです。

生成された正式成果物

診断終了後、一時クローン配下に以下の正式成果物ファイル(名前は固定表記)が生成されました。成果物の出力自体はスクリプト処理によって行われます。

  1. CLAUDE-SECURITY-RESULTS.md(人間が読みやすいMarkdown形式レポート)
  2. CLAUDE-SECURITY-RESULTS.jsonl
  3. CLAUDE-SECURITY-RESULTS.sarif
  4. CLAUDE-SECURITY-REVISION-<sha12>.json(対象コミット、effort、検出件数、検証状況などの記録)

元リポジトリへの影響

診断完了後、元リポジトリの git status は clean のままでした。コードの修正・コミット・Push・デプロイなどは一切行われていません(※これは実行プロセスの前後で手元コードが意図せず書き換わらなかったことを意味するものであり、元コードの安全性が保証されたという意味ではありません)。

また、クレジット利用枠(トークン等)を消費するため、診断対象の規模や指定する effort レベルに応じて、事前に使用量やコストの確認を行うことをおすすめします。

運用上の注意点とセキュリティ上の考慮事項

今回 claude-security を利用してみて分かった、主な注意点は以下の通りです。

  1. スキャンは非決定論的(Non-deterministic) AIによるコード読解と検証に基づくため、実行ごとに結果が変わる可能性があります。未検出=絶対安全ではありません。
  2. プラグイン自体はサンドボックスを提供しない claude-security は独自の隔離環境を構築しません。作業用クローンを作成しても、それ自体がサンドボックスになるわけではないため、信頼できる自身のコードに対して使用するのが基本です。不審なサードパーティ製リポジトリを診断する場合は、セッション全体の隔離環境(容器やVMなど)を用意する必要があります。
  3. レポート内の認証情報マスクは Best Effort 生成されたレポート内の秘匿情報マスク処理はファイル書き出し後にAgentが行う置換処理であり、外部送信時の遮断機構ではありません。レポートを他者と共有する前には、必ず人間が手動で内容を確認してください。
  4. 従来の安全対策を補完するもの 1回の静的診断で全体の安全性が保証されるわけではありません。依存関係スキャン(npm auditなど)やSASTツール、人間による通常のコードレビューを置き換えるものではなく、それらを補う追加のチェック層として位置付けるのが適切です。

まとめ

claude-security プラグインを使うことで、普段使い慣れた CLI 環境から手軽にリポジトリ全体のロジックや整合性を意識したセキュリティ診断を依頼できます。

「専門的なSASTを導入するほどではないが、AIの力でコードの弱点をチェックしたい」という個人開発者や少人数チームにとって、開発フローに組み込む選択肢の一つとして非常に魅力的です。関心のある方は、まずは小さめのリポジトリや effort: low から試してみてはいかがでしょうか。

参考リンク

この記事は Gemini Flash が執筆しました。

Next Action

おすすめリンク

この記事に合わせて、関連アイテムを探しやすいリンクをまとめています。

Affiliate Links

AIエージェント設計を深掘りする

AIエージェントや開発まわりを、もう少し詳しく学びたい人向けです。

AIエージェント設計の本を探す Claude、LLM、エージェント設計を深掘りしたい時向け
AI開発・Python本を探す API連携や実装まで踏み込みたい時向け
生成AIの本を探す 入門書、活用本、プロンプト本向け

外部ストアへのアフィリエイトリンクです。気になるものだけ開けば十分です。

この記事にお便りを送る

送信した内容は、その場ではページに出ません。届いたメールを管理人が読んで、 載せてよいものだけをこの欄に手で掲載し、そのとき返事も添えます。 時間差のあるコメント欄だと思ってください。 掲載しないこともありますし、返信をお約束するものでもありません。

B!