Les premiers résultats de l'analyse de l'incident concernant la détection de deux commits malveillants avec un backdoor dans le dépôt Git du projet PHP ont été publiés. Lors de l'examen des traces de l'activité des attaquants, il a été conclu que le serveur git.php.net sur lequel le dépôt Git était hébergé n'avait pas été piraté, mais que la base de données contenant les comptes des développeurs du projet avait été compromise.
Il n'est pas exclu que les cybercriminels aient réussi à télécharger la base d'utilisateurs, qui était stockée dans la base de données sur le serveur master.php.net. Le contenu de master.php.net a déjà été transféré vers le nouveau serveur main.php.net, installé depuis zéro. Tous les mots de passe des développeurs utilisés pour accéder à l'infrastructure php.net ont été réinitialisés et le processus de changement de mot de passe a été initié via un formulaire de récupération spécifique. Les dépôts git.php.net et svn.php.net restent accessibles en mode lecture seule (le développement a été transféré sur GitHub).
Après la découverte du premier commit malveillant effectué par le biais du compte de Rasmus Lerdorf, fondateur de PHP, il a été supposé que son compte avait été piraté et que Nikita Popov, l'un des développeurs clés de PHP, avait annulé les modifications et bloqué les droits de commit pour le compte problématique. Après un certain temps, il a été compris que le blocage n'avait pas de sens, car sans la vérification des commits par une signature numérique, tout participant ayant accès au dépôt php-src pouvait apporter des modifications en utilisant un faux nom d'auteur.
Les attaquants ont ensuite envoyé un commit malveillant au nom de Nikita lui-même. En analysant les journaux du service gitolite, utilisé pour gérer l'accès aux dépôts, une tentative a été faite pour identifier le participant qui a réellement effectué les modifications. Malgré l'enregistrement de tous les commits, il n'y avait pas d'entrées dans le journal pour les deux modifications malveillantes. Il est devenu évident qu'il y avait une compromission de l'infrastructure, car les commits ont été ajoutés directement, contournant l'accès via gitolite.
Le serveur git.php.net a été rapidement déconnecté et le dépôt principal a été transféré sur GitHub. Dans la précipitation, il a été oublié que, pour accéder au dépôt, en plus de SSH utilisant gitolite, il y avait une autre méthode d'entrée permettant d'envoyer des commits via HTTPS. Dans ce cas, le backend git-http-backend était utilisé pour interagir avec Git, et l'authentification était réalisée par le serveur HTTP Apache2, qui vérifiait les droits d'accès en consultant la base de données hébergée dans le SGBD sur le serveur master.php.net. L'accès était possible non seulement par des clés, mais aussi par un mot de passe classique. L'analyse des journaux du serveur HTTP a confirmé que des modifications malveillantes avaient été ajoutées via HTTPS.
L'examen des journaux a révélé que les attaquants ne s'étaient pas connectés du premier coup, mais avaient d'abord essayé de deviner le nom du compte, puis après l'identification, ils ont réussi du premier coup, c'est-à-dire qu'ils connaissaient d'avance les mots de passe de Rasmus et Nikita, mais pas leurs identifiants. Si les attaquants ont pu accéder au SGBD, on ne comprend pas pourquoi ils n'ont pas immédiatement utilisé l'identifiant correct y figurant. Cet écart n'a pas encore reçu d'explication fiable. Le piratage de master.php.net est considéré comme le scénario le plus probable, car sur ce dernier le serveur un code très ancien et un système d'exploitation obsolète ont été utilisés, qui n'avaient pas été mis à jour depuis longtemps et présentaient des vulnérabilités non corrigées.
Parmi les mesures prises, on note la réinstallation de l'environnement du serveur master.php.net et la mise à jour des scripts vers la nouvelle version PHP 8. Le code pour travailler avec le SGBD a été retravaillé pour utiliser des requêtes paramétrées, compliquant l'injection de code SQL. Pour le stockage des hachages de mots de passe dans la base de données, l'algorithme bcrypt a été utilisé (auparavant, les mots de passe étaient stockés avec un hachage MD5 peu fiable). Les mots de passe existants ont été réinitialisés et il a été proposé d'établir un nouveau mot de passe via le formulaire de récupération de mot de passe. Comme l'accès aux dépôts git.php.net et svn.php.net via HTTPS était lié aux hachages MD5, il a été décidé de laisser git.php.net et svn.php.net en mode lecture seule, et de transférer tous les dépôts restants des extensions PECL vers GitHub, à l'instar du dépôt principal de PHP.
Source : opennet.ru
