Le paquet Python threadfluent, découvert sur PyPI, a été identifié comme malveillant, contenant un malware classique de type infostealer. Cependant, sa caractéristique déterminante est l'utilisation de techniques avancées d'obscurcissement de code qui obscurcissent sa charge utile, ce qui rend l'analyse particulièrement difficile. Ce malware utilise trois couches d'obscurcissement de manière itérative tout au long de sa chaîne d'attaque, créant des obstacles importants pour la déconstruction manuelle.
Notre équipe Malware Early Warning a signalé le package à l'équipe de sécurité de PyPI, qui l'a rapidement supprimé. Dans cet article, nous expliquons les étapes de threadfluentL'attaque de et les méthodes qu'elle utilise pour cacher son objectif, en se concentrant sur la façon dont les logiciels malveillants de vol d'informations et l'obscurcissement du code fonctionnent ensemble.
Couches d'obscurcissement du malware ThreadFluent Infostealer
1. Triple cryptage
Le processus d'obfuscation commence par une charge utile fortement cryptée intégrée dans le fluent.py fichier. Le processus initial de codage et de décryptage peut être résumé comme suit :
encoded_data = base64_module.b64decode("... BASE-6 with encrypted payload, IV and RSA-encrypted keys…”);
# … Sequential decryption: ChaCha20, Blowfish and AES …
encrypted_payload = AES_Cipher.new(aes_key, AES_Cipher.MODE_CBC, iv=aes_iv).decrypt(encrypted_payload[16:])
final_payload = unpad_function(encrypted_payload, AES_Cipher.block_size)
exec( zlib_module.decompress(bz2_module.decompress(final_payload)) )
Ce processus d’obfuscation implique :
- Compression:Utilisation de gzip et bzip.
- Chiffrement symétrique:Cryptage en chaîne avec ChaCha20, Blowfish et AES.
- Cryptage asymétrique:RSA utilisé pour crypter les clés symétriques.
Le résultat est encodé en Base64 et inséré comme données_codéesChaque itération s’appuie sur la précédente, créant une structure de chiffrement imbriquée qui rend exceptionnellement difficile la découverte de la charge utile réelle sans rétro-ingénierie.
2. Décompression Gzip
Dans de nombreuses étapes intermédiaires, le malware utilise une méthode d’obfuscation simple mais efficace : la compression Gzip combinée à l’encodage Base64.
import base64, zlib; eval(zlib.decompress(base64.b64decode(<STR>).decode('utf-8'))
Cette technique garantit que la charge utile obscurcie reste cachée tout au long des étapes.
3. Concaténation de code et compilation dynamique
La couche finale consiste à diviser la charge utile obscurcie en plusieurs variables, qui sont concaténées et décodées de manière dynamique pendant l'exécution :
import base64, zlib
FEQXCBDOZKHVIhT = '...'
# ....(111 other variables with base-64 encoded values) ...
zZytWuvuEdBXSrO =
eval(<FEQXCBDOZKHVIhT' encoded with '\x>) +
eval(<next variable, encoded>) +
eval( ' zlib.decompress(base64.b64decode(<VAR>)).decode('utf-8') ') + ...
eval(compile(base64.b64decode(eval(zZytWuvuEdBXSrO)).decode('utf-8'), ‘<app>', 'exec'))
Cette étape est particulièrement difficile à réaliser manuellement en rétro-ingénierie, car chaque variable doit être décodée et recombinée pour révéler la charge utile suivante.
En combinant ces techniques d’obscurcissement, le logiciel malveillant voleur d'informations in threadfluent échappe à la détection, mettant en évidence le rôle essentiel de Obfuscation de code dans les cyberattaques modernes.
La chaîne d'attaque à plusieurs étapes de ThreadFluent
Le threadfluent logiciel malveillant voleur d'informations comprend quatre étapes distinctes, chacune introduisant des couches supplémentaires de Obfuscation de codeCes étapes servent non seulement à délivrer la charge utile, mais également à la protéger contre la détection et l’analyse.
Étape 0 : Exécution initiale du code
Le point d'entrée est le __init__.py fichier, qui lance l'exécution de la charge utile obscurcie dans fluent.pyCe fichier utilise une obfuscation multicouche (comme décrit dans les étapes 1 à 3) pour produire le compte-gouttes de l'étape 1 :
import os,threading
def main():
if os.name == 'nt':
from . import fluent
fluent.main()
thread = threading.Thread(target=main , daemon=True)
thread.start()
Étape 1 : Compte-gouttes initial
Le premier dropper, une fois désobfusqué, télécharge et intègre du code malveillant supplémentaire, met.py, à partir d'un dépôt GitHub Shanks aux cheveux roux 1337/reputations (attention : code potentiellement malveillant ici).
Le compte-gouttes s'intègre met.py dans l'installation locale du populaire demandes bibliothèque, en modifiant son __init__.py fichier pour exécuter la désobfuscation et exécuter l'étape suivante. Cette désobfuscation consiste à inverser de nombreuses applications des couches d'obfuscation 1 … 3.
Étape 2 : Deuxième compte-gouttes
Le deuxième dropper, une fois désobfusqué en suivant le même processus, télécharge encore une autre charge utile, ssl.py à partir du référentiel GitHub, le renomme en udp.py, et génère un fichier de verrouillage pour garantir que le logiciel malveillant ne se réinstalle pas à plusieurs reprises. Il est ensuite exécuté pour le désobfusquer, ce qui entraîne l'exécution de la charge utile finale du voleur d'informations.
Étape 3 : Infostealer final
L'étape finale est un infostealer entièrement fonctionnel qui utilise des techniques d'évasion avancées :
- Fonctionnalités anti-analyse:
- Détecte les outils anti-programme malveillant et s'arrête si des processus, des adresses IP, des noms d'hôtes ou des environnements virtuels figurant sur la liste noire sont détectés.
- Exfiltration de données:
- Capture des informations exhaustives. Allant de l'adresse IP, de l'adresse Mac, des données VPN, des cookies/historique du navigateur, des données de carte de crédit et des informations d'identification du portefeuille cryptographique, entre autres, y compris une capture d'écran.
- Envoie des données volées (cryptées) via un canal Telegram, en utilisant le modèle présenté ici :
Stratégie de désobfuscation
Pour analyser des packages similaires, les chercheurs doivent systématiquement inverser leurs couches d’obscurcissement :
- Étapes d'émulation d'obscurcissement : Écrivez des scripts pour simuler les transformations (par exemple, le décryptage, la décompression) sans exécuter la charge utile.
- Couches de chiffrement inversé : Extraire et décrypter la charge utile à l’aide des clés et des algorithmes intégrés.
- Analyse itérative : Traitez chaque étape intermédiaire de manière itérative pour reconstruire la charge utile finale.
Des outils automatisés et des environnements sandbox sont essentiels pour rationaliser cette analyse.
L'acteur menaçant
Apparemment, le package a été publié à partir de deux comptes PyPI, ABIRHOSSAIN10 et anomilano785, actuellement supprimé.
Il existe un compte GitHub (actuellement actif) nommé ABIRHOSSAIN10, qui pourrait être lié à la campagne. Shanks aux cheveux roux 1337 L'utilisateur GitHub propriétaire du référentiel utilisé pour le téléchargement des charges utiles des étapes 2 et 3 est également en cours d'analyse.
Bien que l’attribution soit toujours compliquée et que l’appartenance à une équipe rouge soit une possibilité, le type et le volume d’informations exfiltrées laissent penser qu’il s’agit d’un acteur malveillant.
Conclusion : Le rôle de l'obscurcissement du code dans l'évolution des logiciels malveillants
Le threadfluent Le package illustre l'obscurcissement des programmes malveillants modernes dans sa diffusion en plusieurs étapes. Associé aux techniques d'évasion employées, ce package démontre un effort clair pour échapper à la détection et résister à l'analyse.
Cette analyse souligne l’importance des efforts collaboratifs et des outils automatisés pour lutter contre ces menaces. En décortiquant et en comprenant ces méthodes, les professionnels de la sécurité peuvent développer de meilleures défenses contre des programmes malveillants similaires à l’avenir.
Comment le système MEW de Xygeni a empêché le package malveillant threadfluent d'atteindre la production
Xygéni Alerte précoce de logiciels malveillants (MEW) Le système a joué un rôle déterminant dans l’arrêt de la threadfluent Paquet Python, une dépendance malveillante contenant des obscurcissement du code et un multi-étages logiciel malveillant voleur d'informations, avant qu'il ne puisse compromettre les environnements de production. Voici comment :
- Détection par analyse statique
MEW repéré threadfluentle code caché, détectant des signes suspects tels qu'un cryptage en couches et une activité de dépendance inhabituelle. - Évaluation de l'accessibilité à l'exécution
Le système a découvert que le code du package pouvait s'exécuter pendant l'utilisation, le marquant comme une menace sérieuse sans réellement l'exécuter. - CI/CD Pipeline Protection
MEW bloqué threadfluent en temps réel, l'empêchant d'être inclus dans les builds et l'empêchant d'atteindre la production. Il a envoyé aux développeurs des alertes exploitables, leur permettant de gagner un temps précieux. - Partage de renseignements sur les menaces
Xygeni a rapidement signalé le package à PyPI et a partagé ses découvertes avec son réseau de sécurité mondial, l'empêchant ainsi de se propager davantage.
en attrapant threadfluent Au début, le système MEW de Xygeni garantissait que le code malveillant ne nuisait pas aux chaînes d'approvisionnement en logiciels ou CI/CD workflows.
Protégez votre CI/CD Pipelines gratuitement
Prévenir les menaces telles que threadfluent avec le système d'alerte précoce contre les logiciels malveillants de Xygeni. Démarrez votre essai gratuit aujourd'hui et sécurisez votre chaîne d'approvisionnement en logiciels.
Luis Rodriguez
Luis Rodriguez est un médecincist + mathématicien et CISSP. Actuellement cofondateur et directeur technique de Xygeni Security, il possède plus de 20 ans d'expérience en sécurité logicielle et a participé à des projets tels que SAST et SCA. Il se concentre actuellement sur software supply chain security.
Daniel Martin
Daniel Martín est un expert en cybersécurité et membre de l'équipe de recherche en sécurité de Xygeni, spécialisé dans SDLC sécurité et atténuation des vulnérabilités des applications.





