Wyciek haseł z Claude Code przez „Yes, and don’t ask again”
Wyciek haseł z Claude Code: opcja „Yes, and don’t ask again” zostawiła sekrety w 1122 publicznych plikach na GitHubie. Sprawdźmy, czy nas to dotyczy.
Ten artykuł w innych językach:العربيةDeutschEnglishEspañolFrançaisItaliano日本語简体中文
W tym artykule
5 listopada badacze Apiiro, Shmulik Cohen i Matan Giladi, opublikowali raport o wycieku haseł z Claude Code na GitHuba. W 104 185 publicznych kopiach pliku .claude/settings.local.json znaleźli 1122 pliki z co najmniej jednym sekretem, czyli łącznie 1379 różnych haseł, kluczy API i tokenów.
Na czym polega wyciek haseł z Claude Code?
Gdy Claude Code pyta o zgodę na komendę w terminalu, możemy wybrać „Yes, and don’t ask again”. Według dokumentacji Claude Code ta zgoda trafia jako reguła allow do pliku .claude/settings.local.json w projekcie.
Problem w tym, że reguła zapisuje całą zatwierdzoną komendę, razem z tym, co w niej wpisaliśmy. Jeśli komenda miała hasło w treści, na przykład PGPASSWORD=… psql … albo curl z kluczem API w nagłówku, to hasło ląduje w pliku jawnym tekstem.
Co ciekawe, to nie jest nowe odkrycie. W sierpniu 2025 roku ktoś zgłosił dokładnie ten problem w zgłoszeniu #5544 (z przykładami kluczy API i tokenów Jiry). Bot zamknął je 3 stycznia 2026 roku po 60 dniach bez aktywności, ze statusem „not planned”, bez poprawki.
Skoro plik jest lokalny, jak trafił na GitHuba?
Plik z założenia jest prywatny. Claude Code przy pierwszym zapisie dodaje **/.claude/settings.local.json do globalnego pliku wykluczeń gita, żeby nie trafił do commitów (tak opisuje to dokumentacja).
Ta ochrona ma jednak kilka dziur:
- Globalne wykluczenie działa tylko na jednym komputerze i nie podróżuje razem z repozytorium.
- Jeśli plik utworzyliśmy ręcznie, Claude Code go nie wyklucza i musimy dopisać go do
.gitignoresami. - Reguły ignorowania nie działają na pliki, które git już śledzi, więc raz scommitowany plik dalej trafia do kolejnych commitów.
- Usunięcie pliku z repozytorium nie usuwa go z historii ani z forków.
Według iTWire w 539 z 1105 prześledzonych repozytoriów plik zmieniały commity, których współautorem był Claude.
Jak duża jest skala?
Liczby z raportu (dane zebrane z publicznego GitHuba 1–3 listopada):
- 104 185 publicznych kopii
settings.local.json, z czego 1122 (około 1,1%) zawierały co najmniej jeden sekret. - W tych plikach było 1379 różnych wartości.
- Po doliczeniu historii gita, współdzielonego pliku
.claude/settings.jsoni zapisanych rozmów z agentem wychodzi 2539 sekretów w 1994 repozytoriach. - Apiiro powiadomiło firmy 2 i 3 listopada, a jedna z nich potwierdziła, że ujawniony klucz był aktywny.
Jedno zastrzeżenie: Apiiro nie sprawdzało, czy znalezione dane logowania działają. Kandydatów odsiało filtrami fałszywych alarmów i oceną modelu językowego, więc część z nich mogła już być nieaktualna.
Dlaczego jest o tym głośno?
Raport trafił w sobotni wieczór na pierwszą stronę Hacker News. Opcja „don’t ask again” służy do tego, żeby agent nie pytał co chwilę o to samo, więc łatwo zapomnieć, co właściwie zostało zapisane.
To też kolejny przykład tego, że sekrety wyciekają dziś nie tylko z kodu aplikacji, ale też z plików konfiguracyjnych agentów (podobnie jak przy wycieku z OpenCode). Na razie w relacjach mediów nie ma odpowiedzi Anthropic.
Na co zwrócić uwagę na przyszłość?
- Najpierw unieważnijmy i wymieńmy każde hasło lub klucz, który kiedykolwiek był w tym pliku w publicznym repozytorium. Dopiero potem sprzątajmy historię.
- Sprawdźmy, czy plik jest śledzony:
git ls-files .claude. Jeśli jest, przestańmy go śledzić (git rm --cached .claude/settings.local.json) i dopiszmy go do.gitignorew samym repozytorium, a nie tylko globalnie. - Przejrzyjmy też historię (
git log --all -- .claude/settings.local.json), współdzielony.claude/settings.jsoni zapisane rozmowy z agentem. - Nie wpisujmy haseł wprost w komendy. Lepiej przekazywać je przez zmienne środowiskowe lub menedżer sekretów, a w regułach
allowużywać wzorców, takich jakBash(npm run test *)z dokumentacji.
Więcej o tym, jak trzymać klucze API z dala od agentów, piszę w poradniku Bezpieczeństwo agentów AI, a podstawy pracy z narzędziem są w poradniku Claude Code.
FAQ
Czy Claude Code sam wysyła moje hasła na GitHuba?
Nie. Plik settings.local.json zostaje na naszym dysku. Wyciek następuje dopiero wtedy, gdy plik trafi do commita i do publicznego repozytorium.
Jak sprawdzić, czy mój plik settings.local.json jest w repozytorium?
Wystarczy git ls-files .claude w katalogu projektu. Jeśli na liście jest settings.local.json, git go śledzi. Warto też zajrzeć do samego pliku i poszukać w regułach allow haseł, tokenów i kluczy.
Czy wystarczy usunąć plik z repozytorium?
Nie. Plik zostaje w historii gita i w forkach, dlatego najważniejsze jest unieważnienie i wymiana ujawnionych danych logowania.