@Mockoon/commons-server: Path traversal in templated `filePath` lets a request escape the served directory (prefix-only base check)
Beschreibung
## Zusammenfassung Eine 'FILE'-Antwort, deren 'filePath' Anfragedaten einbettet (z. B. '''/srv/public/{{queryParam 'name'}}'', der dokumentierte Weg, um den Client eine Datei auswählen zu lassen), ist durch 'getSafeFilePath' mit 'resolvedPath.startsWith(staticBaseDir)' beschränkt. Dieser Präfix-Test hat keine Pfad-Separator-Grenze, also einen "../"-escaped Pfad, dessen absolute Form das Basisverzeichnis durchläuft. Ein nicht authentifizierter Client liest Dateien von Geschwisterpfaden außerhalb des bedienten Verzeichnisses. ## Details `packages/commons-server/src/libs/server/server.ts`, `getSafeFilePath` (Zeile 2315). Die statische Basis ist der Text vor dem ersten `{{`, auf einen absoluten Pfad aufgelöst; die parsed `filePath` wird dann durch eine String-Präfix-Prüfung begrenzt: ```ts const staticBaseDir = staticBaseMatch? resolve(staticBaseMatch[1]) : null; // 2336 const parsedFilePath = TemplateParser({ ... request ...}); // request-controlled const resolvePath = resolvePath({ ... request ...}); if (isPathAbsolute) { if (!staticBaseDir || !resolvedPath.startsWith(staticBaseDir)) { // 2355 throw new Error(`Access to absolute path outside of the original static base directory (${resolvedPath})`; } ````with `'/srv/public/{{queryParam 'name'}}', `staticBaseDir = /srv/public`. Eine Anfrage `name=../public backup/.env` löst sich auf `/srv/public backup/.env` und `/srv/public backup/.env.startsWith("/srv/public")` ist `true` → served. Jedes Geschwisterchen, dessen absoluter Pfad mit dem String `/srv/public` beginnt, ist erreichbar; der relative Zweig (`:2362`) ist derselbe gegen `environmentDirectory`. Eine korrekte Prüfung fügt `sep` an die Basis an oder lehnt ab, wenn `relative(base,solvedPath)` mit `..` beginnt. `filePath` ist anforderungsgesteuert (`queryParam`/`urlParam`/header/body via `TemplateParser`) für jede `FILE`-Antwort: HTTP `sendFile` (`:1762`), WebSocket (`:1145`), Callbacks (`:1586`). PoC ``sh cat > /tmp/poc.sh public backup/.env echo 'Michael, michael@example.com, 555-22-7741' > public backup/customers.csv start -data env.json &1 mockoon-cli start -data env.json -port 3000 >/tmp/srv.json &1 & sleep 6 node -e 'const UA={headers:{"User-Agent":"Mozilla/5.0 (X11; Linux x86 64; rv:128.0) Gecko/20100101 Firefox/128.0"}; const g=async(q)=>{const r=await fetch("http://127.0.0.1:3000/download?name="+encodeURIComponent(q),}; return (await r.text()); (async()=>{consolent.log("*) intended file (public/index.tx
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Auf eine behobene Version aktualisieren: 9.7.0.
Empfohlene Schritte
- Betroffene Systeme identifizieren: @mockoon/commons-server, @mockoon/cli.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Update/Rollout auf behobene Version vorbereiten und priorisiert einspielen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.