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 |
| Severity | High |
| Category | command_injection |
| Confidence | 10/10 |
| Description | host がそのまま exec に渡り、; などで別のコマンドが動く |
| Exploit Scenario | GET /ping?host=127.0.0.1;id で id が動き、結果が返る |
| Recommendation | シェルを通さない execFile('ping', ['-c', '1', host]) にし、host の形を確かめる |
3つの結果は次のとおりです。
| 見つけたもの | Severity | Confidence |
|---|---|---|
/ping のコマンドの埋め込み | High | 10/10 |
/users の SQL の埋め込み | High | 9/10 |
/files の ../ で外のファイルを読める | High | 9/10 |
SQL の項目では、変えたところを指して説明していました。「このコミットで ? を使った書き方から文字列をつなぐ書き方に変わった」という説明です。差分を点検するコマンドなので、元からあったコードではなく、変えたところが説明の中心になります。
直して、もう一度実行する
Recommendation のとおりに3か所を直してコミットし、もう一度 /security-review を実行しました。
| 場所 | 直し方 |
|---|---|
/users | ? を使った書き方に戻した |
/files | path.basename でフォルダーの部分を外し、files/ の中に収まるかを確かめた |
/ping | execFile に変え、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 の値が変わることがあります。
参考文献
著書
articleClaude Code と Codex を並列で動かしたときの動き: 同じファイルでも書き換えは消えない
articleClaude Code の Stop フックで、終わる前にテストを走らせる手順: 失敗が残ったまま終わらない
articleClaude Code と Codex のスキルの置き場所の動き: .claude/skills と .agents/skills は互いに読まない
articleClaude Code の /security-review で変更を点検する手順: origin/HEAD がないと止まる
articleClaude Code と Codex のスキルを入れる前に中身を確かめる手順: security-audit で見る5か所
articleCloudflare の security-audit スキルを Claude Code と Codex で比較: 3つとも見つけ、進め方に差
articleClaude Code と Codex を並列で動かしたときの動き: 同じファイルでも書き換えは消えない
articleClaude Code の Stop フックで、終わる前にテストを走らせる手順: 失敗が残ったまま終わらない
articleClaude Code と Codex のスキルの置き場所の動き: .claude/skills と .agents/skills は互いに読まない
articleClaude Code の /security-review で変更を点検する手順: origin/HEAD がないと止まる
articleClaude Code と Codex のスキルを入れる前に中身を確かめる手順: security-audit で見る5か所
articleCloudflare の security-audit スキルを Claude Code と Codex で比較: 3つとも見つけ、進め方に差
