mcpField
B
block-no-verify-hook

block-no-verify-hook

github.com/wshobsonセキュリティ41.9k6.7k 回インストール2 週間前に更新
リポジトリ

block-no-verify-hook について

block-no-verify-hookは、AIコーディングエージェントを使うチーム向けのClaude Code PreToolUseフックです。Bash呼び出しを調べ、実行前にGitの回避フラグをブロックし、ほかのツール呼び出しには干渉しません。

主な機能

  1. 01Bashツール呼び出しの検査
  2. 02Gitフックや署名を回避するフラグのブロック
  3. 03JSON入力内のコマンド文字列を確認
  4. 04終了コードによるブロックまたは許可
  5. 05プロジェクト単位と全体設定に対応

活用シーン

  1. 01コミット時のpre-commitフック回避を防止
  2. 02GitコマンドでのGPG署名を徹底
  3. 03短縮フラグによるチェック回避を阻止

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshobson/agents --skill block-no-verify-hook

インストール後、Claude Code で/block-no-verify-hookを入力して読み込まれたか確認します。

詳細

Block No-Verify フック

実行前にバイパスフラグの使用を傍受してブロックする PreToolUse フックの設定です。これにより、AI エージェントが pre-commit フック、GPG 署名、その他の git の安全機構をスキップできないようにします。

概要

AI コーディングエージェント(Claude Code、Codex など)は、pre-commit フックをバイパスする --no-verify のようなフラグを付けてシェルコマンドを実行できます。これは、pre-commit フックで設定されたリンティング、フォーマット、テスト、セキュリティチェックの意義を損ないます。block-no-verify フックは、実行前にバイパスフラグを含むツール呼び出しを拒否する PreToolUse ガードを追加します。

問題

AI エージェントがコードをコミットする際、フックの失敗を避けるためにバイパスフラグを使うことがあります。

# These commands skip pre-commit hooks entirely
git commit --no-verify -m "quick fix"
git push --no-verify
git commit --no-gpg-sign -m "unsigned commit"
git merge --no-verify feature-branch

これにより次のことが可能になります。

  • フォーマットされていないコードがリポジトリに入り込む
  • リンティングエラーがチェックをすり抜ける
  • セキュリティスキャンがスキップされる
  • 署名されていないコミットが署名ポリシーを回避する
  • テストスイートが回避される

解決策

.claude/settings.json に PreToolUse フックを追加し、すべての Bash ツール呼び出しを検査して、バイパスフラグを含むコマンドをブロックします。

設定

プロジェクトの .claude/settings.json に以下を追加します。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}
仕組み
  1. マッチャー: このフックは Bash ツール呼び出しだけを対象とするため、他のツール(Read、Edit、Grep など)には干渉しません。
  2. 検査: Claude Code はツール呼び出しを JSON として stdin でフックに送信し、$TOOL_INPUT 変数は設定しません。フックはその JSON 内の command の値を grep -E で検索するため、jq や node は不要で、cwd やツール呼び出しの説明など他のフィールドのテキストでトリガーされることもありません。--no-verify、--no-gpg-sign、および git が受け付けるこれらの短縮プレフィックス(例: --no-veri)をブロックします。また、同じコマンド内で commit の後に続く n を含む短いオプションのグループ(例: -n や -nm)もブロックします。これは -n が --no-verify の短縮形だからです。このフックは git という単語を探さないため、if git ...、sudo git ...、g=git; $g commit --no-verify も捕捉します。コミットメッセージがフラグに言及している場合のような誤検出は呼び出しをブロックしますが、これは安全側に倒れる挙動です。
  3. ブロック: git コマンド内にバイパスフラグが見つかった場合、フックはコード 2 で終了し、エラーメッセージを出力します。終了コード 2 は Claude Code にツール呼び出しを完全に拒否するよう指示します。
  4. パススルー: バイパスフラグが見つからなかった場合、フックはコード 0 で終了し、コマンドは通常どおり実行されます。
  5. 限界: このフックはテキストを検査するため、習慣的にバイパスフラグに手を伸ばすエージェントは止められます。しかし、フラグを部品から組み立てたり、git -c core.hooksPath=/dev/null commit を実行したりするなど、回避を意図したエージェントは止められません。
終了コード
コード意味
0ツール呼び出しの続行を許可する
1エラー(ツール呼び出しは続行され、警告が表示される)
2ツール呼び出しを完全にブロックする

ブロックされるフラグ

フラグ目的ブロックされる理由
--no-verifypre-commit フックと commit-msg フックをスキップするリンティング、フォーマット、テスト、セキュリティチェックをバイパスする
--no-gpg-signGPG コミット署名をスキップするコミット署名ポリシーをバイパスする

インストール

プロジェクトごとの設定

プロジェクトルートに .claude/settings.json を作成または更新します。

mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}
EOF
グローバル設定

すべてのプロジェクトで適用するには、~/.claude/settings.json に追加します。

mkdir -p ~/.claude
cat > ~/.claude/settings.json << 'EOF'
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}
EOF

検証

フックがバイパスフラグをブロックすることをテストします。

# This should be blocked by the hook:
git commit --no-verify -m "test"

# This should succeed normally:
git commit -m "test"

フックの拡張

ブロックするフラグの追加

追加のフラグ(例: --force)をブロックするには、grep パターンを拡張します。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n|git([[:space:]]|\\\\t)([^\"\\\\]|\\\\.)*--force)'; then echo 'BLOCKED: Bypass flags are not allowed.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}
他のフックとの組み合わせ

block-no-verify フックは他の PreToolUse フックと併用できます。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: Bypass flags not allowed.' >&2; exit 2; fi"
          }
        ]
      },
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if grep -qE 'rm[[:space:]]+-rf[[:space:]]+/'; then echo 'BLOCKED: Dangerous rm command.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

ベストプラクティス

  1. 設定ファイルをコミットする -- .claude/settings.json をバージョン管理に追加して、チームメンバー全員がフックの恩恵を受けられるようにします。
  2. オンボーディングで文書化する -- プロジェクトのコントリビューションガイドでフックに言及し、開発者がなぜバイパスフラグがブロックされるのかを理解できるようにします。
  3. pre-commit フックと組み合わせる -- block-no-verify フックは pre-commit フックが実行されることを保証します。意味のある pre-commit フックが設定されていることを確認してください。
  4. セットアップ後にテストする -- テストコミットで意図的にフックをトリガーして、フックが機能することを検証します。

コメント