Alle Anleitungen

DEVOMNITOOLS / Anleitungen für Entwickler

Überprüfung des Secret-Leaks im Vitest-Entwicklungsserver (CVE-2026-112948)

Analyse von CVE-2026-112948 in Vitest 5. Erfahren Sie, warum server.fs.deny .env-Dateien nicht geschützt hat und wie Tokens mit CSPRNG rotiert werden.

DevOmniTools Research Veröffentlicht: Aktualisiert: 3 Min. Lesezeit
Vitest Dev-Server server.fs.deny Bypass-Architekturdiagramm mit unverschlüsselten HTTP-Anfragen zur Offenlegung von .env und API-Schlüsseln

Das Wichtigste

  • CVE-2026-112948 in Vitest 5 Dev-Servern überschrieb Vites standardmäßige server.fs.deny-Regeln und legte .env-Dateien sowie private Schlüssel über reines HTTP offen.
  • Jeder Prozess oder lokale Netzwerkclient mit Zugriff auf den Vite UI/API-Port konnte interne Zugangsdaten und Tokens auslesen.
  • Alle Zugangsdaten in .env-Dateien während aktiver Vitest UI-Sitzungen sollten unverzüglich widerrufen und mit sicherem Offline-CSPRNG rotiert werden.

Zusammenfassung & Kontext der Sicherheitslücke

Am 21. Oktober 2026 veröffentlichte die GitHub Advisory Database CVE-2026-112948 (GHSA-p458-7748-mcp3), die eine kritische Fehlkonfiguration beim Dateizugriff in Vitest 5 Entwicklungsservern aufdeckt.

Unter spezifischen Entwicklerkonfigurationen – insbesondere bei Verwendung der interaktiven Benutzeroberfläche (vitest --ui), des Browser-Modus (@vitest/browser) oder bei Aktivierung des Remote-Flags api – wendete der zugrundeliegende HTTP-Server von Vitest Vites standardmäßige server.fs.deny-Regeln nicht an.

Das Ergebnis: Sensible Projektressourcen, die Vite normalerweise standardmäßig schützt (darunter .env, .env.local, .npmrc, private SSL-Zertifikate, .git-Metadaten und die interne Vitest-Authentifizierungsdatei .vitest-secret-token), konnten unverschlüsselt über einfaches HTTP von jedem erreichbaren Netzwerkclient oder über bösartige Browser-Tabs via Cross-Origin-Anfragen abgerufen werden.

Vitest Dev-Server server.fs.deny Bypass-Architekturdiagramm mit unverschlüsselten HTTP-Anfragen zur Offenlegung von .env und API-Schlüsseln (CVE-2026-112948)

Technische Ursache: Warum server.fs.deny überschrieben wurde

In einer Standard-Vite-Konfiguration schützt server.fs.deny sensible Pfade durch integrierte Globs:

// Standardmäßige Deny-Muster von Vite:
['.env', '.env.*', '*.{crt,pem}', '**/.git/**', '**/.npmrc']

Als Vitest 5 seinen internen API-Server und die UI-Token-Authentifizierung (.vitest-secret-token) einführte, fügte es die Token-Datei programmatisch zur Ausschlussliste hinzu. Zwei Laufzeitverhalten von Vite führten jedoch zu einer stillen Umgehung:

  1. Vorzeitiges Überschreiben des Arrays: Vite wendet seine Standard-Ausschlussliste nur an, wenn server.fs.deny vollständig undefined ist. Als Vitest ein Array mit lediglich ['.vitest-secret-token'] zuwies, wurden Vites Standardregeln verworfen anstatt zusammengeführt.
  2. Matcher-Vorkompilierung: Vite kompiliert die deny-Liste während der Konfigurationsinitialisierung in einen internen regulären Ausdruck. Spätere dynamische Änderungen zur Laufzeit hatten keine Auswirkung auf die aktive HTTP-Dateiauslieferung.

Wenn Sie vitest --ui in einem gemeinsam genutzten lokalen Netzwerk ausgeführt oder Anwendungen in Browsern mit mehreren offenen Tabs getestet haben, konnte jedes Skript mit Zugriff auf localhost:51204 Ihre privaten Zugangsdaten auslesen.


Ablauf zur Behebung und Token-Rotation

1. Vitest-Abhängigkeiten aktualisieren

Die Maintainer von Vitest haben gepatchte Versionen veröffentlicht, die das Problem beheben. Aktualisieren Sie Ihre Projektabhängigkeiten umgehend:

npm install -D vitest@latest @vitest/ui@latest @vitest/browser@latest
# oder mit pnpm:
pnpm update vitest @vitest/ui @vitest/browser

2. Offengelegte Zugangsdaten widerrufen und neu erstellen

Betrachten Sie alle in .env-Dateien hinterlegten Secrets als kompromittiert, falls Vitest UI in Netzwerken aktiv war:

  • Zugriffstokens für Cloud-Anbieter (AWS, GCP, Cloudflare)
  • Datenbank-Anmeldedaten (Postgres, Redis, MongoDB-Verbindungszeichenfolgen)
  • OAuth 2.0 Client-Secrets und JWT-Signaturschlüssel
  • API-Schlüssel von Drittanbietern (Stripe, Resend, GitHub PATs)
Kryptografischer Token-Rotations-Workflow: Widerruf kompromittierter .env-Anmeldedaten und Generierung von 256-Bit-CSPRNG-Schlüsseln und Base32-Secrets offline

3. Hochwertige kryptografische Secrets im Client generieren

Verwenden Sie beim Erstellen neuer Zugangsdaten keine Online-Generatoren, die Eingaben in Server-Logs speichern. Nutzen Sie die browsernative Web Crypto API (crypto.getRandomValues), um kryptografisch sichere Pseudozufallszahlen (CSPRNG) zu generieren:

function generateSecureToken(byteLength = 32): string {
  const bytes = new Uint8Array(byteLength);
  crypto.getRandomValues(bytes);
  return Array.from(bytes)
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

Für eine sofortige Rotation ohne eigenen Code:


Zusätzliche defensive Absicherung

Erweitern Sie vitest.config.ts oder vite.config.ts um strikte Einstellungen mit expliziten Ausschlussmustern:

import { defineConfig } from 'vitest/config';

export default defineConfig({
  server: {
    fs: {
      strict: true,
      deny: [
        '**/.env*',
        '**/*.pem',
        '**/*.key',
        '**/.git/**',
        '**/.npmrc',
        '**/.vitest-secret-token'
      ]
    }
  }
});

FAQ

Was ist die Hauptursache für CVE-2026-112948 in Vitest 5?

Vitest fügte seine interne Token-Datei als explizites Array zu server.fs.deny hinzu. Dadurch verwarf Vite seine Standard-Deny-Muster anstatt sie zusammenzuführen, was unauthentifizierte HTTP-Lesezugriffe auf .env und private Schlüssel ermöglichte.

Sind Testläufe über die Befehlszeile von dieser Schwachstelle betroffen?

Nein. Headless-Testläufe (vitest run) starten keinen HTTP-Listener. Die Schwachstelle betrifft nur Testläufe mit --ui, @vitest/browser oder aktivierter api: true Option.

Wie sollten kompromittierte .env-Tokens sicher rotiert werden?

Widerrufen Sie exponierte Cloud- und Datenbank-Schlüssel unverzüglich in den Provider-Dashboards und generieren Sie neue kryptografisch sichere 256-Bit-Tokens (CSPRNG) mit clientseitigen Tools ohne Übertragung über das Netzwerk.