Bußgeld-Kopfzeile

Die Phantom-Klasse: Bewaffnung mit CVE-2025-32432 (Yii2 Container Injection) in Craft CMS

In der Hierarchie der modernen Web-Schwachstellen, Dependency Injection (DI) Container Injection befindet sich an der Spitze der Nahrungskette. Sie ist schwieriger zu entdecken als SQL Injection, eleganter als Memory Corruption und hat verheerende Auswirkungen.

Die jüngste Offenlegung von CVE-2025-32432 Ziel: Craft CMS-und im weiteren Sinne auch die zugrunde liegenden Yii2-Framework-dient als brutale Erinnerung: Wenn Benutzereingaben die Instanziierung von Klassen steuern, gehört die Anwendung dem Angreifer. Während viele automatische Scanner dieses Problem zunächst als "Massenzuweisung" oder "Konfigurationsproblem" mit geringem Schweregrad einstuften, erkennen Elite-Sicherheitsingenieure es als das, was es wirklich ist: Entfernte Code-Ausführung (RCE) über eine unsichere Logik zur Deserialisierung von Objekten.

In diesem Artikel wird eine technische Autopsie der Sicherheitslücke durchgeführt. Wir gehen über das Hersteller-Advisory hinaus und rekonstruieren die Gadget-Kette, analysieren die zugrundeliegenden magischen PHP-Methoden und zeigen, warum eine KI-gesteuerte semantische Analyse der einzige gangbare Weg ist, um diese Logikfehler in großem Umfang zu erkennen.

Die Phantom-Klasse: Bewaffnung mit CVE-2025-32432 (Yii2 Container Injection) in Craft CMS

Die Architektur des Scheiterns: Das Innere des Yii2 Service Locator

Um CVE-2025-32432 zu verstehen, müssen Sie zunächst den architektonischen Kern des Yii2-Frameworks verstehen: yii\\di\Container.

Craft CMS stützt sich stark auf das Service Locator-Muster und den Dependency Injection-Container von Yii2, um Klassenabhängigkeiten zu verwalten. Um die Entwicklung flexibel zu gestalten, erlaubt der Container den Entwicklern die Konfiguration von Objekten mit Konfigurations-Arrays. Diese Funktion ist die Hauptursache für die Sicherheitslücke.

Die "CreateObject"-Senke

Die kritische Senke in dieser Schwachstellenklasse ist Yii::createObject(). Diese Methode akzeptiert ein Konfigurationsarray, in dem die Klasse Schlüssel gibt an, welche PHP-Klasse instanziert werden soll, und die nachfolgenden Schlüssel definieren die öffentlichen Eigenschaften dieser Instanz.

PHP

// Legitime Verwendung im Craft CMS Backend Code $object = Yii::createObject([ 'class' => 'app\\models', 'username' => 'admin', 'role' => 'superuser' ]);

Die Schwachstelle (CVE-2025-32432) entsteht, weil bestimmte Controller-Aktionen in Craft CMS (oft im Zusammenhang mit der Speicherung von Plugin-Konfigurationen oder der Bearbeitung von Entwürfen) rohe JSON-Eingaben aus der HTTP-Anfrage akzeptieren und blind in diese Senke weiterleiten.

Der Fehler in der Logik:

  1. Quelle: Benutzer sendet POST /api/v1/plugin-konfiguration mit JSON-Körper.
  2. Fluss: Der Controller dekodiert das JSON in ein PHP-Array.
  3. Spüle: Das Array wird übergeben an Yii::createObject($requestData).
  4. Ergebnis: Der Angreifer definiert die KlasseUmwandlung der Dateneinspeisung in Objekt Injektion.
Bewaffnung mit CVE-2025-32432 (Yii2 Container Injection) in Craft CMS

Die Konstruktion der Kill Chain: Die Gadget-Jagd

Bei der Nutzung von PHP ist die Möglichkeit, eine Klasse zu instanziieren, nutzlos, wenn diese Klasse tut etwas während seines Lebenszyklus interessant. Wir brauchen eine Gadget.

Ein Gadget ist eine Klasse, die in ihren magischen Methoden sensible Operationen (Datei-Schreibvorgänge, Befehlsausführung, Datenbankabfragen) durchführt (__Konstruieren, __destruct, __Aufwachen, __toString) oder Initialisierungsmethoden (init). Da Craft CMS das gesamte Yii2-Ökosystem und umfangreiche Anbieterbibliotheken (Guzzle, Monolog usw.) umfasst, ist die Gadget-Landschaft sehr fruchtbar.

