Hoch

ApostropheCMS: Nicht authentifizierte Ressourcenerschöpfung über pre-auth aposBigUpload-Verarbeitung in @apostrophecms/import-export

  • Veröffentlicht: 21.10.2026
  • Aktualisiert: 21.10.2026 16:18

Zusammenfassung

Eine potenzielle Denial-of-Service-Schwachstelle durch nicht authentifizierte Anfragen besteht im Upload-Pfad für gestückelte Importe (Chunked Uploads), der von @apostrophecms/import-export genutzt wird.

Die betroffenen Import-API-Routen rufen:

self.apos.http.bigUploadMiddleware()

auf, bevor die eigentliche Import-Behandlungsroutine ihre Authentifizierungsprüfung vornimmt.

Da an bigUploadMiddleware() kein authorize-Callback übergeben wird, können nicht authentifizierte Anfragen die Operationen aposBigUpload start, chunk und end erreichen, bevor die nachgelagerte req.user-Prüfung den Import ablehnt.

Infolgedessen kann ein nicht authentifizierter entfernter Angreifer serverseitigen Upload-Status erzeugen, Chunk-Daten in den Upload-Speicher schreiben, die Verarbeitung temporärer Dateien anstoßen und vom Angreifer gesteuerte Bereinigungsoperationen auslösen, noch bevor die Authentifizierung erzwungen wird.

Betroffene Komponente

Paket:

@apostrophecms/import-export

Bestätigte betroffene Version:

3.6.2

Potenziell frühere betroffene Versionen:

Das Problem kann frühere 3.x-Versionen betreffen, in denen die aktuelle auf Big-Upload basierende Import-Implementierung vorhanden ist. Die genaue Einführungsversion wurde noch nicht vollständig verifiziert; es wird empfohlen, dass die Maintainer den betroffenen Versionsbereich bestätigen.

Schwachstellentyp

Primär:

CWE-400 — Unkontrollierter Ressourcenverbrauch

Verwandt:

CWE-306 — Fehlende Authentifizierung für kritische Funktion

CWE-770 — Ressourcenzuweisung ohne Limits oder Throttling

Technische Details

Die Route für den Seitenimport registriert die folgende Middleware-Kette:

packages/import-export/modules/@apostrophecms/import-export-page/index.js

js
importExportImport: [
  self.apos.http.bigUploadMiddleware(),
  async (req) => {
    return self.apos.modules['@apostrophecms/import-export']
      .import(req, self.__meta.name);
  }
]

Es wird kein authorize-Callback an bigUploadMiddleware() übergeben.

Die Implementierung von bigUploadMiddleware() unterstützt explizit einen authorize-Callback und führt diese Autorisierung vor der Verarbeitung des aposBigUpload-Protokolls durch, sofern bereitgestellt.

Ohne diesen Callback werden Anfragen, die Folgendes enthalten:

aposBigUpload[type]=start

aposBigUpload[type]=chunk

oder

aposBigUpload[type]=end

sofort verarbeitet.

Die eigentliche Authentifizierungsprüfung erfolgt erst später in:

packages/import-export/lib/methods/import.js

