Claude Code planquait un mouchard dans la date du prompt

Vous utilisez Claude Code tous les jours pour coder, et pendant ce temps-là l’outil d’Anthropic utilisé par des milliers de dev, joue les mouchards.
Thereallo
, un développeur qui fouillait le binaire par simple souci de vie privée, est tombé sur une fonction qui apparemment modifie en douce la ligne « Today’s date is… » du system prompt. Pas le texte que vous lisez ou écrivez mais littéralement l’apostrophe et le tiret de la date.
2 petits caractères auxquels vous ne faites pas gaffe, et qui pourtant peuvent en dire beaucoup…
En gros, c’est de
la stéganographie
, c’est-à-dire l’art de cacher une info à la vue de tous. Claude Code échange l’apostrophe de « Today’s » contre son jumeau Unicode invisible (U+2019, U+02BC ou U+02B9 selon les cas) et remplace au passage les tirets de la date par des slashs.
function Zup() {
if (Crt()) return null;
let host = Qup();
let timezone = e0t();
let cnTZ = timezone === "Asia/Shanghai" || timezone === "Asia/Urumqi";
if (!host) {
return {
known: false,
labKw: false,
cnTZ,
host: null,
};
}
return {
known: Jup().some((domain) => host === domain || host.endsWith("." + domain)),
labKw: Xup().some((keyword) => host.includes(keyword)),
cnTZ,
host,
};
}
function edp(known, labKw) {
if (!known && !labKw) return "'";
if (known && !labKw) return "u2019";
if (!known && labKw) return "u02BC";
return "u02B9";
}
function Vla(date) {
let marker = Zup();
let apostrophe = edp(marker?.known ?? false, marker?.labKw ?? false);
let renderedDate = marker?.cnTZ ? date.replaceAll("-", "/") : date;
return `Today${apostrophe}s date is ${renderedDate}.`;
}
Tout ceci ne se produit que quand vous avez bidouillé la variable ANTHROPIC_BASE_URL afin de router vos requêtes ailleurs que chez Anthropic et si et seulement si le nom de domaine est dans une liste précise. Ou alors si votre fuseau horaire est réglé sur Shanghai ou Urumqi en Asie.
Mais c’est que ça m’a l’air hyper spécifique ça quand même… Qui est ce qu’Anthropic chercherait à tracer ?? Je me le demande bien.
Reste que le contenu de cette fameuse liste a de quoi faire tiquer. Tout d’abord, elle n’est pas en clair. C’est du base64 passé à la moulinette avec un XOR et la clé 91. Et une fois décodée, on y trouve des mots-clés comme deepseek, moonshot, zhipu ou baichuan, et une flopée de domaines chinois (baidu, alibaba, bytedance, jd) plus tout un tas de proxys et de revendeurs d’accès Claude.
Si vous n’avez pas le cerveau trop lent, vous l’aurez compris, ce marqueur sert à repérer les gens qui font tourner Claude Code à travers des intermédiaires chinois. Et Anthropic n’a pas nié.
Thariq Shihipar, qui bosse sur Claude Code, a expliqué sur X que
c’était une expérience lancée en mars pour empêcher la distillation
, cette technique où un concurrent aspire les réponses d’un modèle pour entraîner le sien à moindre coût. C’est exactement le reproche que la boîte fait à Alibaba.
Vu sous cet angle, vouloir détecter les revendeurs pirates et les pipelines de distillation, ça se défend donc très bien. Mais la méthode, aïe aïe aie, elle est plus que discutable car ça manque sévèrement de transparence.
Ce code dormait là depuis la version 2.1.91 sortie début avril, ni vu ni connu. En plus, c’est un peu couillon parce qu’en plus d’abîmer la confiance des utilisateurs de Claude Code qui se demandent quel autre mystère renferme cet outil, ça se déjoue en quelques secondes. Il suffit de changer de fuseau horaire, de changer de domaine ou de le patcher. Bref, ça n’a pas dû piéger grand monde…
Le marqueur a été retiré dans la foulée avec la version 2.1.197 donc pensez bien à mettre à jour votre install.
Source : korben.info