Únik mapy zdrojového kódu Claude Code
Anthropic vydal mapu zdrojového kódu s kódem uvnitř. Týmy by to měly považovat za selhání vydání.
Anthropic publikoval @anthropic-ai/claude-code@2.1.88 na npm s cli.js.map v tarballu. Stáhl jsem si balíček z registru a sám si ho zkontroloval. Mapa zdrojového kódu obsahovala 4 756 vložených zdrojových záznamů. Po odstranění node_modules balíček stále odhaloval 1 906 souborů vlastněných společností Anthropic a přibližně 515 000 řádků kódu, téměř vše TypeScript nebo TSX.
Pokud je mapa zdrojového kódu vydána s sourcesContent, nevydali jste neškodný ladicí soubor. Vydali jste zdrojový kód ve formátu JSON.
V době, kdy jsem to kontroloval, Anthropic již začal s úklidem. Stránka verze npm byla označena jako zastaralá se zprávou Unpublished. Oficiální repozitář GitHub a dokumentace k nastavení nyní označují instalaci přes npm jako zastaralou a tlačí uživatele směrem k nativnímu instalátoru. Reakce byla rychlá. Artefakt byl již veřejný.
Kopie a analýzy se v té době již šířily. Takto se veřejné artefakty chovají na internetu. Jakmile se něco užitečného dostane do registru, úklid už prohrává.
Pokud vás více zajímá, co odhalený kód říká o návrhu agentů, než samotný únik, Shreyansh napsal samostatný článek o tom, co architektura Claude Code učí o budování produkčních AI agentů. Tento příspěvek je o nudnější části, hygieně vydávání, protože nudná selhání stále způsobují značné škody.
Co bylo vydáno
Zde je to, co jsem mohl ověřit z balíčku npm, metadat registru a veřejných stránek Anthropic:
@anthropic-ai/claude-code@2.1.88 byl publikován na npm jako veřejný balíček.
- Tarball obsahoval
cli.js.map vedle cli.js, README.md, LICENSE.md, package.json, bun.lock a sdk-tools.d.ts.
cli.js.map obsahoval vyplněné pole sourcesContent.
- Mapa obsahovala celkem 4 756 vložených souborů.
- Po vyloučení
node_modules mapa stále pokrývala 1 906 souborů vlastněných společností Anthropic.
- 1 888 z těchto souborů byly
.ts nebo .tsx.
- Část mapy vlastněná společností Anthropic obsahovala přibližně 515 000 řádků.
- Stránka npm později označila verzi jako zastaralou se zprávou autora
Unpublished.
- Repozitář a dokumentace k nastavení Anthropic nyní označují instalaci přes npm jako zastaralou.
Záměrně nereprodukuji kód z mapy ani neposkytuji odkazy na zrcadlové repozitáře. Kolem toho už je dost veřejného šumu. Tento balíček odhalil mnohem více než CLI binárku.
Proč na tom záleží
Lidé stále mluví o mapách zdrojového kódu, jako by to byly neškodné pozůstatky. Někdy ano. Mapy zdrojového kódu mohou mít nízké riziko, když zůstanou uvnitř soukromého sledování chyb a vynechají původní zdroj. Veřejná mapa s sourcesContent je vydáním zdrojového kódu.
Co mě nejvíce znepokojilo, bylo, jak obyčejný je tento režim selhání. Mapa nevysvětlovala jen stack trace. Odhalovala vnitřní strukturu, propojení promptů, logiku směrování, cesty telemetrie, propojování feature flagů a rozhodnutí o orchestraci. Úmyslně udržuji toto popsání na vysoké úrovni. Nechci z bezpečnostního příspěvku udělat prohlídku cizího codebase.
Pro AI kódovací produkt tento druh úniku snižuje náklady na prověřování, imitaci a plánování útoků. Reverzní inženýrství zabaleného CLI trvá čas. Čtení mapy zdrojového kódu s již vloženým kódem trvá minuty.
Stejná rodina, jiná příčina
Minulý týden jsem psal o kompromitaci Telnyx PyPI. Ta byla škodlivá. Tato vypadá jako chyba v procesu vydávání. Provozně jsou si podobné.
Stále se vracím k jedné větě: artefakt je perimetr.
Týmy tráví většinu energie na aplikačním kódu a runtime kontrolách, pak považují balíček, kontejnerový obraz, GitHub Action, Helm chart a prohlížečový bundle za detaily balení. Útočníci tento rozdíl nedělají. Nehody také ne.
Viděli jsme stejný vzorec v backdooru xz, kompromitacích GitHub Actions, kradení přihlašovacích údajů z PyPI, škodlivých aktualizacích npm, odhalených vrstvách kontejnerů a nyní ve veřejném npm balíčku, který nesl vlastní strom zdrojového kódu jako JSON. Režimy selhání se mění. Hranice důvěry ne.
Jak tomu zabránit
Vyhnout se tomu není okázalé. Je to základní disciplína vydávání, což je přesně důvod, proč to funguje.
1. Nevydávejte mapy zdrojového kódu s vloženým zdrojem
Pokud vydáváte uzavřený npm balíček, veřejné mapy zdrojového kódu by měly být vypnuté, pokud nejste ochotni vydat kód, který obsahují. Soukromé ladění je v pořádku. Veřejné sourcesContent je událost vydání.
Pro frontendové a CLI buildy to obvykle znamená:
- vypnout veřejné mapy zdrojového kódu pro balíček
- generovat skryté mapy a nahrát je do soukromého sledování chyb
- použít mapy bez zdrojů, pokud potřebujete symboly bez vydávání kódu
- kontrolovat výchozí nastavení bundleru, kdykoli změníte build toolchain
2. Učinit npm pack tvrdou bránou pro vydání
Nevěřte složce dist/. Zkontrolujte tarball, který se chystáte publikovat.
Každý pipeline pro vydání by měl sestavit balíček, spustit npm pack, rozbalit tarball a selhat, pokud se obsah odchýlí od politiky. Minimálně selhat vydání, když:
- soubor
.map obsahuje sourcesContent
- balíček obsahuje soubory mimo povolený seznam
- tarball nese interní dokumentaci, prompty, fixtures nebo konfiguraci, která do balíčku nepatří
- manifest se změní bez explicitní kontroly
Jednoduchá brána je lepší než objevit problém na X:
npm pack
tar -xzf *.tgz
node -e 'const fs=require("fs"); const map=JSON.parse(fs.readFileSync("package/cli.js.map","utf8")); if (Array.isArray(map.sourcesContent) && map.sourcesContent.some(Boolean)) { console.error("Odmítám publikovat vložené mapy zdrojového kódu"); process.exit(1); }'
3. Publikujte z čistého, povoleného adresáře
Mnoho úniků se stává, protože týmy publikují z kořene monorepa nebo ze složky dist/, která se rozrostla zvykem. Sestavujte do čistého adresáře pro vydání. Zkopírujte pouze to, co do balíčku patří. Použijte pole files v package.json jako povolený seznam. .npmignore považujte za záchrannou síť, ne za plán.
4. Považujte provozní AI aktiva za citlivá na publikování
AI týmy obvykle chrání váhy, API klíče a data zákazníků. Jsou mnohem volnější s prompty, logikou směrování, chováním při selhání, přepínači telemetrie, interními feature flagy a oprávněními nástrojů. To je chyba.
I když tato aktiva nejsou v právním smyslu tajná, stále nesou produktovou hodnotu a hodnotu pro útok. Pokud je artefakt vydání obsahuje, předpokládejte, že budou čteny.
5. Ověřte, co registr po publikování obsluhuje
I dobré CI pipeline něco minou. Stáhněte přesnou verzi, kterou jste právě publikovali, z registru nebo zrcadla, znovu ji zkontrolujte a upozorněte na odchylky. Pokud něco proklouzne, minuty se počítají.
Debug artefakty udržujte ve výchozím stavu soukromé. Mapy zdrojového kódu patří do soukromých pracovních postupů pro pozorovatelnost mnohem častěji, než patří do veřejných registrů balíčků.
Naše zaujatost v Kolsetu
Stavíme pro regulovaná odvětví, takže si nemůžeme dovolit předstírat, že inženýrství vydávání nespadá do bezpečnostního modelu. Balíček, kontejner nebo prohlížečový bundle lze stáhnout, zrcadlit, indexovat a prohledávat během několika minut. Tento předpoklad mění způsob, jakým publikujete software.
Naše výchozí postoj je jednoduchý:
- zkontrolovat finální artefakt, nejen složku, která ho vyprodukovala
- udržovat debug artefakty soukromé
- vydávat z povoleného adresáře pro vydání
- předpokládat, že jakýkoli veřejný artefakt bude okamžitě čitelný
Myslím si, že mnoho AI týmů stále podceňuje disciplínu vydávání, protože modely jsou zábavnější na povídání, i když balení je místo, kde dochází k mnoha vyhnutelným škodám.
Závěrečná myšlenka
To, co se zde stalo, je pro Anthropic trapné. Je to také užitečné pro zbytek průmyslu. Veřejný npm balíček je kanál pro zveřejnění a mapa zdrojového kódu s sourcesContent je zdrojový kód. Týmy budující AI produkty tráví nekonečný čas na modelech, promptech, evaluacích a nástrojích, pak uspěchají poslední míli balení. Tato poslední míle rozhoduje o tom, co svět může skutečně číst.
Další kolo selhání v oblasti AI bezpečnosti nepřijde jen z chování modelů. Některé přijdou z CI, registrů, kontejnerů, prohlížečových bundleů, GitHub Actions a výstupů sestavení, které nikdo dostatečně pozorně nekontroloval. Model dostává titulky. Artefakt rozhoduje o tom, co svět uvidí.
Reference