js
async import(req, moduleName) {
  if (!req.user) {
    throw self.apos.error('forbidden');
  }

Dies bedeutet, dass die Authentifizierung erst stattfindet, nachdem die Middleware für Chunked-Uploads bereits serverseitige Arbeiten ausgeführt hat.

Angriffsablauf

1. Start

Ein nicht authentifizierter Angreifer sendet eine aposBigUpload[type]=start-Anfrage.

Der Server generiert eine Upload-ID und speichert die vom Angreifer bereitgestellten Upload-Metadaten, einschließlich des deklarierten chunks-Zählers.

2. Chunk

Der Angreifer kann Chunk-Daten hochladen.

bigUploadChunk() kopiert vom Angreifer kontrollierte Daten nach:

/big-uploads/<id>-<n>-<chunk>

3. Ende

Der Angreifer sendet eine aposBigUpload[type]=end-Anfrage.

bigUploadEnd() beginnt mit der Verarbeitung des Uploads und erstellt temporäre Dateien, bevor der nachgelagerte Import-Handler aufgerufen wird.

Erst nach Abschluss dieser Verarbeitung erreicht die Ausführung die spätere Authentifizierungsprüfung in import().

4. Bereinigungsverstärkung (Cleanup Amplification)

Der vom Angreifer kontrollierte Wert chunks wird auch von bigUploadCleanupOne() verwendet:

js
for (const { chunks } of Object.values(bigUpload.files)) {
  for (let i = 0; (i < chunks); i++) {
    await ufs.remove(...);
  }
}

Bei der Upload-Initialisierung scheint keine niedrige Obergrenze für die deklarierte Anzahl an Chunks erzwungen zu werden.

Dadurch kann ein nicht authentifizierter Angreifer die Anzahl der Dateisystem-Bereinigungsoperationen erhöhen, die für einen Upload durchgeführt werden.

Proof of Concept

Die folgende Reproduktion wurde ausschließlich in einer isolierten Testumgebung durchgeführt.

Upload ohne Authentifizierung starten

bash
curl -s -X POST \
  'http://localhost:3000/api/v1/@apostrophecms/page/importExportImport?aposBigUpload[type]=start' \
  -H 'Content-Type: application/json' \
  --data '{"files":{"file":{"name":"evil.tar.gz","size":4,"type":"application/gzip","chunks":1}}}'

Der Server gibt eine Upload-ID zurück, obwohl die Anfrage keine authentifizierte Sitzung besitzt.

Einen Chunk hochladen

bash
printf 'PWN!' >/tmp/chunk.bin

curl -s -X POST \
  'http://localhost:3000/api/v1/@apostrophecms/page/importExportImport?aposBigUpload[type]=chunk&aposBigUpload[id]=<ID>&aposBigUpload[n]=0&aposBigUpload[chunk]=0' \
  -F 'chunk=@/tmp/chunk.bin;type=application/octet-stream'

Die Anfrage ist erfolgreich und führt dazu, dass serverseitiger Upload-Speicher belegt wird.

Den Upload abschließen

bash
curl -i -X POST \
  'http://localhost:3000/api/v1/@apostrophecms/page/importExportImport?aposBigUpload[type]=end&aposBigUpload[id]=<ID>'

Beobachtetes Verhalten:

  • start liefert HTTP 200 und eine Upload-ID ohne Authentifizierung zurück.
  • chunk liefert HTTP 200 zurück und führt zur serverseitigen Speicherung des Chunks.
  • end erreicht schließlich die nachgelagerte Authentifizierungsprüfung und wird abgewiesen.
  • Die serverseitige Big-Upload-Verarbeitung fand jedoch bereits vor dieser Zurückweisung statt.

In der isolierten Testumgebung:

  • chunks=1 führte zu einem Bereinigungsversuch.
  • chunks=50 führte zu 50 Bereinigungsversuchen.

Dies zeigt, dass die vom Angreifer kontrollierte Chunk-Anzahl den Umfang der serverseitigen Bereinigungsarbeiten direkt beeinflusst.

Sicherheitsauswirkungen

Die Schwachstelle ermöglicht es einem nicht authentifizierten Remote-Angreifer, serverseitige Speicher- und Dateisystemoperationen zu veranlassen, die nur für autorisierte Import-Benutzer zugänglich sein sollten.

Mögliche Folgen sind:

  • Verbrauch von Upload- und temporärem Speicherplatz.
  • Erzeugung von serverseitigem Upload-Status durch nicht authentifizierte Benutzer.
  • Wiederholte Dateisystem-I/O.
  • Bereinigungsverstärkung basierend auf angreifergesteuerten Chunk-Zahlen.
  • Potenzielle Dienstbeeinträchtigung oder Denial-of-Service bei wiederholtem oder ausreichend verstärktem Angriff.

Ursache

Die Authentifizierung wird erst im nachgelagerten Import-Handler erzwungen und nicht vor der Chunked-Upload-Middleware.

Die Middleware selbst unterstützt bereits einen authorize-Callback, der speziell dafür vorgesehen ist, die unautorisierte Nutzung der Big-Upload-Funktionalität zu verhindern.

Empfohlene Behebung

Authentifizierung vor der Verarbeitung jeder aposBigUpload-Operation vorschreiben.

Beispielsweise:

  • Einen geeigneten authorize-Callback an bigUploadMiddleware() auf allen Import-Routen übergeben.
  • Nicht authentifizierte Benutzer vor start, chunk oder end abweisen.
  • Angemessene Obergrenzen für deklarierte Chunk-Zahlen durchsetzen.
  • Deklarierte Größen gegen die tatsächlich hochgeladenen Daten validieren.
  • Speicher- und Ratenbegrenzungen pro Benutzer sowie global einführen.
  • Sicherstellen, dass temporäre Dateien entfernt werden, wenn die nachgelagerte Verarbeitung fehlschlägt.
  • Regressionstests hinzufügen, die bestätigen, dass anonyme Anfragen für start, chunk und end abgewiesen werden, bevor Upload-Status oder Dateien angelegt werden.

Relevanter geprüfter Commit:

d3ff8c9bb001be1acf7fdc3f035190250ac64b45

Danksagung an Forscher

Kai Zhi

GitHub:

https://github.com/kaizhi888

Was zu tun ist

Aktualisieren Sie apostrophe auf Version 4.33.0 oder höher und @apostrophecms/import-export auf Version 3.7.0 oder höher.

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
npm-Paket apostrophe < 4.33.0 4.33.0
npm-Paket @apostrophecms/import-export < 3.7.0 3.7.0

Verweise

CVSS-Wert 7.5/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Schwäche (CWE)
CWE-400, CWE-770
Plattform
npm
Paket
apostrophe, @apostrophecms/import-export
Veröffentlicht
21.10.2026
Aktualisiert
21.10.2026 16:18

Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.

OSV / GitHub Advisory Database - GHSA-86wm-68pq-5jwq - CC BY 4.0

Schwachstellenhistorie: apostrophe

Alle veröffentlichten Schwachstellen dieses Pakets (npm-Paket), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Alle (33) im Archiv
Einträge insgesamt
33
Erste → letzte
09.2020 10.2026
Ohne Fix
4
In Angriffen ausgenutzt
0

Verteilung nach Schweregrad

  • Kritisch 2
  • Hoch 9
  • Mittel 18
  • Niedrig 4

Veröffentlichungen pro Jahr

  1. 2020: 2
  2. 2021: 2
  3. 2022: 0
  4. 2023: 0
  5. 2024: 0
  6. 2025: 0
  7. 2026: 29
Schweregrad:
  1. ApostropheCMS: Nicht authentifizierte Ressourcenerschöpfung über pre-auth aposBigUpload-Verarbeitung in @apostrophecms/import-export dieser Eintrag
    Hoch · 7.5 CVE-2026-113711 < 4.33.0 4.33.0
  2. Hoch · 7.3 CVE-2026-45011 = 4.29.0 keine Korrektur
  3. Kritisch · 9.8 CVE-2021-25979 >= 2.63.0, < 3.4.0 3.4.0

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.