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.

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:
- Vorzeitiges Überschreiben des Arrays: Vite wendet seine Standard-Ausschlussliste nur an, wenn
server.fs.denyvollständigundefinedist. Als Vitest ein Array mit lediglich['.vitest-secret-token']zuwies, wurden Vites Standardregeln verworfen anstatt zusammengeführt. - 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/browser2. 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)

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:
- Generieren Sie 256-Bit-API-Schlüssel, Hex-Tokens und RFC-4648-konforme Base32-Secrets mit dem DevOmniTools Token Generator.
- Prüfen Sie Claims, Zielgruppe und Ablaufzeitstempel rotierter Tokens mit dem DevOmniTools Offline JWT-Decoder.
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.