Aktualności, narzędzia i prawo AIPolska · codziennie
Narzędzia

Claude Code zapisuje hasła w pliku, który trafia na GitHub

Zatwierdzone na stałe polecenia z hasłami lądują w pliku .claude/settings.local.json, a ten trafia do publicznych repozytoriów. Podpowiadamy, jak to wykryć.

Programista w szarej bluzie z kluczem sprzętowym w dłoni patrzy w laptopa, a starsza koleżanka w okularach wskazuje coś na ekranie w ceglanym biurze z widokiem na wieże miasta
Ilustracja redakcyjna dailyAI

Firma Apiiro opisała 5 listopada 2026 roku 2539 haseł, kluczy i tokenów w 1994 publicznych repozytoriach GitHub, które zapisał tam mechanizm uprawnień Claude Code. Gdy użytkownik wybiera opcję „Yes, and don't ask again”, narzędzie zapisuje całe zatwierdzone polecenie, razem z hasłem, w pliku .claude/settings.local.json w folderze projektu. Plik ma zostać na komputerze, ale w ponad tysiącu przypadków trafił do publicznego kodu. Osoby używające Claude Code powinny przejrzeć ten plik i jego historię w Git, a znalezione dane dostępowe od razu wymienić.

Jak hasło trafia do pliku settings.local.json

Claude Code pyta o zgodę przed uruchomieniem polecenia w terminalu. Jeśli użytkownik wybierze „Yes, and don't ask again”, narzędzie zapisuje regułę allow, czyli stałe zezwolenie, w pliku .claude/settings.local.json. Dokumentacja Anthropic potwierdza, że reguła trafia właśnie tam, a według Apiiro jej treścią jest dosłowny tekst polecenia.

Problem pojawia się wtedy, gdy polecenie zawiera dane dostępowe. Prośba o sprawdzenie bazy na serwerze testowym kończy się zwykle poleceniem z hasłem wpisanym po PGPASSWORD= albo mysql -p, bo bez niego polecenie nie zadziała. Po zatwierdzeniu na stałe hasło zostaje w pliku zwykłym tekstem, także długo po zakończeniu pracy.

Apiiro podkreśla, że to zachowanie samego narzędzia, a nie konkretnego modelu. Badacze odtworzyli je na modelach Opus 5.5 i Fable 5.1. Według zestawienia firmy spośród 16 porównanych agentów programistycznych tylko Claude Code domyślnie zapisuje pełne zatwierdzone polecenie w pliku projektu.

Skala wycieku w liczbach

Dane zebrano od 1 do 3 listopada 2026 roku przez wyszukiwarkę kodu GitHub, wyłącznie w trybie odczytu. Badacze nie używali znalezionych danych i nie łączyli się z serwerami, więc „prawdziwy sekret” oznacza poprawny format klucza albo hasło przy publicznym adresie serwera, a nie potwierdzony aktywny dostęp.

  • 104 185 kopii pliku w 103 617 repozytoriach, z czego 1122 pliki z 1379 różnymi sekretami.
  • 636 kluczy w formacie znanych dostawców oraz 743 hasła i tokeny przypisane do publicznych serwerów.
  • 379 haseł do baz danych, 122 klucze service-role i 103 tokeny kont Supabase, 43 dane logowania SSH, 23 klucze AWS i 6 kluczy prywatnych.
  • Mediana wieku pliku z sekretem to 217 dni od pierwszego commita do 2 listopada, a w 118 repozytoriach ponad rok.
  • Po doliczeniu historii Git, wspólnych plików settings.json i zapisów rozmów z agentami łącznie 2539 sekretów w 1994 repozytoriach.

Dlaczego automatyczne wykluczenie z Git nie wystarcza

Anthropic opisuje w dokumentacji zabezpieczenie, które ma temu zapobiegać. Gdy Claude Code pierwszy raz zapisuje plik w repozytorium Git, dodaje wpis **/.claude/settings.local.json do globalnej listy wykluczeń użytkownika. Plik utworzony ręcznie trzeba według dokumentacji samodzielnie dopisać do .gitignore.

Apiiro wskazuje trzy luki w tym rozwiązaniu. Wykluczenie nie obejmuje folderu, który stał się repozytorium później, kopii projektu na innym komputerze ani pliku już zatwierdzonego w Git. Reguła nie trafia też do .gitignore samego projektu, więc nie chroni innych osób z zespołu.

Według badaczy w 539 z 1105 prześledzonych repozytoriów z sekretem plik zmienił commit współtworzony przez Claude. Użytkownicy zgłaszali ten mechanizm w repozytorium Claude Code od sierpnia 2025 roku, a Apiiro pisze, że żadne z czterech zgłoszeń nie dostało odpowiedzi Anthropic. Do 7 listopada nie znaleźliśmy komunikatu Anthropic w tej sprawie.

Czego nie wykrywają skanery sekretów

