Mass assignment via id in newAttributes during bulk duplicate overwrites existing elements
Beschreibung
## Zusammenfassung Es gibt einen Masse-Zuweisungsfehler in der Mass-Duplicate-Element-Aktion. Alice, die nur die Berechtigung hat, einen Eintrag, den sie besitzt, zu duplizieren, übermittelt eine willkürliche "id" über den Anforderungsparameter "newAttributes". Die Duplizierungsroutine überschreibt ihren eigenen "id = null"-Reset mit diesem Wert und schreibt Alices Attribute in Bobs bestehende Eintragszeile. ## Details `ElementsController::beforeAction()` (`src/controllers/ElementsController.php:119-124`) zieht den Anfragekörper in `$this-> attributes` und lehnt Anfragen ab, die eine `id`- oder `canonicalId`-Taste auf der obersten Ebene versenden: ``php $this-> attributes = $this->request->getBodyParams(); // Kein lustiges Geschäft, wenn (isset($this-> attributes['id']) || isset($this-> attributes['canonicalId']) {neue BadRequestHttpException('Changing an element's ID is not allowed.'); } ``` Der Check überprüft nur die oberste Nutzlast. `actionBulkDuplicate()` (`src/controllers/ElementsController.php:1708-1749`) liest ein separates `newAttributes`-Array und übergibt es direkt an die Serviceschicht: ``php $elementInfo = $this->request->getRequiredBodyParam('elements'); $newAttributes = $this->request->getRequiredBodyParam('elements'); $safeNewAttributes = Collection::make($newAttributes) ->only($element->safeAttributes()) ->all(); ... $newElement = $elementsService->duplicateElement(), false, checkAuthorization: true, ; ```Elements::duplicateElement()` (`src/services/Elements.php:1814-1840') klont das Source-Element, setzt `id` auf null und übergibt dann das ArrayChip-Array überschreibt die zurückgesetzte `id` mit einem beliebigen numerischen Wert innerhalb `$newAttributes`. Yiis `saveElement()` führt dann ein UPDATE gegen die Zeile mit diesem Primärschlüssel anstelle eines INSERTs aus. Alices titel, slug, authorid, postdate und uid landen auf bobs eintrag. `safeAttributes()` auf `Entry` enthält `id`, weil das Basiselementmodell es freilegt, so dass der `Collection::only()` Filter es nicht entfernt. Auswirkungen Ein Autor mit geringem Privileg überschreibt jedes andere Element (Einträge, Kategorien, Benutzer, die sich die Vererbung der Entry-Elementtabelle teilen), indem er Element-IDs vorhersagt oder aufzählt. Content-Integrität auf der gesamten Installation bricht. Der Angriff erfordert nur die Fähigkeit, einen Eintrag zu duplizieren, den Alice bereits besitzt. ## Referenzen https://github.com/craftcms/cms/commit/8f6587c25050bbb6e080d59c71f6bb8932fc8600
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: 5.9.21.
Empfohlene Schritte
- Betroffene Systeme identifizieren: Pixel & Tonic Craft CMS.
- 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.
- Administrative Zugänge besonders absichern: MFA, Passwortrotation, Session-Invalidierung.