Anthropic Vient de Publier le Code de Claude en Open Source (J'ai Cloné le Repo)

6 min read

Tout a commencé par un poisson d'avril. Ça s'est terminé en empoisonnement de la supply chain.

Le 1er avril, j'ai fait ce que tout développeur sensé fait. J'ai construit un faux repo de leak. Un README avec un emoji poisson. Une licence appelée POISSON-D-AVRIL-1.0. Un fichier Python qui affiche un poisson ASCII et vous traite de naïf. J'étais plutôt fier de moi.

TL;DR : Mon article de poisson d'avril sur un faux leak de Claude Code est devenu réel le jour même. Le vrai leak a exposé 500K lignes de source, un mode daemon autonome, et un système anti-leak qui n'a pas empêché le leak. Mais le vrai danger, c'est l'attaque supply-chain axios qui a eu lieu en même temps et dont personne ne parle. Allez lancer npm audit, pour de vrai cette fois.

Pendant que je finissais mon ASCII art, Anthropic a accidentellement (lol) livré un fichier sourcemap dans leur package npm qui pointait vers une archive zip contenant tout le code source de Claude Code. 500 000 lignes de TypeScript. 1 900 fichiers. Mon faux repo avait un dossier appelé ocean/ avec un poisson dedans. Le vrai leak avait 44 sous-répertoires d'outils, un système complet d'orchestration multi-agents, et un mode furtif conçu pour empêcher les leaks. On ne peut pas inventer ça, mais l'ironie l'a fait quand même, en temps réel.

Illustration comique d'un super-héros en cape horrifié devant un ordinateur portable tandis qu'un employé de bureau rit en tenant un filet de pêche avec de l'art ASCII
Quand votre héros devient le copain de débogage de votre concurrent.

Le canular

J'ai construit un faux monorepo. Structure TypeScript standard, rien de suspect au premier coup d'œil. Sauf un dossier appelé src/internal/ocean/ qui n'avait absolument rien à faire là.

Les commentaires inline étaient le genre de trucs qu'on trouve dans n'importe quelle codebase touchée par plus de trois ingénieurs à des heures bizarres :

// TODO: comprendre pourquoi le modèle mentionne toujours des poissons le mardi
// NE PAS SUPPRIMER - la dernière fois que quelqu'un a effacé cette ligne,
// Claude a commencé à répondre exclusivement en haïku
// La constante saumon. Personne ne se souvient pourquoi c'est 42.
// Trois ingénieurs ont essayé de la changer. Les trois ont démissionné.
const MAX_RECURSION = 42;

Le fichier de config, c'est là que j'ai été créatif :

{
  "codename": "POISSON",
  "status": "ACTIVE",
  "deployment_date": "2026-04-01",
  "target_audience": "développeurs qui clonent des repos suspects à 2h du mat",
  "threat_level": "délicieux avec du citron"
}

Et un fish.py qui affichait un poisson ASCII et vous félicitait d'avoir lancé un fichier Python random d'un repo suspect. La licence était POISSON-D-AVRIL-1.0. Permission accordée de fermer votre laptop et d'aller toucher de l'herbe.

37 personnes ont applaudi. Je suis allé me coucher.

24 heures plus tôt, le vrai truc tombait

Je me suis réveillé avec un feed plein de gens qui ne rigolaient pas du tout avec les poissons.

Le 31 mars, le chercheur en sécurité Chaofan Shou avait trouvé un fichier .map dans le package npm de Claude Code, version 2.1.88. Ce fichier pointait vers une archive zip sur le bucket Cloudflare R2 d'Anthropic. Accessible publiquement. Sans auth. Juste posé là comme un garage ouvert avec une Porsche dedans.

Le zip avait tout. Environ 1 900 fichiers TypeScript, plus de 512 000 lignes. Tout le harnais agentique : implémentations d'outils, commandes slash, gestion des prompts, gestion du contexte, coordination multi-agents. Tout le moteur.

Je suis resté là avec mon café à scroller les mirrors GitHub (41 500 forks avant que l'équipe légale d'Anthropic se réveille), puis j'ai ouvert mon faux repo à côté. Mon canular avait src/internal/ocean/. Leur vraie codebase avait src/tools/ avec 44 sous-répertoires et un seul fichier appelé query.ts qui pèse 785KB. Mon fish.py faisait 400 bytes. Même énergie, échelle différente.

Déclaration officielle d'Anthropic : "Problème de packaging causé par une erreur humaine." Une ligne dans .npmignore. Ou le bundler de Bun qui génère des sourcemaps par défaut et personne ne l'a vu. Choisissez votre version préférée.

Le Mode Incognito n'a rien couvert

La codebase leakée a un fichier appelé utils/undercover.ts. Chaque mot qui suit est vrai, et je sais que ça sonne comme si j'inventais.

Anthropic a construit un sous-système complet pour empêcher Claude de révéler des infos internes quand les employés d'Anthropic utilisent Claude Code pour contribuer à des repos open-source. Ça injecte un prompt qui dit (je paraphrase à peine) : "Tu opères INCOGNITO. Ne grille pas ta couverture. N'inclus JAMAIS les noms de code internes des modèles, les noms de repos internes, les canaux Slack, ou l'expression 'Claude Code' dans les commits ou PRs."

Ils ont construit un système anti-leak. Dans la codebase. Qui a leaké.

Les termes interdits dans ce prompt incluent des noms d'animaux. Parce que les noms de code internes des modèles sont des animaux. Capybara. Tengu. Tengu apparaît des centaines de fois comme préfixe pour les feature flags et événements analytics dans tout le source. Capybara était déjà partiellement exposé par un leak Anthropic séparé quelques jours plus tôt (un brouillon de blog post rendu accessible publiquement par accident, rapporté par Fortune). Deux leaks en une semaine du labo safety-first. Cohérent, au moins.

Puis il y a KAIROS. Nommé d'après le concept grec du "bon moment". Il apparaît plus de 150 fois dans le source comme feature flag pour quelque chose appelé mode daemon autonome. Claude Code qui tourne en arrière-plan pendant que vous êtes inactif, faisant ce que le code appelle autoDream : consolider la mémoire, fusionner les observations, résoudre les contradictions. Le genre de feature qu'on annonce dans une keynote avec un éclairage dramatique. Pas le genre qui leake dans un fichier zip à côté de votre sourcemap.

Ou en fait, attendez. Laissez-moi le dire autrement. Ce sont le genre de détails où si je les avais mis dans mon canular du 1er avril, les gens auraient dit "ok Phil, calme-toi." "Niveau de menace : délicieux avec du citron" c'est une blague. "Mode Incognito qui n'a pas empêché le leak" c'est la réalité qui est plus drôle que la satire.

Le poison dont personne ne parle

Donc tout le monde dissèque les trucs cool. KAIROS, multi-agent, l'architecture mémoire. Des bonbons pour développeurs. Je comprends.

Mais le même jour, une attaque supply-chain séparée a touché le package npm axios. Entre 00:21 et 03:29 UTC le 31 mars, quelqu'un a publié des versions malveillantes d'axios (1.14.1 et 0.30.4) contenant un Remote Access Trojan. Si vous avez installé ou mis à jour Claude Code via npm pendant cette fenêtre de trois heures, vous avez peut-être récupéré une dépendance compromise. Pas un sourcemap leaké. Un RAT. Sur votre machine. Avec accès au système de fichiers.

Deux événements supply-chain en un jour ciblant le même écosystème. L'un a fait les gros titres parce que lire les commentaires internes d'Anthropic c'est marrant. L'autre c'est une vraie backdoor.

La réponse DMCA a empiré les choses. Anthropic a envoyé des demandes de retrait qui ont touché des milliers de repos GitHub, beaucoup sans rapport avec le leak. Ils ont dû faire marche arrière. À ce moment-là le code avait été réécrit en Rust et Python par des devs indépendants. Essayer de remettre le café dans la tasse.

Et voici ce qui me dérange : combien d'autres entreprises ont exactement la même config de build maintenant ? Bun génère des sourcemaps par défaut. Si vous ne les désactivez pas explicitement, ils sont livrés. Si votre .npmignore ne les exclut pas, ils sont publics. Anthropic n'est pas une startup avec deux stagiaires qui gèrent les déploiements. Ils ont une discipline de workflow sur laquelle j'ai beaucoup écrit, et même cette discipline ne vous protège pas d'un oubli de packaging. Si ça peut leur arriver, vérifiez votre propre build output ce soir. Pas demain. Ce soir.

Sources

  • Divulgation originale de Chaofan Shou sur X (31 mars 2026)
  • The Register : "Anthropic accidentally exposes Claude Code source code" (31 mars 2026)
  • VentureBeat : "Claude Code's source code appears to have leaked" (31 mars 2026)

Mon fish.py est toujours en ligne. Il nage dans son faux repo, rendant de l'ASCII art à quiconque prend la peine de le cloner. Personne ne l'a DMCA. Personne n'en avait besoin.

Le vrai code d'Anthropic a été forké 41 500 fois avant que le premier avis de retrait arrive. Il existe maintenant en Rust, en Python, et probablement en BASIC quelque part. Le labo qui dépense des millions pour aligner l'IA avec les valeurs humaines a oublié d'ajouter une ligne à leur .npmignore.

Mon faux repo avait une meilleure opsec que le pipeline de build d'Anthropic. Et ce n'est pas une blague.

(*) La couverture est générée par IA. Le poisson, cependant, est artisanal.

<(((°>

La vie est trop courte pour ne pas s'amuser un peu.

Joyeux 1er avril. Maintenant allez toucher de l'herbe.