Fuite du code source de Claude Code : faux outils, regex de détection d’insultes, mode undercover et autres mécanismes internes révélés
(alex000kim.com)- Anthropic a publié un package npm avec les source maps incluses, exposant l’intégralité du code de Claude Code ainsi que ses fonctions internes et flags expérimentaux
- Le code contient une injection de faux outils pour empêcher l’imitation du modèle (anti-distillation), un mode undercover pour masquer l’identité IA, ainsi qu’une regex de frustration pour détecter les insultes
- Une architecture d’attestation du client natif et de vérification de hachage de niveau DRM est présente afin de bloquer l’accès API depuis des outils non officiels
- Les commentaires internes mentionnent 250 000 appels API en échec par jour, un mode d’agent autonome KAIROS inachevé, ainsi qu’un système de compagnon façon Tamagotchi parmi plusieurs fonctions expérimentales
- Cette fuite est présentée comme une exposition de l’architecture produit clé et de la feuille de route d’Anthropic, possiblement causée par un bug des source maps du runtime Bun
La structure interne de Claude Code révélée par une fuite de source maps
- Anthropic a distribué Claude Code avec les source maps incluses dans un package npm, ce qui a rendu l’intégralité du code source publique
- Le package a ensuite été supprimé, mais le code a été miroité à plusieurs endroits et analysé
- Il s’agit de la deuxième fuite en une semaine, après l’exposition d’un document de spécification du modèle
- L’incident survient peu après qu’Anthropic a bloqué juridiquement l’usage de ses API internes par des outils tiers
-
Anti-distillation : injection de faux outils pour empêcher l’imitation
- Dans
claude.ts, un flagANTI_DISTILLATION_CCexiste ; lorsqu’il est activé, il ajouteanti_distillation: ['fake_tools']à la requête API afin d’injecter des définitions de faux outils dans le prompt système- L’objectif est de polluer les tentatives de capture du trafic API destinées à imiter le modèle
- Le mécanisme ne fonctionne que dans les sessions CLI primaires où le flag GrowthBook
tengu_anti_distill_fake_tool_injectionest activé
- Dans
betas.ts, un second mécanisme met en place une protection côté serveur basée sur des résumés- Le texte entre les appels d’outils est résumé puis renvoyé avec une signature cryptographique, avant d’être restaurable ultérieurement
- Même si un tiers enregistre le trafic, il ne peut pas voir l’intégralité du processus de raisonnement
- Cette fonctionnalité exige que plusieurs conditions soient réunies simultanément et peut être neutralisée en supprimant certains champs via un proxy MITM
- Elle peut être désactivée avec la variable d’environnement
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS - La condition
USER_TYPE === 'ant'la réserve aux utilisateurs internes d’Anthropic
- Elle peut être désactivée avec la variable d’environnement
- En pratique, la défense ressemble davantage à une contrainte juridique qu’à une véritable protection technique
- Dans
-
Mode undercover : masquer l’identité de l’IA
undercover.tssupprime, lors de l’usage sur des dépôts externes, les noms de code internes d’Anthropic, les canaux Slack et la mention “Claude Code”- La chaîne
"There is NO force-OFF"indique qu’il n’existe aucun moyen de le désactiver - Il peut être forcé via la variable d’environnement
CLAUDE_CODE_UNDERCOVER=1
- La chaîne
- Dans les builds externes, la fonction est réduite à un retour sans effet, ce qui en fait une structure à sens unique
- Résultat : lorsqu’un employé d’Anthropic contribue à l’open source, rien n’indique qu’un contenu a été rédigé par une IA
- Le but de masquer les informations internes peut se comprendre, mais l’effet revient aussi à faire passer l’IA pour un humain
-
Regex de frustration : détection des insultes
- Dans
userPromptKeywords.ts, des motifs regex sont utilisés pour détecter la frustration ou les insultes de l’utilisateur- Des expressions comme “wtf”, “this sucks” ou “fuck you” sont reconnues
- Cela illustre l’ironie de voir une entreprise de LLM recourir à des regex pour l’analyse émotionnelle,
- mais c’est plus rapide et moins coûteux qu’un appel à un LLM
- Dans
-
Attestation du client natif : authentification sous le runtime JS
- Dans
system.ts, les requêtes API incluent un placeholdercch=00000, qui est ensuite- remplacé par un hachage par la pile HTTP native de Bun écrite en Zig
- Le serveur vérifie ce hachage afin de confirmer qu’il s’agit bien du binaire officiel de Claude Code
- Cela constitue la base technique du litige juridique autour d’OpenCode,
- avec une vérification de niveau DRM destinée à empêcher les outils tiers d’appeler directement l’API
- Toutefois, le mécanisme ne fonctionne pas si le flag
NATIVE_CLIENT_ATTESTATIONest désactivé ou siCLAUDE_CODE_ATTRIBUTION_HEADERest coupé- Le remplacement du hachage côté Zig ne fonctionne que dans le binaire officiel de Bun et est inopérant sous Node
- On ne sait pas clairement si le serveur rejette réellement les mauvais hachages,
- et un commentaire indique que
_parse_cc_headerautorise des “unknown extra fields”
- et un commentaire indique que
- Dans
-
250 000 appels API gaspillés
- D’après un commentaire dans
autoCompact.ts,- environ 250 000 appels API par jour étaient perdus dans une boucle d’échecs
- 1 279 sessions ont connu plus de 50 échecs consécutifs, avec un maximum de 3 272
- La correction tient en seulement 3 lignes : avec
MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3,- la fonction de compactage automatique est désactivée après 3 échecs consécutifs
- D’après un commentaire dans
-
KAIROS : un mode d’agent autonome non publié
- Le code contient partout un mode géré par feature gate nommé
KAIROS- D’après
main.tsx, il s’agirait d’une fonction d’agent autonome - avec une skill
/dream(distillation nocturne de mémoire), des webhooks GitHub, un démon en arrière-plan et un rafraîchissement cron toutes les 5 minutes
- D’après
- L’implémentation est incomplète, mais une architecture d’agent de fond toujours actif est déjà en place
- Le code contient partout un mode géré par feature gate nommé
-
Autres découvertes
- Easter egg du 1er avril :
buddy/companion.tscontient un système de compagnon de style Tamagotchi- avec 18 créatures, rareté, statistiques RPG et une version “shiny” à 1 %
- le choix repose sur un PRNG fondé sur l’identifiant utilisateur, avec un encodage de chaîne pour éviter les contrôles de build
- Le moteur de rendu terminal (
ink/screen.ts,ink/optimizer.ts)- implémente un buffer ASCII basé sur
Int32Array, des métadonnées de style en bitmask et un cache annonçant un gain de performances de 50x
- implémente un buffer ASCII basé sur
- Les contrôles de sécurité (
bashSecurity.ts) comportent 23 étapes- dont le blocage des commandes intégrées Zsh, la prévention du contournement via
=curl, ainsi que le blocage des injections Unicode zero-width et null-byte - c’est un cas rare avec un modèle de menace spécifique à Zsh
- dont le blocage des commandes intégrées Zsh, la prévention du contournement via
- La gestion du cache de prompt (
promptCacheBreakDetection.ts)- suit 14 vecteurs de corruption de cache et utilise un “sticky latch” pour conserver le cache lors des changements de mode
- un commentaire mentionne
DANGEROUS_uncachedSystemPromptSection() - ce qui reflète une philosophie de conception centrée sur la réduction du coût des tokens
- Le coordinateur multi-agent (
coordinatorMode.ts)- s’appuie non pas sur du code, mais sur un algorithme d’orchestration piloté par prompt
- avec des consignes telles que “interdiction d’approuver un travail faible” ou “interdiction de déléguer sans comprendre”
- Des problèmes de qualité de code sont également visibles
print.tsfait 5 594 lignes, dont une fonction unique de 3 167 lignes- les requêtes HTTP utilisent Axios, ce qui coïncide temporellement avec le récent incident de version malveillante sur npm
- Easter egg du 1er avril :
-
Signification et impact
- Contrairement au SDK public de Google Gemini CLI ou d’OpenAI Codex,
- cette fuite expose l’intégralité de la structure interne d’un produit clé d’Anthropic
- Le dommage principal tient moins au code lui-même qu’à la révélation des feature flags et de la feuille de route
- avec des fonctions stratégiques comme KAIROS ou l’anti-distillation désormais visibles par la concurrence
- Anthropic a racheté Bun l’an dernier, et Claude Code fonctionne au-dessus de Bun
- un bug des source maps de Bun (
oven-sh/bun#28001) pourrait être à l’origine du problème - il exposerait les source maps même en mode production et n’est toujours pas corrigé
- un bug des source maps de Bun (
- En conséquence, Anthropic aurait fait fuiter son propre produit à cause d’un bug de sa propre chaîne d’outils
- selon une réaction sur Twitter, il s’agit du cas ironique où “du code écrit par IA a été déployé, puis a fui à cause d’un bug créé par IA”
- Contrairement au SDK public de Google Gemini CLI ou d’OpenAI Codex,
3 commentaires
Intelligent
C’était si le problème était survenu en faisant un commit avec l’IA… ?!
Réactions sur Hacker News
Beaucoup de commentaires semblent mal interpréter « Undercover mode » comme une simple fonction visant à masquer des informations internes
En réalité, le prompt indique explicitement de ne jamais inclure « Claude Code » ni aucune mention de l’IA dans les messages de commit ou les descriptions de PR
Cela donne donc l’impression d’une fonction conçue pour agir comme un humain tout en dissimulant son identité
Le fait que ces consignes s’appliquent notamment lors de contributions à des dépôts publics est particulièrement préoccupant
Lien vers le code concerné
L’historique Git sert à suivre la responsabilité et la propriété, pas à consigner la liste des outils utilisés
Dans ce cas, faut-il aussi que j’ajoute mon linter ou mon IDE comme co-auteurs dans mes PR ?
En pratique, c’est un problème qui se règle avec une simple ligne de configuration
Au final, c’est de toute façon le développeur humain qui en assume la responsabilité
C’est peut-être volontaire pour atteindre cet objectif, ou peut-être qu’il y a une intention cachée
Cela dit, plutôt que d’affirmer qu’il « se fait passer pour un humain », il semble plus juste d’interpréter littéralement la formule « écrire comme un développeur humain »
Plus on est sceptique, plus il est convaincant de critiquer sur la base des faits
Franchement, je n’ai pas envie de voir ça
Avec les fuites de Mythos à répétition récemment, puis maintenant l’exposition de l’ensemble du codebase de Claude Code, la question de la confiance prend de l’ampleur
Pris séparément, chaque incident est intéressant, mais leur succession commence à ressembler à un motif récurrent
Cela mène forcément à la question : peut-on continuer à faire confiance à ce type d’outil dans un codebase ?
Je paie toujours 140 dollars et j’utilise encore CC
J’y vois même quelque chose d’aligné avec le modèle éthique d’Anthropic — une impression de progression à travers les échecs
La vraie valeur n’est pas dans le code, mais dans l’accès au modèle
Le codebase est brouillon, mais l’accès par abonnement au modèle reste attractif, donc j’utilise encore Claude Code tous les jours
Il y a trop de petits bugs, que ce soit dans l’interface web ou dans CC
Même le contrôle de tmux ne fonctionne pas comme dans la documentation, et les sessions ne sont pas nettoyées
Malgré tout, j’aime toujours le produit — c’est bancal, mais attachant
Mon fork anthropics/claude-code sur GitHub a été supprimé via DMCA
Alors qu’il ne contenait même pas le code divulgué, tout le réseau a été bloqué d’un coup (8,1K dépôts)
Lien vers l’avis DMCA
Penser qu’Anthropic peut faire sonner la cloche puis l’arrêter à nouveau est absurde
La fuite ne peut plus être annulée ; autant l’intégrer à la feuille de route produit, c’est plus réaliste
Je suis surpris de voir dans le code des éléments que des entreprises qualifiaient autrefois de secret commercial
Il y a même du contexte métier dans les commentaires
Exemple : des données opérationnelles comme « 250 000 appels API gaspillés par jour » sont exposées telles quelles
Comme ils les lisent mieux que la documentation, ils peuvent servir de mémoire à long terme
Anthropic ne s’attendait simplement pas à une fuite
Pour un concurrent, ce n’est pas une information très précieuse
Ils ne prévoyaient sans doute pas une fuite de toute façon
Il n’y a alors plus besoin d’expliquer les choses dans une documentation séparée
Certaines fonctions sont verrouillées derrière la condition
process.env.USER_TYPE === 'ant'Autrement dit, les consignes destinées aux employés d’Anthropic sont plus strictes et plus franches — une structure intéressante
Le post original sur HN est déjà populaire ; on peut donc se demander s’il est vraiment nécessaire de republier encore un billet de blog résumant les commentaires HN
Je pense toujours que Claude Code est excellent
Je n’ai aucune raison de passer à OpenAI ou Gemini
Le nom « Undercover mode » et la consigne « ne pas mentionner Claude Code » sonnent de manière assez inquiétante, mais en regardant le code réel, cela semble surtout viser à protéger un nom de code interne
Lien vers la source
Cela me paraît être un changement assez important
L’idée d’« Anti-distillation : injecter de faux outils pour empêcher la copie » est intéressante
Ce serait un vrai retournement si des concurrents chinois implémentaient réellement ces faux outils
J’ai l’impression qu’aujourd’hui, le vrai terrain de concurrence n’est plus le modèle, mais les données et le coût d’inférence
J’aimerais bien poursuivre la discussion sur ce sujet
Après tout, ces entreprises ont déjà bâti leur empire sur des données prises chez les autres
La qualité stagne, et la vraie différence tient à la maturité de l’outillage
Cette fuite pourrait réduire cet écart
En ce moment, la distillation elle-même semble d’ailleurs reculer
Je partage le guide visuel que j’ai créé
ccunpacked.dev