#!/usr/bin/env bash set -euo pipefail # Git Pre-Commit Security Hook # Executes fast deterministic secret detection & Semgrep SAST on staged files before commit. echo "================================================================" echo " RUNNING PRE-COMMIT SECURITY & SAST AUDIT " echo "================================================================" STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM) if [ -z "${STAGED_FILES}" ]; then exit 0 fi # 1. Check for actual hardcoded secret values (excluding the hook script itself and example/test files) SUSPICIOUS_ASSIGNMENTS='(AWS_SECRET_ACCESS_KEY\s*[:=]\s*["'\''][A-Za-z0-9/+=]{16,}["'\'']|ghp_[A-Za-z0-9]{36}|BEGIN (RSA|EC|OPENSSH) PRIVATE KEY)' if git diff --cached | grep -v "pre-commit" | grep -v "example" | grep -v "test" | grep -E "${SUSPICIOUS_ASSIGNMENTS}" >/dev/null 2>&1; then echo "SECURITY ERROR: Detected suspected hardcoded secret in staged diff!" echo "Review your staged files before committing." exit 1 fi # 2. Run containerized Semgrep SAST if backend files are modified if echo "${STAGED_FILES}" | grep -E "^backend/" >/dev/null 2>&1; then echo "==> Backend changes detected. Running Semgrep SAST..." if command -v docker >/dev/null 2>&1; then docker run --rm -v "$(pwd):/src" returntocorp/semgrep semgrep --config=p/python --config=p/secrets --config=p/jwt --error /src/backend || { echo "SECURITY ERROR: Semgrep SAST scan failed! Fix security issues before committing." exit 1 } fi fi echo "OK: Pre-commit security audit passed cleanly." exit 0