Risk: High 8.5 High CWE-798: Use of Hard-coded Credentials

Frontend API Key Exposure: Securing Private Keys in Client Bundles

With the rise of rapid vibe coding and AI builders (such as Lovable, Bolt.new, Cursor, and v0), developers frequently make external API calls (e.g., OpenAI, Stripe, Anthropic, Telegram Bot API) directly from client-side React or Vue components.

Any secret environment variable bundled by frontend build tools (Vite, Webpack, Next.js client components) into client-side JavaScript becomes fully visible to anyone inspecting network traffic or application source code.

Vulnerability Risk & Threat Impact

Exposing secret OpenAI keys (sk-...) or Supabase administrative service roles (service_role) in client code allows unauthorized actors to deplete billing quotas, bypass row-level security, or delete database tables.

Attack Vector: Automated botnets continuously harvest public endpoints matching this signature. Once discovered, exploitation is triggered automatically without human review.

How Our Scanner Inspects for This Flaw

Site Check passively inspects public script bundles using regex signatures targeting known credential patterns (OpenAI, Anthropic, Stripe secret keys, AWS access keys, and Supabase service roles).

During configuration and secret scanning, the Site Check engine executes lightweight, non-destructive HEAD and GET probes evaluating status code responses (404/403 vs 200). Diagnostic queries adhere to safety bounds without caching payload contents to external storage, ensuring full confidentiality.

Remediation Guide (Step-by-Step Fix)

To resolve this vulnerability, apply the following configuration or code snippet to your web server:

Offloading private API calls to a secure backend endpoint
      // INSECURE: Exposing private keys in client code
// const res = await fetch('https://api.openai.com/v1/...', { headers: { Authorization: `Bearer ${NEXT_PUBLIC_OPENAI_KEY}` } });

// SECURE: Proxy request through a backend server endpoint / Route Handler
const res = await fetch('/api/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) });
    
  • Remove private secret tokens from client-side code and environment variables with public prefixes (e.g., NEXT_PUBLIC_, VITE_).
  • Implement dedicated backend route handlers or serverless Edge Functions to proxy authenticated requests.
  • Immediately revoke and reissue compromised API keys in the respective service provider consoles.

Attack Anatomy & Real-World Business Impact

Vibe-coders frequently instruct AI assistants to integrate third-party services like OpenAI or Resend directly within client components. Consequently, private tokens become bundled into public main.*.js chunks, where scraper bots harvest sk-[a-zA-Z0-9]{48} patterns and deplete billing quotas.

Financial & Legal Liability Risks: Exhaustion of OpenAI, Stripe, or Resend developer balances within minutes, vendor account suspension, and unexpected recurring invoice spikes resulting from API key hijacking.

Compliance Framework Impact: Non-compliance with PCI-DSS Req 6.5.6 (key management) and OWASP API Security Top 10 (API2:2023 Broken Authentication).

Defense-in-Depth Engineering Matrix

Defense Layer Technical Action Tool / Enforcement
Frontend Architecture Offload all privileged API communications to secure server endpoints or edge micro-workers Backend Proxy Gateway
Secret Scoping Standards Strictly isolate public client identifiers (pk_...) from high-privilege backend tokens (sk_...) Provider Token Dashboard
Build-time Bundler Enforcement Reject bundling of any environment variable omitting explicit client prefixes (e.g. PUBLIC_*) Vite / Esbuild Define Guard

CLI Remediation Verification: Terminal Commands

After applying configuration changes or patching source code, verify that the exposure is neutralized using command-line diagnostic tools:

Bash / cURL: Diagnostic Endpoint Verification
curl -s https://your-domain.com/ | grep -oE "(sk-[a-zA-Z0-9]{20,}|AIza[0-9A-Za-z-_]{35})"
# Output must be empty
    

DevSecOps Best Practices & CI/CD Hardening

Confine all authenticated API requests to server-side Edge Functions, server actions, or backend microservices. Never prefix sensitive API keys with NEXT_PUBLIC_ or VITE_.

Frequently Asked Remediation Questions

Why is embedding an OpenAI secret in React or Vue components dangerous?
All client-side JavaScript is fully decoded in user web browsers. Anyone inspecting the Network inspector tab can effortlessly intercept Authorization header credentials.
How should frontend apps securely interface with generative AI models?
Forward prompts through a dedicated backend API route (/api/generate) that authenticates user session tokens before dispatching requests via secure server-side credentials.
Application Security Lead Auditor Assessment

Exposed configuration files and credentials present the highest risk of automated cloud takeover. We advise implementing pre-commit git hooks (GitLeaks, TruffleHog), migrating environment configurations into encrypted secret managers (HashiCorp Vault, Doppler, AWS Secrets Manager), and configuring web servers to explicitly deny access to hidden dot-files.

To permanently close the «Frontend API Key Exposure: Securing Private Keys in Client Bundles» threat vector, integrate verification gates into your CI/CD pipeline and maintain automated perimeter checks with Site Check.