T-CREATOR

<div />

Claude Code の /security-review で変更を点検する手順: origin/HEAD がないと止まる

Claude Code の /security-review で変更を点検する手順: origin/HEAD がないと止まる

Claude Code の /security-review は、今のブランチで変えたところだけを点検するコマンドで、リポジトリに origin​/​HEAD がないと点検の前に止まります。2026年11月7日に Claude Code 2.1.309 で、弱いところを3つ入れた変更を点検させると、約1分40秒で3つとも High として返しました。

経緯

自分で書いた変更や、AI に書かせた変更を出す前に、/security-review で点検しようとしました。最初は何も返らずに終わったので、原因を調べ、点検から直すまでの流れを確かめました。

環境

  • macOS 26.6.2、Node.js 24.19.0
  • Claude Code 2.1.309(モデルは初めの設定の Claude Opus 5.5)
  • Git のリポジトリ。main に元の版、feature​/​files-and-ping に点検したい変更

手順

点検したい変更をブランチにコミットする

/security-review は、origin​/​HEAD(リモートの初めのブランチ)と今のブランチの差分を点検します。点検したい変更は、ブランチにコミットしておきます。

今回の変更には、次の3つを入れました。

場所変更
​/​users?name=? を使った書き方から、名前をそのまま SQL の文に埋め込む書き方に変えた
​/​files?name=ファイル名をそのまま path.join でつなぎ、ファイルを返す処理を足した
​/​ping?host=入力をそのまま exec のコマンドに埋め込む処理を足した

origin/HEAD があるかを確かめる

次のコマンドで、origin​/​main のような名前が出れば準備はできています。

terminal$ git rev-parse --abbrev-ref origin/HEAD
origin/main

リモートのないリポジトリや、origin​/​HEAD が決まっていないリポジトリで /security-review を動かすと、点検の前に次のエラーで止まります。claude -p で動かしたときは、返事が空のまま終わりました。

terminalfatal: ambiguous argument 'origin/HEAD...': unknown revision or path not in the working tree.

リモートがあって origin​/​HEAD だけが決まっていないときは、比べる元のブランチ(ここでは main)を指定して決めます。

terminal$ git remote set-head origin main
$ git rev-parse --abbrev-ref origin/HEAD
origin/main

--auto を付けると、リモートで初めのブランチになっているものに合わせます。点検したいブランチを指してしまうと差分が空になるので、決めたあとに上のコマンドで確かめます。

/security-review を実行する

ブランチを切り替えた状態で、Claude Code の入力欄に ​/​security-review と入れます。1回の指示で任せるときは、次のように実行します。

terminal$ claude -p "/security-review"

今回は、約1分40秒で返事が返りました。/security-review は、実行するとまず Git のコマンドで origin​/​HEAD からの変更を読み込み、そのうえで変わったファイルを読みます。上のエラーは、この最初の読み込みで出たものです。

返ってきた結果を読む

結果は、見つけたものごとに次の形で並びました。

項目内容(1つ目の例)
見出しVuln 1: Command Injection: src​/​server.js:34
SeverityHigh
Categorycommand_injection
Confidence10/10
Descriptionhost がそのまま exec に渡り、; などで別のコマンドが動く
Exploit ScenarioGET ​/​ping?host=127.0.0.1;id で id が動き、結果が返る
Recommendationシェルを通さない execFile('ping', ['-c', '1', host]) にし、host の形を確かめる

3つの結果は次のとおりです。

見つけたものSeverityConfidence
​/​ping のコマンドの埋め込みHigh10/10
​/​users の SQL の埋め込みHigh9/10
​/​files の ..​/​ で外のファイルを読めるHigh9/10

SQL の項目では、変えたところを指して説明していました。「このコミットで ? を使った書き方から文字列をつなぐ書き方に変わった」という説明です。差分を点検するコマンドなので、元からあったコードではなく、変えたところが説明の中心になります。

直して、もう一度実行する

Recommendation のとおりに3か所を直してコミットし、もう一度 /security-review を実行しました。

場所直し方
​/​users? を使った書き方に戻した
​/​filespath.basename でフォルダーの部分を外し、files​/​ の中に収まるかを確かめた
​/​pingexecFile に変え、host を IP アドレスかホスト名の形だけに限った

2回目は51秒で、「No high-confidence vulnerabilities found.(確信度の高い弱いところは見つからなかった)」と返りました。直したそれぞれの場所について、なぜ大丈夫なのかの説明も付いていました。

注意点

点検するのは差分だけ

/security-review は、origin​/​HEAD からの変更だけを見ます。前からあるコード全体を点検したいときは、Claude Code に「このリポジトリ全体のセキュリティーを点検して」のように頼むか、セキュリティーのスキルを使います。スキルを使ったときの違いは、Cloudflare の security-audit スキルを Claude Code と Codex で比較に書きました。

コードは動かさず、読むだけで判断している

2回目の返事にも「コードを読んだだけで、何も動かしていない」と書かれていました。見つからなかったことは、安全の保証ではありません。直したあとは、テストで動きを確かめます。

1回ずつの結果で、やり直すと変わることがある

同じ差分でも、もう一度実行すると、Severity や Confidence の値が変わることがあります。

参考文献

著書

とあるクリエイター

フロントエンドエンジニア Next.js / React / TypeScript / Node.js / Docker / AI Coding