Przejdź do treści
Claude Code 2.1.309–2.1.312: poprawki sandboxa i hooków, a zdarzenie safety_event znika
··10 min czytania

Claude Code 2.1.309–2.1.312: poprawki sandboxa i hooków, a zdarzenie safety_event znika

Cztery wydania Claude Code, 2.1.309, 2.1.310, 2.1.311 i 2.1.312, opublikowane między 22 a 27 października 2026, składają się na jedną większą aktualizację bezpieczeństwa. Naprawiają sandbox, który w kilku miejscach nie trzymał granicy, oraz hooki uprawnień na Windows, które przy braku Git Bash przepuszczały wywołanie narzędzia zamiast je zablokować.

Jest też zmiana, która może po cichu wyłączyć Twoje alerty. Wersja 2.1.307 dodała zdarzenie OpenTelemetry claude_code.safety_event, a 2.1.312 przestaje je wysyłać. Notatki wydania nie podają powodu. Jeśli po poprzednich wydaniach ustawiłeś na nim alarmy, po aktualizacji będą milczeć.

Ten tekst opiera się na notatkach wydań na GitHubie. Wcześniejsze zmiany, w tym wymóg zgody człowieka w hookach modów, opisałem w tekście o wersjach 2.1.304–2.1.306.

W skrócie:

  • Sandbox (2.1.309): pliki startowe powłoki nie wykonują się już poza sandboxem, denyWrite działa przez symlinki, a plik z --mcp-config jest chroniony przed zapisem.
  • Hooki na Windows (2.1.309 i 2.1.310): PreToolUse i PermissionRequest nie przepuszczają już wywołania, gdy brakuje Git Bash.
  • CLAUDE.md (2.1.312): agent nie nadpisze bardzo dużego pliku po przeczytaniu tylko jego początku.
  • safety_event (2.1.312): zdarzenie przestaje być wysyłane. Sprawdź swoje alerty.

Co zmieniły wersje 2.1.309–2.1.312

Strona wydań GitHuba pokazuje dzień i godzinę, ale nie rok, więc rok 2026 wnioskuję z kontekstu. Wybrałem zmiany związane z bezpieczeństwem i niezawodnością. Pełne listy są znacznie dłuższe.

Wersja Data Zmiana
2.1.309 22 października sandbox: polecenia na macOS i Linuksie nie uruchamiają już plików startowych powłoki poza sandboxem
2.1.309 22 października sandbox: wzorce denyWrite na macOS działają także, gdy katalog wzorca jest osiągany przez symlink
2.1.309 22 października sandbox: polecenia i automatycznie zaakceptowane edycje nie mogą zmienić pliku podanego w --mcp-config
2.1.309 22 października Linux: blokady zapisu w sandboxie nie znikają, gdy polecenie w tle przeżyje sesję
2.1.309 22 października Windows: hooki PreToolUse i PermissionRequest z "shell": "powershell" nie przepuszczają wywołania, gdy nie ma Git for Windows
2.1.309 22 października hooki PowerShell blokują wywołanie, gdy program hooka kończy się kodem 2
2.1.309 22 października sed -i dostaje standardowy monit Basha i działa tak, jak napisano
2.1.309 22 października claude ultrareview wymaga zaufania do katalogu roboczego (w skryptach flaga --trust-workspace)
2.1.310 23 października Windows: hooki nie przepuszczają wywołania, gdy brakuje Git Bash, a polecenie hooka to wyłącznie cytowane ciągi, na przykład ścieżka w cudzysłowie
2.1.310 23 października monit o odczyt pliku pokazuje, dokąd prowadzi symlink
2.1.310 23 października Monitor i monitory wtyczek działają na Bedrocku, Vertex i Foundry
2.1.311 26 października Linux: polecenia w sandboxie nie padają z bwrap: Can't create file przy --plugin-dir będącym też dodanym katalogiem i blockReadsOutsideWorkingDirectories
2.1.311 26 października hooki SubagentStop uruchamiają się raz po zakończeniu subagenta, a nie około dwa razy na minutę
2.1.311 26 października worktree subagenta nie jest usuwane, gdy jego potomny agent w tle jeszcze pracuje
2.1.311 26 października subagenci widzą narzędzia MCP z serwerów, które kończą łączenie już po ich starcie
2.1.311 26 października koniec ponawiania żądań, które API oznaczyło jako nieponawialne (w trybie bez nadzoru mogło to trwać w nieskończoność)
2.1.312 27 października Write nie nadpisuje bardzo dużego CLAUDE.md, pliku reguł ani pliku z @ po przeczytaniu tylko początku
2.1.312 27 października claude_code.safety_event przestaje być wysyłane
2.1.312 27 października oidc.user_id_claim w bramce aplikacji Claude: identyfikacja po claimie innym niż sub, na przykład oid z Entra ID
2.1.312 27 października skills katalogowe i paths: są znajdowane po cd w głąb repozytorium
2.1.312 27 października polityki organizacji są pobierane po zalogowaniu z rozszerzenia VS Code