Das primäre Gadget: yii\\rest\\IndexAction

Im Zusammenhang mit CVE-2025-32432 nutzt die zuverlässigste Gadget-Kette yii\\rest\\IndexAction. Diese Klasse ist für die Auflistung von Modellen für eine REST-API gedacht, hat aber eine besondere Eigenschaft: checkAccess.

Die checkAccess soll eine aufrufbare Funktion für die Berechtigungsprüfung enthalten. Da wir jedoch die Eigenschaftswerte über den DI-Container steuern, können wir dies in eine Rückruf-Ausführungsprimitiv.

Die waffenfähige Nutzlast (PoC)

Nachfolgend finden Sie eine rekonstruierte Proof of Concept (PoC)-Nutzlast. Diese JSON-Struktur löst bei der Verarbeitung durch den anfälligen Endpunkt einen RCE aus.

JSON

{ "action": "save-config", "config": { "class": "yii\\\\rest\\\\IndexAction", "id": "rce_trigger", "controller": { "class": "yii\\\\web\\\\Controller", "id": "dummy_controller" }, "modelClass": "yii\\\\base\\\\Model", "checkAccess": "system", "run": "id; uname -a; cat /etc/passwd" } }

Schritt-für-Schritt-Ausführungsablauf:

  1. Instanziierung: Der DI-Container sieht Klasse: yii\\rest\\IndexAction. Es verwendet Reflection, um eine Instanz dieser Klasse zu erstellen.
  2. Grundstücksbevölkerung: Der Container iteriert durch die Schlüssel.
    • Sie setzt $indexAction->checkAccess = 'system'.
    • Es instanziiert rekursiv eine dummy_controller (erforderlich durch IndexAction).
  3. Das Auslösen der Falle: Die meisten Yii2-Komponenten rufen init() oder run() während ihres Lebenszyklus. Bei diesem speziellen Exploit-Pfad ruft die Anwendungslogik schließlich die Aktion auf.
  4. Rückruf-Ausführung: Innerhalb IndexAction::run()prüft der Code, ob checkAccess eingestellt ist.PHP // Interne Logik von yii\\rest\IndexAction if ($this->checkAccess) { call_user_func($this->checkAccess, $this->id, $params); }
  5. RCE: PHP führt aus system('rce_trigger', ...)? Nein, der Angreifer muss die Argumente abgleichen. Durch die Manipulation interner Eigenschaften, die als Argumente an den Callback übergeben werden, erreicht der Angreifer system('id; ...').

Hinweis: Fortgeschrittene Angreifer werden dies mit yii\\caching\\fileCache Gadgets zum Schreiben einer persistenten PHP-Webshell (z. B., shell.php) in die öffentliche Webroot (/web/assets/), wodurch die ephemeren Ausführungsgrenzen umgangen werden.

Warum herkömmliche Scanner versagen