Popularne skanery szukają ciągów o rozpoznawalnym formacie, na przykład kluczy z prefiksem dostawcy. Hasło wpisane po sshpass -p albo w nagłówku zapytania curl wygląda dla nich jak zwykłe słowo w poleceniu. Dlatego gitleaks oznaczył 564, a TruffleHog 643 z 1122 plików z sekretem.

Ten sam wzorzec pojawia się w innych plikach, które zapisują agenci AI. Apiiro znalazło sekrety w 298 z 76 011 wspólnych plików .claude/settings.json, w 120 zapisach rozmów z agentami, w plikach pamięci typu MEMORY.md i w notatkach wdrożeniowych. Na Hugging Face Spaces plik lokalnych ustawień Claude Code wystąpił w 126 z 31 053 przestrzeni.

Ryzyko nie kończy się na GitHubie. Plik leży zwykłym tekstem na każdym komputerze, na którym ktoś zatwierdzał polecenia na stałe. Badacze przypominają, że robak Shai-Hulud z września 2025 roku uruchamiał TruffleHog na plikach ofiar, a plik może też wyjść poza komputer w paczce npm, obrazie Docker albo archiwum.

Czego nie wiadomo

Nie wiadomo, ile ujawnionych danych nadal działa ani czy ktoś je wykorzystał. Apiiro powiadomiło 63 organizacje 2 i 3 listopada, a potwierdzenie aktywnego klucza dostało od jednej. Wśród przypadków firma wymienia hasło właściciela bazy aplikacji z dokumentacją medyczną i produkcyjny token płatności Square, bez podawania nazw.

Wyniki pochodzą z badania firmy sprzedającej narzędzia bezpieczeństwa, a klasyfikację wątpliwych wartości wsparł model językowy oceniający je według spisanych kryteriów. Liczby dotyczą tylko publicznych repozytoriów i domyślnych gałęzi, więc skala w prywatnych projektach i na komputerach pozostaje nieznana. Badanie nie wymienia polskich organizacji.

Co to oznacza dla polskich zespołów

Supabase i PostgreSQL są często wybierane przez małe software house’y i startupy, także w Polsce, a właśnie hasła do baz dominują w wynikach. Hasło do bazy z danymi klientów w publicznym repozytorium może oznaczać naruszenie ochrony danych osobowych. Czy dany przypadek wymaga zgłoszenia do UODO, ocenia administrator danych z inspektorem ochrony danych, a ten tekst nie jest poradą prawną.

W naszej ocenie to kolejny przypadek, w którym wygoda pracy z agentem AI przenosi dane tam, gdzie nikt ich nie planował. W tym tygodniu opisywaliśmy już adres e-mail wpisywany przez Claude Code do nagłówka zapytań. Zespoły, które wdrażają agentów programistycznych, powinny traktować folder .claude tak jak plik .env.

Jak sprawdzić repozytorium i komputer krok po kroku

Kolejność ma znaczenie, bo usunięcie pliku nie unieważnia danych, które ktoś mógł już skopiować. Pierwsze trzy kroki zajmą kilka minut.

  1. Wyszukaj w organizacji na GitHubie pliki .claude/settings.local.json i .claude/settings.json. Każde trafienie w publicznym repozytorium jest dostępne dla wszystkich.
  2. Otwórz lokalne kopie pliku i przejrzyj listę allow. Szukaj haseł, tokenów, kluczy i adresów połączeń z bazą.
  3. Wymień każde znalezione hasło i klucz, zanim zaczniesz porządki w repozytorium. Historia Git, forki i klony nadal je zawierają.
  4. Przestań śledzić plik poleceniem git rm --cached .claude/settings.local.json i dopisz go do .gitignore projektu. Sama globalna lista wykluczeń nie chroni reszty zespołu.
  5. Sprawdź historię repozytorium, zapisy rozmów z agentami i pliki pamięci. Do skanowania w CI dodaj reguły wykrywające hasła po PGPASSWORD=, sshpass -p i mysql -p.
  6. Na przyszłość przechowuj dane w menedżerze sekretów i odwołuj się do zmiennych, a na stałe zatwierdzaj wzorce poleceń zamiast poleceń z konkretnymi wartościami.

Źródła i data sprawdzenia

  1. Coding Agents Are Leaking Your Secrets to GitHubApiiro, publikacja: 2026-11-05, sprawdzono: 2026-11-07
  2. Settings files and precedenceAnthropic, dokumentacja Claude Code, publikacja: 2026-11-07, sprawdzono: 2026-11-07
  3. Claude Code approval files found exposing company secrets on GitHub, says Apirro researchersiTWire, publikacja: 2026-11-07, sprawdzono: 2026-11-07
  4. Claude Code's "Don't Ask Again" Feature Exposes 2,539 Secrets Across 1,994 GitHub RepositoriesGBHackers, publikacja: 2026-11-07, sprawdzono: 2026-11-07
Nota redakcyjna

Artykuł ma charakter informacyjny. Przy decyzjach prawnych, finansowych lub organizacyjnych warto zweryfikować wnioski w odniesieniu do konkretnej sytuacji.