Nos pipelines de détection de logiciels malveillants ont récemment détecté un petit groupe de paquets sur npm qui semblaient... familiers.
Des forfaits tels que json-bigint-extend, jsonfx, et jsonfb imitaient le populaire json-grand nombre entier bibliothèque : mêmes fonctionnalités, fichier README identique, et même un nom d'auteur étrangement proche de celui du mainteneur d'origine.
La plupart du temps, ce schéma indique des attaques courantes visant la chaîne d'approvisionnement, telles que le typosquatting et la confusion des dépendances, conçues pour compromettre les systèmes et exfiltrer des secrets. Mais celle-ci semblait différente dès le départ.
Il n'essayait pas de frapper tout le monde. Il essayait de frapper quelque chose.
Le détournement
À première vue, json-bigint-extend se comporte exactement comme le légitime json-grand nombre entier bibliothèque : elle exporte les fonctions parse/stringify familières utilisées pour prendre en charge les grands nombres entiers dans JSON. En fait, la plupart des développeurs et des organisations ne remarqueraient rien d'inhabituel. Cette charge utile est spécialement conçue pour rester silencieuse et ne se déclencher que lorsqu'elle détecte qu'elle s'exécute dans un environnement cible spécifique, en vérifiant la valeur d'une variable d'environnement spécifique appelée SERVICE_NAME.
Une fois qu'il détecte qu'il se trouve dans le bon environnement, il installe deux portes dérobées :
Tout d'abord, il installe un middleware Express ciblé, connecté spécifiquement à une voie de paiement (/v1/paiement/achat-de-marchandises). Ce middleware est conçu pour exécuter dynamiquement du code supplémentaire récupéré à partir d'un point de terminaison. Après une inspection plus approfondie du code récupéré, il semble s'agir d'un système complexe de réécriture des flux de trésorerie utilisé pour manipuler un jeu de hasard.
const routeInjectionRules = {
'/v1/pay/purchase-goods': {
identify: function (handlers, fn, index) {
...
},
position: 'after',
extraMiddlewares: [function (req, res, next) {
// Translation: [Plugin] Mount risk middleware as post-payment success logic.
log('[插件] 支付成功后的后置逻辑挂载risk');
riskCode(req, res, next); // Executes dynamically fetched code
}]
}
};
Deuxièmement, un middleware de niveau prototype qui modifie discrètement Express.js, en ajoutant un middleware global à chaque Route POST. Ce middleware écoute un secret opération croisée en-tête et débloque quatre types de commandes pour l'opérateur :
- RunSQL : exécutez n'importe quelle requête SQL sur la base de données de production.
- RunFileList : liste les fichiers et répertoires côté serveur.
- RunFileContent : télécharger le contenu d'un fichier sélectionné.
- CompresserTélécharger : télécharger un répertoire sous forme de fichier zip.
Le tableau de bord de l'opérateur
À l'intérieur du paquet, il y a également une page HTML intégrée pour un « service de téléchargement de compression de répertoire » (titre chinois : Service de téléchargement de fichiers compressés).

Bien que cette page n'ait jamais été connectée à aucun endroit dans le code de la porte dérobée que nous avons observé, elle semble être une interface utilisateur destinée aux opérateurs pour parcourir et exfiltrer des répertoires sous forme de fichiers zip.
Manipulation des résultats des jeux d'argent
Le plus effrayant : cela codeRisque(...) La fonction appelée dans le middleware est contrôlée à distance et mise à jour toutes les 30 secondes.
Bien que la charge utile ne soit pas (encore) activement invoquée, nous avons observé une logique capable d'ajuster rétroactivement l'historique de jeu récent d'un utilisateur afin que son solde évolue d'un montant choisi, tout en reconstruisant la chaîne de solde complète afin que les journaux de jeu restent cohérents en interne.
C'est un outil sophistiqué qui réécrit l'équilibre et l'histoire :
- Lit les lignes de flux de trésorerie récentes pour un utilisateur.
- Sélectionne une fenêtre de parties.
- Ajuste les valeurs des mises/gains afin d'atteindre un montant cible dans le portefeuille de l'utilisateur.
- Reconstruit l'intégralité des journaux de jeu afin qu'ils restent cohérents en interne dans la base de données.
Cela signifie que l'objectif n'est pas seulement la fraude. Il s'agit d'une fraude qui résiste aux contrôles de cohérence internes, consistant à falsifier les gains et les pertes tout en conservant une comptabilité cohérente.
Certaines références environnantes renvoient à une application de jeu appelée Bappa Rummy, largement promue en ligne par le biais de programmes de parrainage et d'autres boutiques d'applications, mais qui n'est plus disponible sur la boutique officielle Google Play.

Détection et prévention
Même si nous ne savons pas qui se cache derrière cette porte dérobée, le plus effrayant est ce qu'elle fait une fois qu'elle se retrouve dans le bon environnement. Il ne s'agit pas « simplement » d'un implant de dépendance classique qui exfiltre le code source, les secrets ou les données des clients.
Au lieu de cela, il s'intègre directement à la logique métier, exécute du code contrôlé à distance sur le trafic réel et peut réécrire l'historique financier soutenu par la base de données. Si votre surveillance part du principe que les journaux de la base de données sont fiables, ce type de manipulation peut rester invisible pendant longtemps.
Si vous utilisez déjà Aikido, ce package serait signalé dans votre flux comme une découverte critique 100/100.
Vous n'êtes pas Aikido sur Aikido ? Créez un compte gratuit et connectez vos référentiels. L'offre gratuite inclut notre couverture de détection des logiciels malveillants (aucune carte de crédit requise).
Enfin, disposer d'un outil capable de bloquer les logiciels malveillants en temps réel dès leur apparition peut prévenir une infection grave. C'est le principe qui sous-tend Aikido Chain, un outil gratuit et open source qui s'intègre à npm, npx, yarn, pnpm et pnpx et utilise à la fois l'IA et des chercheurs en logiciels malveillants pour détecter et bloquer les derniers risques liés à la chaîne d'approvisionnement avant qu'ils ne pénètrent dans votre environnement.
Indicateurs de compromission
Paquets et auteurs :
- jsonfb (par sidoraress)
- jsonfx (par sidoraress)
- json-bigint-extend (par sidoraress & infinitynodestudio)
La porte dérobée communique avec un hôte distant à la fois pour les mises à jour de la charge utile et la journalisation.
Critères d'évaluation observés :
https://payment[.]y1pay[.]vip/v1/risk/get-risk-codehttps://payment[.]y1pay[.]vip/v1/risk/loghttps://payment[.]snip-site[.]cc
Autres IOC et comportements suspects :
- Demandes contenant un en-tête x-operation avec l'un des quatre jetons d'opération suivants :
- RunSQL (jeton : cfh2DNITa84qpYQ0tdCz)
- RunFileList (jeton : m3QiEkg8Y1r9LFTI5e4f)
- RunFileContent (jeton : Y3SrZjVqWOvKsBdpTCh7)
- CompressDownload (jeton : SJQf31UJkZ1f88q9m361)
- Modifications apportées au runtime
express.Route.prototype.post

