Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
独立メディア
いかなるプロジェクトとも無提携
AI知性のフロンティアを探求する
claude-me.com
最新
Claude Codeに--restrictedモードが追加:見知らぬプロジェクトのための最小権限の出発点  ·  Claude Codeの`/cd`コマンドが修正:ディレクトリ移動後、新しいディレクトリの設定が即座に反映され、resumeを待つ必要がなくなった  ·  Claude Codeに起動時警告が追加:`Bash(git * main)`という書き方は、想定よりはるかに広い範囲にマッチする  ·  Claude Codeの--worktreeがGitLabのマージリクエストURLを直接受け取れるように、番号への変換は不要  ·  Claude Code Remote Controlにライブストリーミングが追加:フォアグラウンドsubagentのすべてのツール呼び出しがスマホで見られる  ·  Claude CodeにPreModelSwitch/PostModelSwitchフックが追加:モデル切り替えがついに検知・記録できるように
practice

Claude Codeに起動時警告が追加:`Bash(git * main)`という書き方は、想定よりはるかに広い範囲にマッチする

30秒バージョン · 忙しい方へ
`Bash(git * main)`は2つの制約が書かれているように見えるが、実際には1つしか書かれていないルールよりも緩い——なぜなら`*`がマッチする範囲には、制限されていると思っていたサブコマンド自体が含まれているからだ。

詳しく読む +
01 · なぜ起きたのか?

なぜコマンドの一番前や一番後ろに*を置くのは通常問題ないのに、真ん中(サブコマンドの前)に置くと特に間違いやすいのか?

鍵となるのはサブコマンドの位置だ。Bash(npm run )という書き方を例に取ると、は最後に置かれており、その前のnpm runというサブコマンドを含む部分は完全に固定されて書かれている。そのためこのルールは「npm runの後に何が続いても」という範囲に明確に限定されており、npm installのようなまったく別のサブコマンドを誤って許可してしまうことはない。同様に、を一番前に置く場合(公式例にあるBash( --version)など)も似た状況で、固定部分が反対側にあるため、実際の範囲を一目で読み取りやすい。

本当に間違いやすいのは、サブコマンド自体がのマッチング範囲に含まれてしまう書き方だ——git * mainのように、サブコマンド(logmergepushいずれも該当する)が2つの固定テキストの間に挟まれており、は任意のテキストにマッチできるため、サブコマンドも当然置き換え可能な範囲に含まれてしまう。この書き方は見た目上、両端が制限されているように「見える」ため、真ん中もある程度制限されているという誤解を招きやすいが、実際には真ん中こそが完全に開放された、そのコマンドが具体的に何をするかを決定する重要な部分なのだ。

02 · 仕組みは?

この問題は実際にどんなセキュリティリスクをもたらすのか、単に「ルールの書き方を間違えた」というだけの話ではないのか?

実際のリスクは、サブコマンドが*のマッチング範囲に一度落ちてしまうと、そもそも許可するつもりのなかったgit操作まで連鎖的に許可してしまうという点にある。公式ドキュメントが挙げている例で見ると、Bash(git * main)-cフラグを持つgit -c core.fsmonitor=<スクリプト> diff mainのようなコマンドを許可してしまう。-cフラグは、実行中にgitが指定した外部プログラムを実行できるようにするもので、これはもはや「gitの範囲が広く書かれすぎている」という問題にとどまらない。git logか、それに類似した操作にしか関係しないと思っていたルールが、実際には任意の外部コマンドを実行できる入り口を開いてしまっているということだ。

これが、公式ドキュメントがこの警告をわざわざ独立して取り上げている理由でもある。単純な「ルールが緩すぎて、多くのgitサブコマンドをカバーしてしまっている」という問題と比べて、この書き方の追加のリスクは、危険なフラグ(-cなど)を伴うバリエーションまで許可してしまう点にあり、しかもそうしたバリエーションは表面上は依然として「mainブランチに関連するgitコマンド」に見えるため、ルールレビューの際に異常として気づかれにくい。