Wersja 2.1.309 ma też wiele mniejszych poprawek uprawnień. Przykłady: polecenia złożone ze zmianą katalogu przed git w owiniętej lub poprzedzonej formie dostają teraz monit jak zwykłe cd, reguła deny na Edit(ścieżka) blokuje przekierowanie Basha do tej ścieżki także w poleceniu z podpowłoką, a na Windows PowerShell nie zatwierdza już automatycznie niektórych poleceń cd z dodatkowymi argumentami.

Sandbox: trzy granice, które nie trzymały

Najpoważniejsze są trzy poprawki z 2.1.309. Opiszę je jako ryzyka, bo tak je należy czytać. Notatki wydania nie podają, czy ktoś te luki wykorzystał.

1. Pliki startowe powłoki poza sandboxem. Na macOS i Linuksie powłoka wykonywała swoje pliki startowe przed każdym poleceniem poza sandboxem. Jeśli ktoś mógł wpisać coś do takiego pliku, miał kod uruchamiany bez ograniczeń. To dokładnie ten rodzaj luki, który ma znaczenie przy nieufnych repozytoriach.

2. denyWrite przez symlink. Wzorzec zakazu zapisu nie działał w prawdziwym miejscu ścieżki, gdy katalog wzorca był osiągany przez symlink. Zakaz, który wygląda na ustawiony, a nie działa, jest gorszy od braku zakazu, bo daje fałszywe poczucie bezpieczeństwa. Powiązana poprawka: ochrona zapisu do magazynu profilu też nie działała, gdy katalog konfiguracji był osiągany przez symlink. W 2.1.310 monit o odczyt zaczął dodatkowo pokazywać, dokąd symlink prowadzi, więc widać, co właściwie zatwierdzasz.

3. Plik z --mcp-config. Polecenia w sandboxie i automatycznie zaakceptowane edycje mogły zmienić plik konfiguracji MCP przekazany we fladze. Kto kontroluje ten plik, kontroluje, jakie serwery i narzędzia dostanie agent.

Czwarta: na Linuksie blokady zapisu w sandboxie znikały, gdy polecenie uruchomione w tle przeżyło sesję.

Do tego zmiana domyślnego zachowania: polecenia wyłączone z sandboxa w ustawieniach pytają teraz o zgodę przed zapisem do ścieżek z listy zapisu, gdy sandbox jest włączony, ale nie może się uruchomić. Powrót do wykonania bez sandboxa jest tam odmówiony. To zgodne z kierunkiem, który opisałem wcześniej: lepiej, żeby polecenie się nie wykonało, niż żeby cicho poszło bez ochrony.

Hooki na Windows, które przepuszczały wywołania

Jeśli traktujesz hooki jako warstwę bezpieczeństwa, ta sekcja jest najważniejsza. Dwa różne przypadki, dwie poprawki:

  • 2.1.309: hooki PreToolUse i PermissionRequest z "shell": "powershell" na Windows otwierały się (fail open), gdy Git for Windows nie był zainstalowany. Czyli hook, który miał zablokować wywołanie, przepuszczał je. Osobno: hooki PowerShell nie blokowały, gdy ich program kończył się kodem 2.
  • 2.1.310: podobna sytuacja, gdy brakowało Git Bash, a polecenie hooka składało się wyłącznie z cytowanych ciągów, na przykład z ścieżki w cudzysłowie.

