ApostropheCMS: Lesen beliebiger Dateien über den Attachment-Namen im import-export-Modul

Ein Konto mit Contributor-Rolle importiert ein praepariertes Archiv, dessen Attachment-Metadaten eine Traversal-Sequenz tragen, und liest so Host-Dateien mit erlaubter Endung, die anschließend unter einer nicht authentifizierten /uploads-URL ausgeliefert werden.

Advisory-ID: TP-2026-043
Produkt: ApostropheCMS (Node.js-Content-Management-System; die Schwachstelle liegt im offiziellen Modul @apostrophecms/import-export)
Schwachstellentyp: Path Traversal zum Lesen beliebiger Dateien (CWE-22)
CVE: CVE-2026-63667
CVSS 3.1: 6.5 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Hersteller-Advisory: GHSA-79qf-vqgc-7xx3
Betroffene Versionen: @apostrophecms/import-export <= 3.6.1
Behoben in: @apostrophecms/import-export 3.6.2
Gemeldet: 13. Juni 2026

Zusammenfassung

ApostropheCMS ist ein Node.js-Content-Management-System; das offizielle Modul @apostrophecms/import-export importiert und exportiert Inhalte als Archive. Beim gzip-Import baut das Modul den Quellpfad jedes Attachments auf der Festplatte aus Feldern zusammen, die aus der unvertrauten aposAttachments.json im hochgeladenen Archiv stammen, ohne diese Felder auf Traversal zu prüfen. Der einzige ../-Schutz des Moduls validiert nur die Namen der Tar-Einträge während des Entpackens und lässt die JSON-Felder unberührt, sodass eine Traversal-Sequenz im name den Pfad aus dem Entpackverzeichnis herausführt. Die gelesene Datei wird in das öffentliche Uploads-Verzeichnis kopiert und dort ohne Authentifizierung unter einer /uploads/attachments/...-URL ausgeliefert. Ein Konto mit Contributor-Rolle liest so Dateien anderer Nutzer und Host-Dateien mit erlaubter Endung, wobei eine Endungs-Allowlist den Zugriff auf Dateien wie .env oder /etc/passwd verhindert. turingpoint hat die Kette Ende-zu-Ende live verifiziert und an den Hersteller gemeldet, der sie in @apostrophecms/import-export 3.6.2 behoben hat.

Ursache

Der gzip-Import setzt den Quellpfad jedes Attachments aus den Feldern _id, name und extension der hochgeladenen aposAttachments.json über path.join zusammen (lib/formats/gzip.js:46). Der einzige ../-Schutz des Moduls prüft mit name.includes('../') nur die Namen der Tar-Einträge während des Entpackens (lib/formats/gzip.js:143) und betrachtet diese JSON-Felder name/extension nie, sodass ein name von ../../../../../../tmp/secret das Entpackverzeichnis verlässt. Der Pfad fließt über insertAttachments (lib/methods/import.js:832) und attachment.insert (:1074) in uploadfs.copyIn in das von express.static ausgelieferte öffentliche Uploads-Verzeichnis und veröffentlicht die gelesene Datei unter einer anonymen /uploads/attachments/...-URL. Der Zugriff setzt eine authentifizierte Sitzung (lib/methods/import.js:71), view auf den Zieltyp (methods/index.js:54) und die Berechtigung upload-attachment (@apostrophecms/attachment/index.js:442) voraus, die die eingebaute Contributor-Rolle besitzt, während Gast und anonym mit 403 abgewiesen werden. Die Endungs-Allowlist wirft vor dem Lesen (@apostrophecms/attachment/index.js:411, getFileGroup), sodass nur Dateien erreichbar sind, deren echter Name auf eine erlaubte Endung wie gif/jpg/png/svg/txt/pdf/csv endet, nicht aber .env oder /etc/passwd.

Proof of Concept

# Ein Konto mit Contributor-Rolle importiert ein praepariertes tar.gz.
# In der enthaltenen aposAttachments.json:
{ "_id": "evilatt0001",
  "name": "../../../../../../tmp/apos_victim_secret",
  "extension": "txt" }

# Anschliessend anonym abrufbar:
GET /uploads/attachments/evilatt0001-apos_victim_secret.txt

path.join fasst die Sequenz ../ zusammen, sodass die Host-Datei /tmp/apos_victim_secret.txt in das öffentliche Uploads-Verzeichnis kopiert und ohne Authentifizierung ausgeliefert wird. turingpoint hat dies live auf Apostrophe 4.31.0 mit @apostrophecms/import-export 3.6.1 bestätigt: Der Contributor-Import veröffentlichte hinterlegte DB_PASSWORD/API_KEY-Werte bei HTTP 200, der Gast-Import wurde mit forbidden abgewiesen, und eine Kontroll-Endung env wurde durch die Allowlist bereits vor dem Lesen blockiert.

Auswirkung

  • Lesen von Host-Dateien, deren Name auf eine erlaubte Endung endet (etwa .txt, .csv, .pdf), sowie von Dokumenten anderer Nutzer.
  • Veröffentlichung der gelesenen Datei unter einer nicht authentifizierten /uploads/attachments/...-URL.
  • Erreichbar durch ein Konto mit Contributor-Rolle; anonymer Zugriff wird abgewiesen.
  • Kein Lesen des gesamten Dateisystems und keine Codeausführung: Die Endungs-Allowlist blockiert .env, .pem, .json und ausführbare Dateien vor dem Lesen.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.