Co ujawnia wyciek kodu źródłowego Claude Code
W marcu 2026 roku błąd w narzędziu Bun spowodował, że pakiet npm Claude Code został opublikowany wraz z mapami źródłowymi. Pliki .map zawierały pełny, czytelny kod źródłowy TypeScript: każdy moduł, każdy komentarz, każdy wewnętrzny kryptonim.1 Anthropic szybko wycofał pakiet, jednak społeczność zdążyła już wyodrębnić i przeanalizować jego wnętrze.
Wyciek kodu źródłowego Claude Code ujawnił, że tryb auto uruchamia osobny klasyfikator Sonnet 4.6 dla każdego wywołania narzędzia, zabezpieczenia bash korzystają z 23 ponumerowanych kontroli sugerujących realne incydenty exploitacji, a buforowanie promptów śledzi 14 wektorów unieważniających pamięć podręczną z trwałymi zatrzaskami. Kod źródłowy ujawnił także mechanizmy obronne przed dystylacją wykorzystujące wstrzykiwanie fałszywych narzędzi, moduł undercover usuwający wewnętrzne kryptonimy bez możliwości wyłączenia oraz koordynację wielu agentów zaimplementowaną wyłącznie jako instrukcje w prompcie systemowym, a nie dedykowanym kodem protokołu.
Nie piszę artykułu w stylu „zobaczcie, co wyciekło”. Prowadzę najbardziej szczegółowy przewodnik po Claude Code w internecie i codziennie korzystam z 84 hooków, 43 umiejętności oraz 19 agentów zbudowanych na jego bazie.2 Wyciek kodu źródłowego dał odpowiedź na pytania, które miesiącami próbowałem rozwiązać poprzez obserwację zachowań w ramach inżynierii wstecznej. Poniżej przedstawiam analizę praktyka tego, co kod źródłowy mówi o rzeczywistym działaniu Claude Code oraz co wnioski oznaczają dla osób budujących na jego bazie.
TL;DR: Kod źródłowy potwierdza, że tryb auto uruchamia osobny klasyfikator Sonnet 4.6 dla każdego wywołania narzędzia (yoloClassifier.ts), zabezpieczenia bash obejmują 23 ponumerowane kontrole sugerujące realne incydenty exploitacji (bashSecurity.ts), buforowanie promptów śledzi 14 wektorów unieważniających pamięć podręczną z trwałymi zatrzaskami, koordynacja wielu agentów istnieje wyłącznie w instrukcjach promptu systemowego, a wykrywanie frustracji opiera się na wyrażeniach regularnych, a nie na inferencji LLM. Sekcja Under the Hood w przewodniku omawia konsekwencje dla budujących. Poniższy artykuł przedstawia pełną anatomię.
Najważniejsze wnioski
- Dla budujących: Tryb auto kosztuje jedną inferencję klasyfikatora na każde wywołanie narzędzia. Należy uwzględnić ten narzut w modelach kosztów dla autonomicznych przepływów pracy. Hooki PreToolUse uzupełniają, lecz nie zastępują wbudowanej walidacji bash z 23 kontrolami.
- Dla zaawansowanych użytkowników: Pamięć podręczna promptów łatwo ulega unieważnieniu poprzez 14 wektorów. Warto utrzymywać stabilność pliku CLAUDE.md w obrębie sesji. W przypadku napotkania pętli kompaktowania system zatrzymuje się po 3 niepowodzeniach (wyłącznik bezpieczeństwa istnieje, ponieważ ponawianie kompaktowania marnowało kiedyś 250 tysięcy wywołań API dziennie).
- Dla badaczy bezpieczeństwa: Głębokość modułu zabezpieczeń bash (2592 linie kodu, mechanizmy obronne specyficzne dla Zsh) sugeruje historię realnych prób exploitacji. Za każdą ponumerowaną kontrolą stoi konkretna historia.
1. Klasyfikator trybu auto
Plik o wewnętrznej nazwie yoloClassifier.ts liczy 1495 linii.3 Implementuje on system uprawnień „trybu auto” — klasyfikator decydujący o tym, czy zezwolić, zablokować lub zapytać o każde wywołanie narzędzia.
Kluczowy wniosek: tryb auto nie jest instrukcją w prompcie. Stanowi osobne wywołanie modelu. Każde wywołanie narzędzia jest oceniane przez klasyfikator Sonnet 4.6, który sprawdza, czy działanie odpowiada deklarowanemu zamiarowi użytkownika, a nie tylko czy polecenie jest „bezpieczne” w izolacji. Tryb auto dodaje zatem jedną inferencję klasyfikatora na każde wywołanie narzędzia, wprowadzając realne opóźnienie i realny koszt.
Claude Code wewnętrznie udostępnia pięć trybów uprawnień:1
| Tryb | Zachowanie |
|---|---|
default |
Pyta przed zapisem, bash, MCP |
acceptEdits |
Automatycznie zatwierdza edycje plików, pyta o bash |
dontAsk |
Zatwierdza wszystko bez pytania |
bypassPermissions |
Pomija wszystkie kontrole (--dangerously-skip-permissions) |
auto |
Decyzje per działanie oparte na klasyfikatorze |
Wyłącznik bezpieczeństwa trybu auto odzwierciedla ten, który Anthropic udokumentował publicznie: 3 kolejne lub 20 łącznych blokad powoduje przejście w tryb manualny.4 Kod źródłowy potwierdza, że jest to twardy limit, a nie miękka sugestia.
2. Zabezpieczenia bash: 23 kontrole, realne incydenty
Moduł walidacji bash (bashSecurity.ts) obejmuje 2592 linie i 23 ponumerowane kontrole bezpieczeństwa.1 Głębokość jest godna uwagi, a za każdą kontrolą stoi prawdopodobnie realny incydent.
| # | Wektor ataku | Mechanizm obronny |
|---|---|---|
| 1-3 | Rozwijanie =cmd w Zsh |
Blokowanie wzorców =curl, =wget, =bash |
| 4-6 | Brama zmodload |
Blokowanie 18 wbudowanych poleceń Zsh ładujących moduły jądra |
| 7-9 | Wstrzykiwanie heredoc | Linijkowe dopasowywanie zawartości do wstrzykniętych ładunków |
| 10-12 | Cytowanie ANSI-C ($'\x41') |
Wykrywanie wzorców zaciemnionych poleceń |
| 13-15 | Substytucja procesów (<(), >()) |
Blokowanie w niezaufanych kontekstach |
| 16-18 | Unicode’owe spacje o zerowej szerokości | Wykrywanie wstrzyknięć dla niewidocznych znaków |
| 19-21 | Eksfiltracja przez ztcp |
Blokowanie sieciowych prymitywów Zsh |
| 22-23 | Ataki złożone | Walidacja krzyżowa wielu wektorów |
Mechanizmy obronne specyficzne dla Zsh są godne uwagi. Większość narzędzi bezpieczeństwa skupia się na Bashu. Claude Code działa w Zsh w systemie macOS (domyślna powłoka od czasów Cataliny), a kod źródłowy pokazuje, że Anthropic odkrył wektory ataku unikalne dla semantyki rozwijania w Zsh. Rozwijanie =cmd jest na przykład funkcją Zsh zastępującą =curl pełną ścieżką do curl — substytucja, która może obejść naiwne listy blokad poleceń.
Dla budujących hooki: hooki PreToolUse uruchamiają się po tej walidacji obejmującej 23 kontrole. Dodawana jest druga warstwa, a nie jedyna warstwa. Wbudowane kontrole obsługują ataki na poziomie powłoki, które hooki na poziomie aplikacji by przeoczyły.
3. Mechanizmy obronne przed dystylacją
Kod źródłowy ujawnia aktywne mechanizmy obronne przed wydobywaniem danych treningowych:1
Wstrzykiwanie fałszywych narzędzi. Gdy flaga ANTI_DISTILLATION_CC jest aktywna, Claude Code wstrzykuje do rozmowy wabiące definicje narzędzi. Fałszywe narzędzia zatruwają wszelkie dane treningowe pozyskane z sesji. Model wytrenowany na zatrutych danych nauczyłby się błędnych schematów narzędzi.
Podsumowywanie tekstu łączącego. Drugi mechanizm obronny buforuje tekst asystenta między wywołaniami narzędzi i zwraca kryptograficzne podsumowania zamiast surowego tekstu. Podsumowania czynią transkrypcje rozmów bezużytecznymi do dystylacji, zachowując jednocześnie doświadczenie użytkownika.
Oba mechanizmy obronne mają znane obejścia. Proxy MITM, nadpisanie zmiennych środowiskowych lub dostawcy API zewnętrznych firm mogą je obejść.1 Mechanizmy obronne pełnią rolę progów zwalniających, a nie murów: podnoszą koszt dystylacji, lecz nie zapobiegają jej całkowicie.
4. Tryb undercover
undercover.ts liczy około 90 linii i ma jedną godną uwagi właściwość: nie istnieje przełącznik wymuszający wyłączenie.1
Moduł ukrywa wewnętrzne kryptonimy („Capybara”, „Tengu”), kanały Slack, wewnętrzne repozytoria oraz inne odniesienia do infrastruktury Anthropic. Gdy model generuje tekst zawierający kryptonim, moduł undercover przepisuje go, zanim użytkownik zobaczy wynik.
Konstrukcja „bez możliwości wyłączenia” oznacza, że moduł działa we wszystkich kontekstach, również gdy pracownicy Anthropic korzystają z Claude Code. Kod źródłowy ujawnia również, że commity tworzone przez AI od pracowników Anthropic nie zawierają atrybucji AI w ich kontrybucjach open source, ponieważ moduł undercover usuwa te znaczniki.
5. Wykrywanie frustracji
userPromptKeywords.ts wykrywa frustrację użytkownika za pomocą dopasowywania wzorców regex do wulgaryzmów.1 Regex działa w mikrosekundach; wywołanie modelu zajmuje sekundy. Różnica w szybkości i koszcie wyjaśnia ten wybór projektowy.
Po wyzwoleniu Claude dostosowuje swoje zachowanie: staje się ostrożniejszy, bardziej dosłowny, bardziej uległy. Jeżeli zauważył Pan/Pani, że Claude nagle staje się bardziej ostrożny po wyrażeniu frustracji, mechanizmem stojącym za tym jest moduł słów kluczowych. Zmiana zachowania nie wynika z modelu. Została ona wpisana w warstwę orkiestracji.
6. Architektura pamięci podręcznej promptów
promptCacheBreakDetection.ts śledzi 14 odrębnych wektorów unieważniających pamięć podręczną z „trwałymi zatrzaskami”.3 Trwały zatrzask oznacza, że gdy działanie unieważniające pamięć podręczną zostanie wykonane, system nie próbuje przywrócić pamięci. Unieważnienie utrzymuje się do końca sesji.
Praktyczne implikacje dla codziennych użytkowników:
- Zmiana kolejności sekcji w pliku CLAUDE.md unieważnia pamięć podręczną
- Przełączanie rozszerzonego myślenia w trakcie sesji unieważnia pamięć podręczną
- Zmiana konfiguracji serwera MCP unieważnia pamięć podręczną
- Dodanie lub usunięcie plików z regułami unieważnia pamięć podręczną
14 wektorów wyjaśnia wzorzec, który zauważyło wielu zaawansowanych użytkowników: sesje, które zaczynają się szybko, stopniowo zwalniają. Każda zmiana konfiguracji kumuluje unieważnienia pamięci podręcznej. Konstrukcja „trwałego zatrzasku” oznacza, że nie da się odzyskać pamięci poprzez cofnięcie zmiany. Raz unieważniona, pamięć podręczna pozostaje unieważniona do końca sesji.
Najlepsza praktyka: Warto skonfigurować plik CLAUDE.md, pliki z regułami oraz konfigurację MCP przed rozpoczęciem sesji. Nie należy modyfikować ich w trakcie sesji.
7. Wyłącznik bezpieczeństwa autokompaktowania
Komentarz w kodzie źródłowym dokumentuje skalę poprzedniego problemu:1
„1279 sesji miało ponad 50 kolejnych niepowodzeń autokompaktowania (do 3272 w jednej sesji), marnując około 250 tysięcy wywołań API dziennie.”
Rozwiązanie: MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3. Po 3 kolejnych niepowodzeniach kompaktowania system zatrzymuje autokompaktowanie i ujawnia błąd zamiast po cichu spalać tokeny.
Przed wprowadzeniem wyłącznika bezpieczeństwa sesja utknięta w pętli kompaktowania ponawiała próby w nieskończoność, a każda próba zużywała tokeny na prompt kompaktowania i odpowiedź. W skali 250 tysięcy zmarnowanych wywołań API dziennie stanowi znaczący koszt infrastruktury. Naprawa to trzylinijkowa zmiana, która oszczędza miliony tokenów dziennie.
W przypadku napotkania powtarzających się błędów „kompaktowanie nie powiodło się” wyłącznik bezpieczeństwa chroni Pana/Panią przed nieskończoną pętlą — nie działa wadliwie.
8. Tryb koordynatora: prompty jako architektura
Koordynacja wielu agentów (coordinatorMode.ts) istnieje wyłącznie w instrukcjach promptu systemowego, a nie w orkiestracji na poziomie kodu.3 Model orkiestrujący otrzymuje prompt opisujący, jak delegować, agregować i syntezować. Agenci podrzędni nie są specjalnymi procesami. Stanowią instancje Claude z różnymi promptami systemowymi.
Konstrukcja ta potwierdza wzorzec „prompty jako architektura”, który praktycy zbudowali niezależnie. System hooków opisany w Anatomy of a Claw wykorzystuje to samo podejście: dyspozytory, umiejętności i agenci działają poprzez instrukcje w promptach, a nie poprzez kontrolę przepływu na poziomie kodu.
Jedna z dyrektyw z promptu koordynatora wyróżnia się szczególnie:
„Nigdy nie pisz »na podstawie twoich ustaleń« — te zwroty delegują zrozumienie do pracowników zamiast wykonywać je samodzielnie.”
Dyrektywa pełni funkcję bramki jakości zakodowanej w prompcie orkiestracji. Koordynator musi syntezować, a nie pośredniczyć. Ta sama zasada odnosi się do każdego systemu wieloagentowego: jeżeli orkiestrator jedynie przekazuje wiadomości między specjalistami, nie wnosi wartości.
9. KAIROS: niewydany agent autonomiczny
Kod źródłowy zawiera odniesienia do niewydanej funkcji o nazwie KAIROS — autonomicznego agenta z trwałą pamięcią.1
Kluczowe komponenty:
- Umiejętność /dream do nocnej destylacji pamięci
- Codzienne logi typu append-only
- Webhooki GitHub dla kontekstu świadomego repozytorium
- Demon w tle z odświeżaniem cron co 5 minut
- Bramki funkcji uniemożliwiające aktywację
KAIROS wydaje się być odpowiedzią Anthropic na trwałych, zawsze aktywnych asystentów-agentów. Umiejętność /dream jest szczególnie interesująca, ponieważ implikuje model, który przetwarza i konsoliduje pamięć podczas bezczynności, podobnie jak ludzka konsolidacja pamięci podczas snu.
Bramki funkcji uniemożliwiają aktywację, a Anthropic nie wydał KAIROS. Jednak jego obecność w kodzie źródłowym sygnalizuje kierunek: Claude Code ewoluuje od narzędzia opartego na sesjach w stronę trwałego, świadomego tła agenta.
10. System zwierzaków-towarzyszy
Jedno z bardziej zaskakujących odkryć: Claude Code zawiera system zwierzaków-towarzyszy.1
Każdy zwierzak jest deterministyczny, wyprowadzany z hasha identyfikatora użytkownika za pomocą algorytmu Mulberry32, opisanego w kodzie źródłowym jako „wystarczająco dobry do wybierania kaczek”. Każdy zwierzak ma 5 statystyk (DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK) oraz poziom rzadkości:
| Rzadkość | Prawdopodobieństwo |
|---|---|
| Common | 60% |
| Uncommon | 25% |
| Rare | 10% |
| Epic | 4% |
| Legendary | 1% |
System renderuje zwierzaki jako sprite’y ASCII 5x12 z 3-klatkowymi animacjami. Kod źródłowy koduje szesnastkowo kryptonimy gatunków, ponieważ jeden koliduje z nazwą niewydanego modelu.
System towarzyszy nie jest funkcją żartobliwą. Stanowi mechanikę retencji. Deterministyczne przypisanie oznacza, że zwierzak jest zawsze ten sam, co buduje przywiązanie. System rzadkości tworzy walutę społeczną. Renderowanie ASCII oznacza zerowy narzut wydajnościowy. Anthropic zbudował dobrze zaprojektowany system zaangażowania i ukrył go wewnątrz narzędzia dla developerów.
11. Bomba forkująca
Incydent społecznościowy ilustruje ryzyko związane z systemem hooków.5 Developer stworzył hook SessionStart, który spawnował 2 instancje Claude Code. Każda spawnowana instancja ponownie wyzwalała hook, tworząc wykładniczy wzrost: 1 → 2 → 4 → 8 → 16 → 2^N.
Do rana setki instancji Claude Code działały jednocześnie. System uniknął ogromnego rachunku za API dzięki ironicznemu mechanizmowi: zużycie pamięci każdej instancji (Bun, React, TUI) spowodowało zablokowanie maszyny, zanim rozliczenia zdążyły się wymknąć spod kontroli.
Lekcja dla budujących hooki: hooki SessionStart muszą być idempotentne. Jeżeli hook spawnuje procesy, te procesy nie mogą wyzwalać tego samego hooka. Zmienna strażnika, plik PID lub flaga środowiskowa zapobiegają rekursji.
Co to oznacza
Wyciek kodu źródłowego potwierdził to, co praktycy wywnioskowali z obserwacji zachowań: Claude Code nie jest cienką nakładką wokół wywołania API. Stanowi rozbudowany system inżynierski z warstwami bezpieczeństwa, optymalizacjami wydajności, dostosowaniami behawioralnymi oraz niewydanymi funkcjami sygnalizującymi mapę produktową.
Dla budujących kluczowe implikacje pojawiają się w sekcji Under the Hood przewodnika. Dla wszystkich pozostałych wyciek kodu źródłowego daje rzadką możliwość wglądu w to, jak naprawdę działa produkcyjne narzędzie AI — nie tak, jak opisuje to marketing, lecz tak, jak implementuje to kod.
Najważniejszy wniosek jest też najprostszy: system jest bardziej złożony, niż się wydaje, a złożoność ta istnieje z powodu. 23 kontrole bezpieczeństwa bash istnieją, ponieważ odkryto 23 wektory ataku. Wyłącznik bezpieczeństwa autokompaktowania istnieje, ponieważ 250 tysięcy wywołań API marnowano dziennie. Moduł undercover istnieje, ponieważ kryptonimy wyciekają. Za każdą linią kodu obronnego stoi konkretna historia.
Źródła
Często zadawane pytania
Czy kod źródłowy Claude Code jest nadal dostępny?
Nie. Anthropic wycofał wersję pakietu npm, której to dotyczyło, krótko po odkryciu map źródłowych. Analiza w tym artykule opiera się na społecznościowej dokumentacji kodu źródłowego sprzed jego usunięcia.
Czy wyciek kodu źródłowego wpływa na bezpieczeństwo Claude Code?
Wnioski istotne z punktu widzenia bezpieczeństwa (walidacja bash, system uprawnień) opisują mechanizmy obronne, a nie podatności. Znajomość działania kontroli bezpieczeństwa bash nie ułatwia ich obejścia, ponieważ kontrole te są deterministyczne, a nie zależne od ukrycia.
Czy powinienem/powinnam zmienić sposób korzystania z Claude Code na podstawie tych wniosków?
Najbardziej możliwym do zastosowania wnioskiem jest kruchość pamięci podręcznej promptów. Modyfikowanie pliku CLAUDE.md, plików z regułami lub konfiguracji MCP w trakcie sesji unieważnia pamięć podręczną promptów. Warto skonfigurować ustawienia przed rozpoczęciem sesji.
Czym jest KAIROS?
To niewydana funkcja autonomicznego agenta znaleziona w kodzie źródłowym. Obejmuje trwałą pamięć, nocną destylację oraz przetwarzanie w tle. Jest objęta bramką funkcji i niedostępna dla użytkowników.
-
Claude Code Source Analysis: Bun Source Map Leak. Marzec 2026. Pełny czytelny kod źródłowy ujawniony za pośrednictwem plików
.mapw pakiecie npm z powodu znanego błędu kompilacji Bun. ↩↩↩↩↩↩↩↩↩↩ -
Anatomy of a Claw: 84 Hooks as an Orchestration Layer. Blake Crosley, luty 2026. ↩
-
Claude Code Source Deep Dive: Architecture Internals. Marzec 2026. Analiza techniczna trybu koordynatora, wykrywania pamięci podręcznej promptów oraz mechanizmów obronnych przed dystylacją. ↩↩↩
-
Claude Code Auto Mode Documentation. Architektura trybu auto: system uprawnień oparty na klasyfikatorze, progi wyłącznika bezpieczeństwa. ↩
-
Claude Code Fork Bomb Incident. Marzec 2026. Wykładnicze spawnowanie hooka SessionStart, uratowane wyczerpaniem pamięci. ↩