Wspólny wniosek: hook, który zawodzi cicho i przepuszcza, jest gorszy niż hook, który zawodzi głośno i blokuje. Jak działają hooki i czym różnią się od MCP, skilli i subagentów, opisuje tekst MCP, skill, subagent, hook. Analogiczne zasady w Copilocie omawiam w tekście o hookach w GitHub Copilot, a odpowiednik pytania „kto zatwierdza”, czyli tryb Assisted, w tekście o uprawnieniach i globalnej polityce domyślnej w Copilocie.

Dla organizacji na Windows rada jest praktyczna: zaktualizuj do 2.1.310 lub nowszej i sprawdź w testach, czy hook rzeczywiście blokuje na maszynie bez Git Bash. Nie polegaj na tym, że poprawka działa, bo tego nie mogę potwierdzić w Twoim środowisku.

Zdarzenie safety_event: dodane 21 października, wyłączone 27 października

Wersja 2.1.307 z 21 października dodała zdarzenie claude_code.safety_event. Rejestrowało każde wywołanie narzędzia zatrzymane, zakończone pytaniem o zgodę albo odesłane przez regułę uprawnień, tryb auto, kontrolę bezpieczeństwa, hook lub sandbox. To naturalne źródło alertów o próbach obejścia uprawnień.

Wersja 2.1.312 notuje w swoich zmianach, że Claude Code przestaje wysyłać to zdarzenie. Powodu nie podano.

Co z tego wynika:

  • Jeśli po 2.1.307 skonfigurowałeś alarmy na claude_code.safety_event, po aktualizacji do 2.1.312 przestaną one dostawać dane. Brak alarmów będzie wyglądał jak brak incydentów, a nie jak brak telemetrii.
  • Na poprzednie rady o obserwowaniu tego zdarzenia, w tym punkt 8 w mojej liście dla CI w tekście o 2.1.305, trzeba dziś patrzeć z zastrzeżeniem. Zdarzenie istniało w wersjach od 2.1.307 do 2.1.311.
  • Nie wiem, czy producent planuje zastąpić je czymś innym. Notatki tego nie mówią, więc nie zgaduję.

Co zrobić: sprawdź, czy któryś alert, dashboard lub reguła opiera się na tej nazwie zdarzenia. Jeśli tak, na czas braku następcy oprzyj nadzór na tym, co jest pewne: logach sesji, regułach deny oraz zewnętrznej granicy (kontener, maszyna wirtualna). Alarm, który nie ma jak się uruchomić, nie jest alarmem.

Duże pliki CLAUDE.md: dwie zmiany, jedna po drugiej

W 2.1.309 poprawiono sesje, które w kółko się kompaktowały po przeczytaniu plików pod bardzo dużym zagnieżdżonym CLAUDE.md. Zagnieżdżony CLAUDE.md powyżej limitu rozmiaru ładuje się teraz tylko od początku.

W 2.1.312 poprawiono skutek uboczny w drugą stronę: agent mógł nadpisać bardzo duży CLAUDE.md, plik reguł albo plik dołączony przez @ w podkatalogu, widząc tylko jego początek. Teraz Write prosi Claude’a o przeczytanie całości albo o edycję w miejscu.

To moja interpretacja, nie zapis z notatek: obie zmiany wyglądają na dwie strony tego samego mechanizmu, czyli częściowego ładowania dużych plików. Praktyczny wniosek jest niezależny od przyczyny: jeśli masz rozbudowane instrukcje, zrób kopię lub trzymaj plik w Gicie, a po aktualizacji sprawdź, jak agent zachowuje się na największym pliku z instrukcjami. W 2.1.311 naprawiono jeszcze długie zawieszenia przy starcie, gdy CLAUDE.md zawierał pojedynczą bardzo długą pozycję listy.

Jak utrzymać instrukcje w ryzach, opisuje tekst AGENTS.md: jeden plik instrukcji.

Subagenci i długie sesje (2.1.311)

Wydanie z 26 października to głównie niezawodność:

  • Hooki SubagentStop uruchamiały się około dwa razy na minutę dla każdego działającego subagenta zamiast raz po jego zakończeniu. Jeśli podpiąłeś pod nie logowanie, powiadomienia lub koszty, miałeś zawyżone liczby.
  • Worktree subagenta bywało usuwane, gdy jego własny agent w tle jeszcze w nim pracował.
  • Subagenci nie widzieli narzędzi MCP z serwerów, które kończyły łączenie już po ich starcie.
  • Claude Code ponawiał żądania, które API oznaczyło jako nieponawialne. W trybie bez nadzoru (CLAUDE_CODE_RETRY_WATCHDOG) mogło to trwać w nieskończoność, co przy płatnym API oznacza realny koszt.

