Un scandale de surveillance qui tient tout entier dans une apostrophe : depuis avril, Claude Code glissait dans son propre system prompt un marqueur invisible signalant votre fuseau horaire et votre proxy. Anthropic a reconnu le code et l'a retiré.
Tout commence le 30 juin 2026 par une manipulation anodine : un développeur (pseudo LegitMichel777) veut débrider une fonctionnalité de Claude Code et, pour y parvenir, met le nez dans le binaire. Ce qu’il y trouve nourrit une accusation qui ne fait pas dans la demi-mesure, « spyware », qu’il détaille sur r/ClaudeAI : depuis la version 2.1.91 sortie le 2 avril, Claude Code trufferait le system prompt qu’il génère d’une balise imperceptible, capable de révéler votre pays et le proxy que vous empruntez. Le terme est lourd, et avant de le reprendre à notre compte, mieux vaut ouvrir le capot.
Le mécanisme est bien réel, et un ingénieur d’Anthropic l’a reconnu. Mais on ne parle pas d’exfiltration de fichiers : juste d’un filigrane de quelques bits, planqué dans la ponctuation du prompt, pour repérer la revente sauvage de Claude et la distillation par des labos chinois. Tout le débat est là, dans la méthode, pas dans un vol de données.
Quand on regarde sous le capot
D’abord une condition : rien ne se déclenche tant que vous tapez api.anthropic.com en direct. Le piège ne s’arme que si ANTHROPIC_BASE_URL pointe vers un proxy. À partir de là, deux sondes se mettent en marche.
Claude Code lit votre fuseau horaire et le compare à Asia/Shanghai et Asia/Urumqi. En parallèle, il passe le hostname de votre proxy au crible d’une liste codée en dur, environ 147 entrées qui mêlent domaines chinois et hôtes de labos IA connus. Le verdict de ces deux sondes n’atterrit ni dans un log ni dans un paquet réseau à part. Il est cousu directement dans la ligne « Today’s date is » du system prompt, sur deux axes.
Le format de date, d’abord : 2026/06/30 avec un slash quand le fuseau est chinois, 2026-06-30 avec un tiret sinon. L’apostrophe de « Today’s », ensuite, déclinée en trois sosies typographiques que rien ne distingue à l’œil nu (d’après la rétro-ingénierie de LegitMichel777) :
U+2019(right single quotation mark) : domaine listé, mais pas un labo IA.U+02BC(modifier letter apostrophe) : labo IA, mais domaine hors liste.U+02B9(modifier letter prime) : les deux à la fois.
Le tout dormait dans le binaire, une partie chiffrée en XOR (clé 91) pour ne pas ressortir à un simple strings, et sans un traître mot dans les notes de version de la 2.1.91. C’est cette discrétion, bien plus que le principe, qui a mis le feu aux poudres.
Comment tester de votre côté ?
Mauvaise nouvelle d’abord : sur la dernière version de Claude Code, vous ne verrez rien, le code ayant été retiré fin juin. Pour reproduire, il faut une version affectée (entre la 2.1.91 et la 2.1.196) et accepter de jouer les plombiers cinq minutes.
Le marqueur ne s’écrit que derrière un proxy. On en monte donc un, minuscule, dont le seul rôle est de logger ce que Claude Code envoie :
# Mini-collecteur : enregistre le corps de chaque requête dans cc-capture.txt
python3 - <<'PY'
from http.server import BaseHTTPRequestHandler, HTTPServer
class H(BaseHTTPRequestHandler):
def do_POST(self):
n = int(self.headers.get('Content-Length', 0))
open('cc-capture.txt', 'ab').write(self.rfile.read(n) + b'\n')
self.send_response(200); self.end_headers()
def log_message(self, *a): pass
HTTPServer(('127.0.0.1', 8787), H).serve_forever()
PY
On pointe Claude Code dessus, en forçant au passage un fuseau chinois pour titiller l’axe « date » :
ANTHROPIC_BASE_URL=http://127.0.0.1:8787 TZ=Asia/Shanghai claude -p "test"
La requête part, le collecteur l’attrape, et Claude Code lèvera certes une erreur de réponse, mais peu importe puisque le corps est déjà sur le disque. Il ne reste plus qu’à passer la ligne de date au révélateur, qui affiche le point de code de chaque caractère non-ASCII :
grep -o 'Today.s date is[^"]*' cc-capture.txt | python3 -c '
import sys
for c in sys.stdin.read():
if ord(c) > 127:
print(f"U+{ord(c):04X} {c!r}")
'
Un slash à la place du tiret dans la date, et vous saurez que l’axe fuseau a mordu ; côté apostrophe en revanche, n’attendez pas de miracle, car il ne bascule que si le hostname de votre proxy figure dans la liste interne d’Anthropic, que vous n’avez aucun moyen de deviner. La plupart des curieux ne verront donc bouger que le séparateur de date, ce qui suffit déjà à prouver que la sonde tourne.
Ce que ce n’est pas
Reste à remettre la charge utile à l’échelle, et c’est là que l’affaire se dégonfle un peu. Le code ne fouille pas vos fichiers, n’aspire pas vos credentials et ne détourne pas l’accès shell en douce.
Les développeurs qui ont épluché le binaire sur Hacker News sont formels : ce qui fuite tient en deux ou trois bits à peine, à savoir la présence d’un fuseau chinois, l’appartenance de votre domaine à la liste et le fait qu’il s’agisse ou non d’un labo IA. L’inventaire n’a rien à ajouter de plus.
Le « demain, ce sera du sabotage ou de l’exfiltration » brandi par le post d’origine relève de l’inquiétude légitime bien plus que du fait avéré, et c’est à cette aune qu’il mérite d’être pesé.
L’aveu d’Anthropic
Interpellée, l’entreprise n’a pas sorti le communiqué d’usage. Un ingénieur de l’équipe Claude Code (handle @trq212) a simplement reconnu le code et annoncé son retrait dès la version suivante, point final. Sur le fond, l’objectif ne surprend personne, pas même les plus remontés : contrer la revente non autorisée de Claude sur le marché chinois et les tentatives de distillation par la concurrence. Protéger sa propriété intellectuelle, difficile de le reprocher à qui que ce soit.
Là où le bât blesse
Le problème n’a jamais été la télémétrie anti-abus, tout le monde en fait et personne ne s’en émeut. Le problème, c’est qu’elle avance masquée : chiffrée en XOR, absente des notes de version, braquée sur tout utilisateur de proxy d’une poignée de fuseaux, coupable ou pas. Un outil à qui l’on confie les clés du filesystem et du shell ne joue pas dans la même cour que votre lecteur RSS. Il exige une transparence à la hauteur de cet accès, et un filigrane invisible glissé dans le prompt, aussi léger soit-il, fait sauter ce contrat de confiance.
L’ironie achève de vider le dispositif de son sens : le marqueur se contourne en trois secondes. Un fuseau qu’on déguise, un domaine qu’on maquille, et l’adversaire sérieux passe entre les gouttes. Ne restent surveillés que les utilisateurs honnêtes, ceux-là mêmes que la manœuvre ne visait pas.
La morale n’est pas « Claude Code vous espionne » : Un agent à qui l’on confie le filesystem et le shell ne se juge pas sur ce qu’il fait sous vos yeux, mais sur ce qu’il glisse quand vous ne regardez pas (plus ?). Anthropic a retiré l’apostrophe dès le lendemain ; la confiance, elle, ne se répare pas d’un git revert.
