
Bash(git push *) の deny をすり抜ける書き方と止め方|PreToolUse の雛形
※本文とスクリプトは AI(Claude)で作成しました。Claude Code の仕様は2026年11月4日に公式ドキュメントで確認しました。版によって変わります。
※スクリプトは模擬の入力で動作を確かめたものです。Claude Code 本体につないだ確認はしていません。成果や収入を約束するものではありません。
※広告(アフィリエイトリンク・企業からの報酬)は含みません。
settings.json の deny に Bash(git push *) を書いた。それでも push が通ることがあります。
公式が挙げている、止まらない書き方
deny の Bash ルールは、書かれたコマンドの文字に当てる仕組みです。公式は次を「止まらない形」と書いています。
git -C . push origin main
git -c push.default=current push origin main
git 'push' origin main
同じことは curl や rm にもあります。/usr/bin/curl、sh -c 'curl ...' の形は Bash(curl *) に当たりません。
止まるもの
&& や ; でつないだものは分けて見てくれます。cd x && git push は止まります。サブシェルやコマンド置換の中も deny の対象です。
どうするか
公式の案内は2つです。
コマンドの文字によらず、ファイルと通信を OS の層で止めるならサンドボックス
コマンド全体を自分の処理で見てから止めるなら PreToolUse の hook
deny は消しません。普段の書き方を止める1枚目として残し、hook を2枚目に足します。hook も文字の解析なので、全部の書き方は止まりません。OS の層の制限の代わりにはなりません。
ここまでで足りる人には、この先は必要ありません。
この先に入っているもの
git push の別の書き方を止める PreToolUse の hook(Python 1ファイル、標準ライブラリだけ)
settings.json の書き方
模擬の入力で確かめた一覧(止める側と、止めない側)
止められないものと、止めすぎるものの一覧
push 以外の git のサブコマンドにも、BLOCKED と表示の文を変えれば使えます。
(特定商取引法に基づく表記: https://note.com/mujin_ops/n/n7df787b6b1a2)