Rozbudowane wzorce pracy z subagentami opisuje panel subagentów w modach Claude Code.

Checklista po aktualizacji

  1. Zaktualizuj do 2.1.312 i przypnij wersję w obrazie runnera. To moje zalecenie, nie zapis z notatek.
  2. Windows: sprawdź hook PreToolUse na maszynie bez Git Bash. Oczekiwany wynik to blokada, nie przepuszczenie.
  3. macOS i Linux: przetestuj reguły denyWrite przez ścieżkę z symlinkiem. Upewnij się, że plik przekazany w --mcp-config nie jest zapisywalny dla agenta.
  4. Telemetria: wyszukaj w konfiguracji OTel i w alertach nazwę claude_code.safety_event. Po 2.1.312 nie wyśle ona nic.
  5. Duże CLAUDE.md: zrób test na największym pliku instrukcji i trzymaj go w kontroli wersji.
  6. Nienadzorowane uruchomienia: ustaw --max-turns i --max-budget-usd jako bezpieczniki, bo wcześniejsze ponawianie nieponawialnych żądań mogło generować koszty. Limity planów zestawiłem w tekście o cenach i limitach narzędzi agentowych.
  7. SSO: jeśli używasz bramki aplikacji Claude z Entra ID, nowe oidc.user_id_claim pozwala identyfikować ludzi po oid zamiast po sub.

Najczęstsze pytania

Czy muszę aktualizować Claude Code z 2.1.308? Tak, jeśli pracujesz z nieufnymi repozytoriami, na Windows z hookami albo w trybie auto. Wersja 2.1.309 łata kilka obejść sandboxa. Notatki nie mówią o wykorzystaniu tych luk w praktyce.

Czy hooki na Windows były naprawdę podatne? Notatki opisują dwa przypadki, w których hook PreToolUse lub PermissionRequest przepuszczał wywołanie: przy braku Git for Windows (2.1.309) i przy braku Git Bash z poleceniem złożonym z cytowanych ciągów (2.1.310). Oba są naprawione. Nie wiem, ilu użytkowników to dotknęło.

Czym zastąpić claude_code.safety_event? Notatki wydania nie wskazują następcy. Do czasu wyjaśnienia opieraj nadzór na logach sesji, regułach deny i granicy zewnętrznej.

Co z poleceniem /claude-api api-version? Dodano je w 2.1.307 (21 października) i służy do przenoszenia kodu na wersję API 2026-10-21. Migrację opisałem w tekście o Claude API w wersji 2026-10-21.


Źródła: notatki wydań Claude Code na GitHubie: v2.1.307 (21 października 2026), v2.1.309 (22 października), v2.1.310 (23 października), v2.1.311 (26 października), v2.1.312 (27 października).

Stan na 28 października 2026. Strona wydań nie podaje roku, a powodu wyłączenia safety_event notatki nie wyjaśniają.

EfektywnyDev pisze o AI w praktyce: co zmiana w narzędziu oznacza w codziennej pracy z agentami, a nie tylko w notatkach wydania.

Nowe materiały prosto na maila

Publikuję nowy artykuł albo lekcję kursu — dostajesz jednego maila. Nic poza tym.

Bez cyklu wydawniczego i newsów o każdej premierze modelu

Zapisy do newslettera otwieram partiami, żeby nie zamieniać go w kolejny kanał ze spamem i recyklingiem linków.

Jeśli chcesz dostać informację przy następnym otwarciu zapisów, napisz na [email protected].

UdostępnijX / TwitterLinkedIn
Marcin Szymański

O autorze

Marcin Szymański

Od kilkunastu lat buduję systemy w .NET i Azure — obecnie rozproszony monitoring PingView. Piszę tu o pracy człowiek + agenci AI na realnych workflow, nie na demach. Zawodowo prowadzę audyty, rescue projektów i wdrożenia AI-assisted delivery w zespołach.