#!/bin/sh # Hook pre-push: bloquea el push si lo que se va a subir contiene secretos. # # Activar una vez por clon: git config core.hooksPath .githooks # # Este repo es PUBLICO: un secreto que llega al remoto queda expuesto aunque se # borre en el commit siguiente (sigue en el historial). En 2026-03 se filtro asi # una clave de API pegada en .claude/settings.json. # # Si gitleaks esta instalado (https://github.com/gitleaks/gitleaks) se usa el; # si no, se aplica un escaneo minimo con grep sobre los formatos mas comunes. set -u remote="$1" z40=0000000000000000000000000000000000000000 fallo=0 while read -r local_ref local_sha remote_ref remote_sha; do [ "$local_sha" = "$z40" ] && continue # borrado de rama: nada que escanear if [ "$remote_sha" = "$z40" ]; then rango="$local_sha" # rama nueva: todo lo alcanzable else rango="$remote_sha..$local_sha" fi if command -v gitleaks >/dev/null 2>&1; then if ! gitleaks git --no-banner --redact --log-opts="$rango" . ; then fallo=1 fi else # Escaneo minimo: lineas AÑADIDAS en el rango con formatos de clave conocidos. hits=$(git log -p --no-color "$rango" -- . ':!*.min.*' ':!*.lock' \ | grep -E '^\+' \ | grep -E 'AIza[0-9A-Za-z_-]{35}|sk_(live|test)_[0-9A-Za-z]{20,}|ghp_[0-9A-Za-z]{30,}|xox[bp]-[0-9A-Za-z-]{10,}|AKIA[0-9A-Z]{16}|eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}|-----BEGIN [A-Z ]*PRIVATE KEY|(ANTHROPIC_AUTH_TOKEN|ANTHROPIC_API_KEY|OPENAI_API_KEY|API_KEY|SECRET|PASSWORD|TOKEN)["'"'"']?[[:space:]]*[:=][[:space:]]*["'"'"'][^"'"'"']{8,}' \ | grep -vE '\$\{?[A-Z_]+\}?|\*\*\*|EJEMPLO|EXAMPLE|placeholder' ) if [ -n "$hits" ]; then echo "pre-push: posibles secretos en lo que vas a subir ($rango):" >&2 printf '%s\n' "$hits" | cut -c1-120 | sed 's/^/ /' >&2 echo "pre-push: instala gitleaks para un escaneo completo. Si es un falso positivo, --no-verify." >&2 fallo=1 fi fi done if [ "$fallo" -ne 0 ]; then echo "pre-push: PUSH BLOQUEADO. Quita el secreto del commit (git commit --amend o rebase) y rota la clave si ya la has pegado en algun sitio." >&2 exit 1 fi exit 0