03 · 自分にどう影響する?

もし自分のプロジェクトに既にこのような書き方のルールが存在する場合、実際にどう確認し、修正すればよいのか?

第一段階は、2.1.246にアップグレードした後、Claude Codeを起動した際にこの警告が表示されるかどうかに注意することだ——この警告自体が最も直接的な確認方法であり、自分で設定ファイルを手作業で調べてこの書き方がないか探す必要はない。もし古いバージョンの設定を手元に持っている場合は、settings.json内でBash(で始まり、途中に*があり、その後にワイルドカードでない文字が続くルールを直接検索することもできる。特に「特定のブランチに限定している」あるいは「特定のサブコマンドのバリエーションに限定している」ように見えるルールに注意を払うとよい。

第二段階は、見つけた各ルールについて、元々の意図が何だったかを振り返って確認することだ。もし意図が「特定のサブコマンドに限定し、引数は問わない」というものであれば、正しい修正方法は*をサブコマンドの後ろに移動させることだ(例えばgit * maingit log * mainに変更する)。もし意図が本当に「これらのgit操作を、対象がmainブランチである限りすべて許可する」というものだったなら、そのルール自体が存在すべきかどうかを再検討する必要があるかもしれない。サブコマンドを制限しないということ自体が、許可される範囲が一般的な直感よりもはるかに広いことを意味するからだ。

第三段階は、修正後に実際に、許可されると想定しているコマンドと、許可されるべきではないと想定しているコマンドをいくつか使ってテストし、修正後のルールの挙動が本来の意図と一致しているかを確認することだ。構文が正しく変更されたかを見るだけでは不十分だ。

04 · どうすればいい?

gitに限らず、この「*をサブコマンドの前に置く」問題は、他のよく使われるコマンドでも起きるのか?

起きる。この問題は本質的にgit自体とは無関係で、「プログラム名+サブコマンド+引数」という構造を持つあらゆるコマンドで起こりうるマッチングの落とし穴だ。あるツールの挙動がサブコマンドによって決まる(単なるフラグ引数ではなく)限り、*をサブコマンドの前に置くことで、サブコマンド自体が置き換え可能な範囲に含まれてしまう。よくある例としてはdocker(docker rundocker execではサブコマンドの挙動が大きく異なる)、npm(npm installnpm runはまったく意味が違う)、あるいは自分のプロジェクトで使っているサブコマンド構造を持つあらゆるCLIツールが挙げられる。

実務上より安全な確認習慣は、Bashの許可ルールを書くたびに、「このコマンドのどの部分が、それが何をするかを実際に決定するキーワードなのか」を自問することだ。そのキーワード(通常はサブコマンド)がの前に固定して書かれており、がマッチできる範囲に含まれていないことを確認する。この原則はgit専用のものではなく、サブコマンド構造を持つすべてのCLIツールに適用できる汎用的な確認方法だ。

全文 +

Claude Code 2.1.246(2026年8月のアップデート群の一つ)は、見落とされやすいが、実際には権限ルールが本当に意図通りの意味を持っているかどうかに影響する起動時警告を追加した。Bashの許可ルールにおいて、ワイルドカード(*)がサブコマンドの前に配置されている場合——例えばBash(git * main)——起動時に警告が表示される。なぜなら、この種のパターンは直感が示唆するよりもはるかに広い範囲にマッチするからだ。この記事では、この警告が何を示しているのか、そしてその背後のマッチングロジックが実際どう動作するのかを説明する。

Bashルールのマッチングロジック:コマンド全体のテキストを比較し、`*`は任意のテキストを表す

公式ドキュメントはこの点について率直に述べている。Bashルールは「コマンド全体のテキスト」を比較するものであり、*はスペースを含む任意のテキストを表す。Claude Codeは*の前に書かれた固定部分を、そのままこのルールの制約範囲として扱う——つまり*をどこに配置するかが、このルールが実際に何を制限しているかを直接決定する。

なぜ`git * main`は想定よりはるかに広い範囲にマッチするのか

git log --oneline mainというコマンドを例に見てみよう。gitはプログラム自体であり、logはサブコマンドだ——そのプログラムが何をするかを実際に決定しているのはサブコマンドであって、プログラム名ではない。もしBash(git * main)と書いた場合、意図としては「最後にmainが付く限り、log関連の様々な引数を許可する」ということかもしれない。しかしClaude Codeの実際のマッチングロジックは、*の前のgitを一つの制約、*の後のmainを別の制約として扱い、間の*はサブコマンド自体を含む任意のテキストにマッチできる。実際の結果はこうなる。このルールはgit merge maingit push origin main、さらには-cフラグを持ち、指定したプログラムをgitに実行させられるgit -c core.fsmonitor=<スクリプト> diff mainのようなコマンドまで許可してしまう——なぜなら-c*がマッチする範囲に含まれるからだ。逆に、単純なgit log main(間に何もない)は、実はこのルールにマッチしない。

正しい書き方:`*`をサブコマンドの後に置く

「引数を問わずlog関連のコマンドのみを許可する」という本来の意図を実現するには、正しい書き方はサブコマンドを*の前に置くことだ。Bash(git log * main)。こうすることで、gitlogを合わせたものが固定の制約となり、*logmainの間の引数のみにマッチする。そのためgit log --oneline maingit log -5 mainは正しくマッチするが、単純なgit log main(間に何もないバージョン)はこのルールにマッチせず、git push origin mainのようなまったく別のサブコマンドにもマッチしない。

この警告が解決する実際の問題

この種のルールがもたらすリスクは、「まったく制限がない」というほど明白ではない——もしあるルールがまったく何の制限も持たなければ、問題は一目でわかりやすい。本当のリスクは、Bash(git * main)という書き方が表面上は制限があるように「見える」(結局のところgitmainも書かれている)が、実際のマッチング範囲は文字通りの見た目よりもはるかに広く、このギャップはルールレビューの際に目視では気づきにくいという点だ。2.1.246のこの起動時警告が対処しているのは、まさにこの「ルールが妥当に見えるが、実際には想定よりも緩い」というギャップだ。もし過去にサブコマンドの前にワイルドカードを置いた許可ルールを書いたことがあるなら、アップグレード後に起動時にこの警告が表示されるかを確認し、そのルールの実際のマッチング範囲が本来の意図と一致しているかを再確認する価値がある。

出典:Configure permissions - Claude Code DocsClaude Code v2.1.246 Major Updates - DevelopersIO
図解
萬用字元位置決定固定範圍wildcard 放在子指令前(git * main)會讓子指令本身可被替換,匹配範圍遠比字面寬;放在子指令後(git log * main)才能正確限定範圍Where the * Goes Changes What's FixedBash(git * main)Fixed: git ... main* covers the subcommand tooMatches: merge main,push origin main, -c ... diff mainWider than it looksBash(git log * main)Fixed: git log ... mainsubcommand locked inMatches: --oneline main,-5 main (log only)Scoped as intendedClaude Me · claude-me.com
スクリーンショット歓迎。転載時は出典を明記してください。
質問する
10文字以上入力してください
関連記事
Claude Codeに--restrictedモードが追加:見知らぬプロジェクトのための最小権限の出発点
practice · 09/04
Claude Codeの`/cd`コマンドが修正:ディレクトリ移動後、新しいディレクトリの設定が即座に反映され、resumeを待つ必要がなくなった
practice · 09/04
Claude Codeの--worktreeがGitLabのマージリクエストURLを直接受け取れるように、番号への変換は不要
practice · 09/02
Claude CodeのAuto Modeが8月14日からデフォルトに、ルールは今や平易な文章で書けるように
practice · 09/01
関連ニュース
関連トピック