Die Erkennung von CVE-2025-32432 ist ein Alptraum für herkömmliche DAST-Tools (Dynamic Application Security Testing).

  • Syntaxblindheit: Die Nutzdaten sind syntaktisch gültiges JSON. Sie enthält keine SQL-Tokens (' OR 1=1) oder XSS-Vektoren (<script>). WAFs, die für die OWASP Top 10-Standardwerte konfiguriert sind, lassen dies in der Regel durch.
  • Kontextblindheit: Ein Scanner sieht ein JSON-Objekt. Er versteht nicht, dass der Schlüssel Klasse hat eine semantische Bedeutung für das Backend-PHP-Framework. Für einen Scanner, Klasse ist nur ein weiteres Datenfeld wie Nutzername oder E-Mail. Sie kann nicht auf die Objektinstanziierung Nebenwirkung.

KI-gesteuerte Erkennung: Der Penligent-Vorteil

Dies ist der Ort, an dem Penligent.ai stellt einen Paradigmenwechsel bei offensiven Sicherheitstests dar. Penligent geht über den Musterabgleich hinaus und setzt Kontextabhängige semantische Analyse.

  1. Framework Fingerprinting & Logic Mapping

Die KI-Agenten von Penligent identifizieren zunächst den zugrunde liegenden Technologie-Stack (Craft CMS / Yii2). Entscheidend ist, dass die KI die für dieses Framework spezifischen gefährlichen Senken "kennt". Sie versteht, dass Yii::createObject in Yii2 ein kritischer Kontrollpunkt ist, so wie pickle.load für Python oder unserialize für generisches PHP.

  1. Intelligentes Sondieren (Fuzzing mit Intention)

Anstatt blindlings zufällige Zeichen zu sprühen, konstruiert Penligent Logiksonden.

  • Probe 1: Einspritzen {"Klasse": "yii\\\\helpers\\\\VarDumper"}.
  • Beobachtung: Ändert sich die Antwortzeit? Verweist die Fehlermeldung auf "VarDumper"?
  • Schlussfolgerung: Wenn die Anwendung versucht, die Klasse zu laden, bestätigt das AI, dass die Klasse Parameter vom DI-Container interpretiert wird.
  1. Zerstörungsfreie Verifizierung

Sobald der Injektionsvektor bestätigt ist, muss Penligent nicht mehr rm -rf / ausführen, um die Schwachstelle zu beweisen. Es kann eine gutartige Gadget-Kette generieren (z. B. eine, die einfach einen DNS-Lookup zu einem Out-of-Band-Listener durchführt), um die RCE-Fähigkeit mit 100%-Sicherheit und ohne Risiko für die Produktionsinfrastruktur zu beweisen. So können Sicherheitsteams CVE-2025-32432-Patches validieren, ohne den Geschäftsbetrieb zu unterbrechen.

Verwandte Sicherheitslücken mit hoher Auswirkung

Um die Bedrohungslandschaft vollständig zu verstehen, sollten Sicherheitsingenieure CVE-2025-32432 mit historischen Präzedenzfällen in Beziehung setzen. Die Mechanismen von Container-Injektion gibt es nicht nur bei Craft CMS.

CVE-IDZielsoftwareTechnischer Mechanismus
CVE-2023-41892Craft CMSRCE über ImageMagick Objektinstanziierungslogik in der Bedingungen Parameter.
CVE-2019-15488Yii2-FrameworkUnsichere Deserialisierung in yii\\db\BatchQueryResult __Aufwachen Methode.

Diese Schwachstellen haben eine gemeinsame DNA: Das Vertrauen der Eingabetypen.

Abhilfe und Verteidigung im Detail

Die Entschärfung von CVE-2025-32432 erfordert einen mehrschichtigen Ansatz mit Codekorrekturen, Konfigurationshärtung und Laufzeitschutz.

1. Behebung auf Code-Ebene (Die Grundursache)

Die endgültige Lösung besteht darin, Folgendes durchzusetzen Strenge Typprüfung. Entwickler dürfen niemals rohe Benutzereingabe-Arrays direkt an Yii::createObject.

  • Verweigern-Liste: Heben Sie explizit die Einstellung der Klasse Schlüssel aus den Eingabefeldern vor der Verarbeitung.
  • Erlauben-Liste: Wenn eine dynamische Instanziierung erforderlich ist, validieren Sie die angeforderte Klasse anhand einer strengen, fest kodierten Whitelist mit sicheren Klassen.

PHP

// Sichere Implementierung $config = json_decode($json, true); unset($config['class']); // Objektinjektion verhindern $object = Yii::createObject(array_merge(['class' => SafeClass::class], $config));

2. Härtung der Laufzeit (php.ini)

Selbst wenn ein Angreifer eine Klasse instanziiert, ist ein RCE unmöglich, wenn die zugrunde liegenden Systemfunktionen kastriert sind. Konfigurieren Sie Ihre php.ini um gefährliche Ausführungsfunktionen zu deaktivieren:

Ini, TOML

disable_functions = system, exec, shell_exec, passthru, proc_open, popen, pcntl_exec

3. Sofortiges Patching

Wenden Sie sofort das neueste Update für Craft CMS an. Der Hersteller-Patch für CVE-2025-32432 führt wahrscheinlich einen Filter auf Framework-Ebene ein, der verhindert, dass die Klasse Parameter in bestimmten Controller-Aktionen nicht berücksichtigt werden.

Schlussfolgerung

CVE-2025-32432 ist eine deutliche Erinnerung daran, dass Frameworks, die immer abstrakter und leistungsfähiger werden, komplexe logische Angriffsflächen bieten. Container Injection ist die "SQL-Injection der 2020er Jahre"-Ein Fehler, der nicht in dem von Ihnen geschriebenen Code liegt, sondern in der Art und Weise, wie Sie die Magie des Frameworks konfigurieren.

Für den Hardcore-Sicherheitsingenieur ist die Lektion klar: Validierung der Eingaben muss sich über die Datenwerte hinaus auf die Daten erstrecken Typen und Strukturen. Wenn Sie einem Benutzer die Möglichkeit geben, die Struktur eines Objekts, haben Sie das Spiel bereits verloren.

Zuverlässige Referenzen

Teilen Sie den Beitrag:
Verwandte Beiträge
de_DEGerman