跳转到正文
报告库
用途分类 / 开发辅助

Git Guardrails Claude Code Skill 安全审计

作者说它能做什么(原文)

Set up Claude Code hooks to block dangerous git commands (push, reset --hard, clean, branch -D, etc.) before they execute. Use when user wants to prevent destructive git operations, add git safety hooks, or block git push/reset in Claude Code.

第三方安全检查结论

先别安装或运行

已检查文件
3
发现的风险
2
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。未发现风险
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
高风险

防护容易绕过,并在解析失败时放行命令

原文依据:4 处
发现了什么

说明声称阻止所有 git push 变体及多种破坏性命令,但脚本只搜索若干固定文本片段。等价写法如 `git -C repo push`、额外空格、`git clean -df` 或长选项不会命中。脚本还依赖 jq,却未验证 jq 是否成功;解析失败后 COMMAND 可为空,最终仍返回 0。

为什么需要注意

用户可能误以为危险 Git 操作已被可靠禁止,但 Claude 仍可能通过未覆盖的合法语法执行推送、永久删除未跟踪文件或丢弃工作。

该技能声称会阻止所有 `git push` 变体,但脚本仅对整条命令搜索少量固定正则片段。例如命令在 `git` 与 `push` 之间加入 `-C repo`,或改变空格、选项顺序时,可能不匹配并以 0 放行。脚本也依赖 `jq` 提取命令,却没有检查解析是否成功;缺少 `jq`、无效 JSON 或字段缺失时,空值可能走到最终的 `exit 0`。这会让用户误以为防护范围比实际更完整。用户可要求作者采用结构化命令解析、失败时拒绝执行,并提供绕过形式的测试。

SKILL.md:12来自说明文档打开原文件
- `git push` (all variants including `--force`)- `git reset --hard`- `git clean -f` / `git clean -fd`- `git branch -D`- `git checkout .` / `git restore .`
查看另外 3 个位置
scripts/block-dangerous-git.sh:3来自代码打开原文件
INPUT=$(cat)COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
scripts/block-dangerous-git.sh:6来自代码打开原文件
DANGEROUS_PATTERNS=(  "git push"  "git reset --hard"  "git clean -fd"  "git clean -f"  "git branch -D"  "git checkout \."  "git restore \."  "push --force"  "reset --hard")
scripts/block-dangerous-git.sh:18来自代码打开原文件
for pattern in "${DANGEROUS_PATTERNS[@]}"; do  if echo "$COMMAND" | grep -qE "$pattern"; then    echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2    exit 2  fidoneexit 0
中风险

文本片段匹配会阻止无害的 Bash 操作

原文依据:4 处
发现了什么

钩子应用于所有 Bash 调用,但 grep 检查的是整段命令中是否出现某个文本片段,而不是确认实际执行的是 Git 子命令。因此,打印、搜索或写入包含 `git push` 等文字的内容也会被拒绝。

为什么需要注意

正常的文档生成、日志分析、测试或解释命令可能被意外中断,影响项目工作流。

该钩子匹配所有 Bash 工具调用,而脚本只是检查整段命令文本是否含有列出的正则片段,并不解析实际会执行的程序。因此,显示、搜索或写入包含 `git push`、`reset --hard` 等字样的普通命令也可能以代码 2 被拦截。这主要是可用性和决策干扰风险,并不会执行这些危险 Git 操作。用户可要求作者只在解析确认实际 Git 子命令后拦截,或限制钩子的适用范围。

SKILL.md:46来自说明文档打开原文件
  "hooks": {    "PreToolUse": [      {        "matcher": "Bash",        "hooks": [          {            "type": "command",            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-git.sh"          }
查看另外 3 个位置
scripts/block-dangerous-git.sh:18来自代码打开原文件
for pattern in "${DANGEROUS_PATTERNS[@]}"; do  if echo "$COMMAND" | grep -qE "$pattern"; then    echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2    exit 2  fidone
SKILL.md:45来自说明文档打开原文件
{  "hooks": {    "PreToolUse": [      {        "matcher": "Bash",        "hooks": [          {            "type": "command",            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-git.sh"          }
scripts/block-dangerous-git.sh:3来自代码打开原文件
INPUT=$(cat)COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

2 个说明模块

该 Skill 会先询问用户选择项目级或全局安装,然后复制脚本、赋予执行权限,并把它注册为 Claude Code 对所有 Bash 调用运行的 PreToolUse 钩子。全局安装会影响所有项目。

查看原文
SKILL.md:24来自说明文档打开原文件
Ask the user: install for **this project only** (`.claude/settings.json`) or **all projects** (`~/.claude/settings.json`)?
SKILL.md:30来自说明文档打开原文件
Copy it to the target location based on scope:- **Project**: `.claude/hooks/block-dangerous-git.sh`- **Global**: `~/.claude/hooks/block-dangerous-git.sh`Make it executable with `chmod +x`.
SKILL.md:45来自说明文档打开原文件
{  "hooks": {    "PreToolUse": [      {        "matcher": "Bash",        "hooks": [          {            "type": "command",            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-git.sh"          }

钩子从标准输入读取 JSON,用 jq 取出 Bash 命令,再用一组正则表达式逐项搜索命令文本;匹配时返回状态码 2,否则返回 0。它不会实际执行收到的命令,也没有可见的网络传输。

查看原文
scripts/block-dangerous-git.sh:3来自代码打开原文件
INPUT=$(cat)COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
scripts/block-dangerous-git.sh:18来自代码打开原文件
for pattern in "${DANGEROUS_PATTERNS[@]}"; do  if echo "$COMMAND" | grep -qE "$pattern"; then    echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2    exit 2  fidoneexit 0
从这里开始 · 工作说明SKILL.md
git-guardrails-claude-code
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

1 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录3 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • scripts/block-dangerous-git.sh已纳入全文
  • agents/openai.yaml已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • agents/openai.yaml配套文件
  • scripts/block-dangerous-git.sh脚本

代码和说明中提到的操作

运行命令
scripts/block-dangerous-git.sh:1来自代码打开原文件
#!/bin/bash
SKILL.md:48来自说明文档打开原文件
      {        "matcher": "Bash",        "hooks": [
SKILL.md:68来自说明文档打开原文件
      {        "matcher": "Bash",        "hooks": [
读取了多少行
126
文件校验值(用于核对版本)
4385cfe0137bd62417e104898fd8d830355d06abd173fb663eaf07cdd81feb9a