SuperAPI AI 工具集

pre-push-security-scan

安全与审计

查看项目

更新于 10-15 08:02

技能介绍

用途

Pre-Push Security Scan 是一个在 Git push 前必须执行的安全扫描技能,用于防止 API keys、tokens、passwords、私钥等敏感信息被推送到远程仓库。资料中将其定位为“铁律”,适用于所有 git push、gh pr create、代码同步等场景。

触发条件

以下操作必须先执行安全扫描:

  • git push(任何分支)
  • git push --force
  • gh pr create
  • 任何代码同步到远程仓库的操作
  • cron 自动同步任务

主要能力:三层检查

Layer 1:扫描当前暂存区 / 待推送的 diff

获取待推送的 commits(与远程对比):

git log --oneline @{u}..HEAD 2>/dev/null || git log --oneline -5

扫描 diff 中的敏感模式:

git diff @{u}..HEAD 2>/dev/null | grep -inE \
  '(api[_-]?key|secret|token|password|passwd|credential|private[_-]?key|auth)' \
  | grep -v 'REDACTED\|YOUR_.*_HERE\|placeholder\|example\|TODO\|xxx' \
  | head -30

Layer 2:扫描当前工作目录全部文件

高危模式匹配(排除 .git 目录和已知安全占位符):

grep -rnI --include='*.json' --include='*.md' --include='*.yaml' --include='*.yml' \
  --include='*.sh' --include='*.py' --include='*.js' --include='*.ts' --include='*.env' \
  --include='*.toml' --include='*.conf' --include='*.cfg' \
  -E '(sk-[a-zA-Z0-9]{20,}|ghp_[a-zA-Z0-9]{36}|xoxb-|xoxp-|AIza[a-zA-Z0-9_-]{35}|AKIA[A-Z0-9]{16})' \
  . --exclude-dir=.git --exclude-dir=node_modules --exclude-dir=venv \
  | grep -v 'REDACTED\|YOUR_.*_HERE\|placeholder\|example\|sk-xxx' \
  | head -30

从 pass store 提取已知密钥进行比对(仅在有 pass 的环境下执行):

if command -v pass &>/dev/null; then
  for key_path in api/your-provider api/your-provider api/firecrawl api/deepseek api/your-provider; do
    key_val=$(pass show "$key_path" 2>/dev/null | head -1)
    if [ -n "$key_val" ] && [ ${#key_val} -gt 8 ]; then
      found=$(grep -rnl "$key_val" . --exclude-dir=.git 2>/dev/null)
      if [ -n "$found" ]; then
        echo "🚨 LEAKED: $key_path found in: $found"
      fi
    fi
  done
fi

Layer 3:扫描 Git 历史中新增的敏感内容

扫描最近 N 个 commits 的完整 patch:

git log -p -10 2>/dev/null | grep -inE \
  '^\+.*(api[_-]?key|secret|token|password|private[_-]?key)\s*[:=]' \
  | grep -v 'REDACTED\|YOUR_.*_HERE\|placeholder\|example' \
  | head -20

判定标准

  • Layer 1-3 全部 0 匹配:安全,可以 push
  • 任何一层有匹配:停止 push,逐条检查
  • 匹配项为占位符/示例:确认后可以 push
  • 匹配项为真实密钥:立即移除,替换为 pass show 或占位符

发现泄露后的修复流程

# 1. 安装 git-filter-repo
pip install --user --break-system-packages git-filter-repo

# 2. 创建替换文件(每行格式: 真实密钥==>REDACTED_描述)
cat > /tmp/replacements.txt << 'EOF'
actual_secret_value==>REDACTED_SERVICE_NAME
EOF

# 3. 在仓库 clone 中执行替换
git filter-repo --replace-text /tmp/replacements.txt --force

# 4. Force push
git remote add origin <repo-url>
git push --force --all

# 5. 轮换所有已泄露的密钥(最重要!清理历史只防未来,已泄露的必须换)

已知敏感模式清单

# API Keys
sk-[a-zA-Z0-9]{20,}          # OpenAI/兼容格式
ghp_[a-zA-Z0-9]{36}          # GitHub PAT
ghu_[a-zA-Z0-9]{36}          # GitHub User Token
xoxb-                         # Slack Bot Token
xoxp-                         # Slack User Token
AIza[a-zA-Z0-9_-]{35}        # Google API Key
AKIA[A-Z0-9]{16}             # AWS Access Key

# 飞书
cli_[a-f0-9]{16}             # 飞书 App ID(单独不危险,但不应硬编码)
[a-zA-Z0-9]{32}              # 飞书 App Secret(需结合上下文判断)

# Telegram
[0-9]{8,10}:AA[a-zA-Z0-9_-]{33,35}  # Telegram Bot Token

# Gateway
[a-f0-9]{48}                  # OpenClaw Gateway Token(需结合上下文判断)

# 通用
password\s*[:=]\s*\S+
private_key\s*[:=]
-----BEGIN (RSA |EC |OPENSSH )?PRIVATE KEY-----

自动化集成

Git Hook(推荐)

在仓库 .git/hooks/pre-push 中添加自动扫描:

#!/bin/bash
# Pre-push hook: security scan
echo "🔒 Running pre-push security scan..."

ISSUES=$(git diff @{u}..HEAD 2>/dev/null | grep -icE \
  '(api[_-]?key|secret|token|password|private[_-]?key)\s*[:=]\s*["\x27]?[a-zA-Z0-9_-]{16,}' \
  2>/dev/null || echo 0)

if [ "$ISSUES" -gt 0 ]; then
  echo "🚨 Found $ISSUES potential secret(s) in push. Aborting."
  echo "Run security scan skill for details."
  exit 1
fi

echo "✅ No secrets detected. Proceeding with push."

Cron 同步任务

所有自动同步 cron 任务(如 AGI-Super-Skills 同步)必须在 push 前集成 Layer 1 + Layer 2 扫描。

历史教训

  • 2026-02-05:公开仓库硬编码 API key,密钥泄露,修复成本为轮换密钥。
  • 2026-03-04:AGI-Super-Skills 推送 12 个真实密钥,飞书/TG/Gateway/SSH 全部泄露,修复成本为 git-filter-repo + 全部轮换。

资料强调:两次教训,不允许有第三次。

适用场景与限制

适用场景包括所有 git push、gh pr create、代码同步到远程仓库的操作,以及 cron 自动同步任务。限制方面,资料未提供关于平台兼容性、性能开销或误报率的明确说明;部分模式(如飞书 App Secret、OpenClaw Gateway Token)需结合上下文判断,不能仅凭正则单独判定。