Previeni l'esposizione di segreti e sourcemap nei bundle frontend

One-time pack self-hosted: policy→config + PR Gate + report firmato

Per chi è

  • Team che buildano applicazioni Next.js, Vite, o altri bundler moderni
  • Progetti che pubblicano sourcemap in produzione (volontariamente o per errore)
  • Team che usano variabili d'ambiente NEXT_PUBLIC_* e vogliono garantire che solo quelle autorizzate siano esposte
  • Organizzazioni che richiedono evidenze firmate per audit di sicurezza

Cosa previene

  1. Segreti nei bundle pubblici: API keys, token, credenziali hardcoded o esposte tramite env var che finiscono nei file JavaScript pubblici.
  2. Sourcemap pubbliche: File .map accessibili pubblicamente che rivelano codice sorgente, commenti, e potenziali segreti.
  3. NEXT_PUBLIC non autorizzati: Variabili d'ambiente server-only esposte accidentalmente al client tramite NEXT_PUBLIC_*.

Cosa include

  • Scanner deterministico — Regex + euristiche per trovare segreti nei bundle built (JS/CSS) e sourcemap
  • Sourcemap guard — Regole/config per Vercel/Netlify/Cloudflare + Next/Vite per non pubblicare *.map (o restringere)
  • NEXT_PUBLIC lint — Rileva env var server-only esposte al client tramite diff con allowlist
  • GitHub Action PR Gate — Blocca PR se trova segreti, sourcemap pubbliche non permesse, o NEXT_PUBLIC non in allowlist
  • Report HTML firmato — SHA-256 + PR template con evidenze

Compatibilità

Integrazioni:

🔧 GitHub Actions
Vercel
Netlify
☁️ Cloudflare
📦 Node

Bundler: Next.js, Vite, Webpack, esbuild, Rollup
Piattaforme: Vercel, Netlify, Cloudflare Pages
CI/CD: GitHub Actions (altre in verifica)

Installazione in 10 minuti

bash
# 1. Installa il pack
npm install --save-dev @merlonsec/leaklock

# 2. Crea policy.yml nella root del progetto
cat > policy.yml << EOF
leaklock:
  sourcemap:
    allow_public: false
    platforms:
      - vercel
      - netlify
  secrets:
    patterns:
      - type: api_key
        regex: '(?i)(api[_-]?key|apikey)\s*[:=]\s*["']?([a-z0-9]{32,})["']?'
      - type: token
        regex: '(?i)(token|bearer)\s*[:=]\s*["']?([a-z0-9]{40,})["']?'
  next_public:
    allowlist:
      - NEXT_PUBLIC_APP_URL
      - NEXT_PUBLIC_ANALYTICS_ID
EOF

# 3. Aggiungi GitHub Action
mkdir -p .github/workflows
cat > .github/workflows/leaklock.yml << EOF
name: LeakLock Check
on: [pull_request]
jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: merlonsec/leaklock-action@v1
        with:
          policy: ./policy.yml
EOF

Security model / Non-obiettivi

Scope: LeakLock verifica solo i bundle built e sourcemap. Non scannerizza il codice sorgente prima del build (usa GitGuardian o TruffleHog per quello).

Non è:

  • Un scanner di codice sorgente completo (solo bundle + sourcemap)
  • Un servizio hosted (tutto locale, nessun dato inviato)
  • Un WAF o protezione runtime (solo prevenzione in CI/CD)
  • Una garanzia al 100% (pattern regex possono avere falsi positivi/negativi)

È:

  • Deterministico: stessi input = stessi risultati
  • Verificabile: report firmati SHA-256
  • Trasparente: policy YAML leggibile, nessuna black box

Esempio

Vedi un esempio completo con PR gate fallita e report HTML.

Oppure scarica un report di esempio.