Prompt nie chronił. Sandbox pękał. Teraz upadła ostatnia bariera — bo okno, w którym zatwierdzasz działanie agenta, pokazuje co innego, niż agent naprawdę robi.

lip 11, 2026 | Cyberflux

Od miesięcy powtarzaliśmy jedno zdanie, coraz węższe. Gdy Agentjacking pokazał, że zabezpieczenia w promptcie nie działają, napisaliśmy, że jedyną twardą barierą jest to, czego agent nie może zrobić technicznie. Gdy DuneSlide pokazał, że agent potrafi nadpisać własny sandbox, przesunęliśmy tę barierę jeszcze dalej — do momentu, w którym człowiek zatwierdza działanie. To był ostatni bastion: cokolwiek by agent nie zrobił, na końcu jest okno dialogowe, w którym człowiek mówi „tak, wykonaj". Human-in-the-loop. Sieć bezpieczeństwa, która miała trzymać, gdy wszystko inne zawiedzie.

8 lipca firma Wiz pokazała, że i ta bariera jest fikcją. Nie dlatego, że człowieka da się ominąć — dlatego, że okno, w którym człowiek zatwierdza, kłamie. Pokazuje niewinną nazwę pliku, podczas gdy agent w tym samym momencie zapisuje klucz atakującego w twoim pliku logowania SSH. Człowiek klika „zatwierdź", przekonany, że pozwala na drobną edycję konfiguracji — i oddaje napastnikowi bezhasłowy dostęp do swojej maszyny. Technika nazywa się GhostApproval i działa przeciwko sześciu najpopularniejszym asystentom kodującym naraz: Claude Code, Amazon Q, Cursorowi, Google Antigravity, Augment i Windsurfowi.

Jak okno zgody zamienia się w pułapkę

Mechanizm jest, co znamienne, prastary — i dlatego tak pouczający. Nie ma tu żadnej nowej, egzotycznej luki w AI. Jest technika sprzed dekad, obrócona przeciwko najnowszemu narzędziu.

Atakujący przygotowuje złośliwe repozytorium. W środku umieszcza dowiązanie symboliczne — symlink — czyli plik, który wygląda jak zwykły plik, ale w rzeczywistości jest wskaźnikiem prowadzącym gdzie indziej. Nazywa go niewinnie, na przykład project_settings.json, ale kieruje go na plik ~/.ssh/authorized_keys — czyli listę kluczy uprawniających do logowania na maszynę bez hasła. W pliku README repozytorium zostawia instrukcję: „dodaj tę linijkę do project_settings.json", a tą linijką jest klucz SSH atakującego, przebrany za nieszkodliwe ustawienie.

Teraz deweloper klonuje repozytorium i robi rzecz najzupełniej zwyczajną — prosi swojego asystenta AI: „skonfiguruj mi projekt" albo „wykonaj, co jest w README". Agent czyta instrukcję i zabiera się do zapisu. Ponieważ project_settings.jsonjest w rzeczywistości dowiązaniem, zapis nie trafia do żadnego pliku konfiguracyjnego — przechodzi przez symlink prosto do ~/.ssh/authorized_keys. Od tej chwili atakujący, jeśli tylko maszyna wystawia usługę SSH, loguje się na nią bez hasła. Wariant drugi kieruje symlink na plik startowy powłoki, ~/.zshrc, który system wykonuje przy następnym otwarciu terminala — i wtedy SSH nie jest już nawet potrzebne.

Symlink to technika, którą nadużywano w wyścigach, menedżerach pakietów i ucieczkach z kontenerów od początków Uniksa. Sam w sobie nie jest niczym nowym. Nowy jest cel: agent AI, który podąża za dowiązaniem, nie sprawdziwszy, dokąd ono naprawdę prowadzi.

Sedno: agent wie, że cel jest niebezpieczny — i pokazuje ci niewinną nazwę

I tu dochodzimy do rzeczy, która czyni GhostApproval czymś więcej niż tylko odgrzaną sztuczką z symlinkami. Bo większość tych sześciu narzędzi ma dokładnie to zabezpieczenie, które powinno taki atak zatrzymać: okno dialogowe, które przechwytuje zapis i pyta użytkownika o zgodę. Teoretycznie to jest właśnie ta sieć bezpieczeństwa człowieka w pętli. Zapis nie następuje, dopóki człowiek nie kliknie „akceptuj".

Problem w tym, co to okno pokazuje. Wiz przetestował Claude Code i odkrył coś, co jest sednem całej sprawy: agent w swoim własnym rozumowaniu poprawnie rozpoznał, że project_settings.json jest w rzeczywistości — cytując jego własne słowa — „plikiem konfiguracyjnym zsh". Wiedział, że cel nie jest tym, na co wygląda. A mimo to okno dialogowe pokazane człowiekowi pytało po prostu: „wykonać tę edycję pliku project_settings.json?". Agent widział prawdziwy cel. Człowiek — nie.

To jest rozjazd, który zamienia zgodę w rytuał bez treści. Świadoma zgoda wymaga prawdziwej informacji — a jeśli okno pokazuje project_settings.json, podczas gdy zapis idzie do ~/.ssh/authorized_keys, człowiek nie podejmuje żadnej sensownej decyzji bezpieczeństwa. Klika „tak" na coś, czego nie widzi. Wiz nazywa to wprost: mechanizm człowieka w pętli, który miał być ostatnią linią obrony, daje się systematycznie obejść — nie przez usunięcie człowieka, lecz przez pokazanie mu fałszywego obrazu tego, na co się zgadza. Okno dialogowe, które miało być bramą, staje się pieczątką przystawianą w ciemno.

Najgorszy wariant pokazał Windsurf, gdzie nawet ta pieczątka jest spóźniona: narzędzie zapisuje zmiany na dysk, zanim w ogóle pojawią się przyciski „akceptuj/odrzuć". Okno zgody nie jest tam bramą — jest przyciskiem „cofnij". W chwili, gdy widzisz pytanie, czy zaakceptować zmiany, klucz atakującego jest już w twoim pliku logowania.

Spór, który jest ważniejszy niż sama luka

Tu historia robi się naprawdę interesująca — i wymaga uczciwości wobec obu stron, bo dotyka pytania, na które branża nie ma jeszcze odpowiedzi.

Z sześciu producentów pięciu potraktowało zgłoszenie jako problem do naprawienia. Amazon, Google i Cursor wydali łatki i przypisali numery CVE. Ale Anthropic, jako jedyny, zakwestionował, że to w ogóle jest luka. Stanowisko firmy jest spójne i warto je oddać rzetelnie: użytkownik, rozpoczynając sesję, świadomie zaufał katalogowi, a potem świadomie zatwierdził operację w oknie dialogowym. Jeśli oba te momenty zgody zostały uszanowane, to — argumentuje Anthropic — problem leży w ocenie sytuacji przez użytkownika, nie w zachowaniu narzędzia. Firma dodała, że ostrzeżenie o symlinkach trafiło do Claude Code już 5 lutego, dziewięć dni przed zgłoszeniem Wiz, jako element rutynowego utwardzania bezpieczeństwa. Rzecznik ujął architektoniczną granicę wprost: żadna łatka nie oddzieli zdolności agenta do edytowania i uruchamiania kodu od jego dostępu do systemu plików — taka jest natura tego narzędzia. Deweloper, który każe agentowi pracować z niezaufanym kodem, bierze za to współodpowiedzialność, tak samo jak gdyby sam ten kod uruchomił.

To nie jest wykręt. To jest spójne stanowisko, które ma za sobą realny argument: agent kodujący z definicji musi mieć dostęp do plików i umieć wykonywać kod, bo bez tego jest bezużyteczny. Nie da się „załatać" tego, że narzędzie do edycji plików edytuje pliki.

Ale jest kontrargument, i też jest mocny — postawił go Wiz, a stoją za nim czynem Amazon, Google i Cursor, które uznały to za lukę i naprawiły. Brzmi tak: świadoma zgoda wymaga dokładnej informacji. Jeśli okno pokazuje project_settings.json, a faktycznym celem jest ~/.ssh/authorized_keys, to użytkownik nie może podjąć znaczącej decyzji — bo zgadza się na coś, czego mu nie pokazano. W tym ujęciu problemem nie jest to, że agent ma dostęp do plików. Problemem jest to, że okno zgody wyświetla nieprawdę. A skoro agent w swoim rozumowaniu znał prawdziwy cel, to mógł go pokazać — i nie pokazał.

Nie rozstrzygniemy tego sporu, bo to jest realne, otwarte pytanie o granicę odpowiedzialności między narzędziem a użytkownikiem — pytanie, które branża AI dopiero zaczyna sobie zadawać. Warto tylko zauważyć jedną rzecz: to nie jest przypadek, że akurat producenci przyjęli różne stanowiska. Firma, która widzi w tym lukę, pyta „co narzędzie mogło pokazać lepiej". Firma, która widzi w tym decyzję użytkownika, pyta „gdzie kończy się nasza odpowiedzialność, a zaczyna twoja". Oba pytania są zasadne, i prawdopodobnie odpowiedź leży gdzieś pomiędzy — ale dopóki jej nie ma, każdy deweloper używający tych narzędzi żyje z konsekwencjami tej nierozstrzygniętej granicy.

Uczciwie: co to jest, a czego nie jest

Trzymajmy dyscyplinę, żeby nie zrobić z tego paniki. GhostApproval nie był wykorzystany w żadnym realnym ataku — Wiz przedstawia go jako badanie, z działającym dowodem koncepcji, nie jako kampanię w toku. Trzech z sześciu producentów już naprawiło problem (Amazon w wersji serwera językowego 1.69.0, Cursor w 3.0 jako CVE-2026-50549, Google w Antigravity 1.19.6). Atak wymaga też czynnego udziału ofiary — nie wystarczy otworzyć repozytorium; trzeba jeszcze poprosić agenta, żeby wykonał złośliwą instrukcję. To nie jest zero-click.

Ale dwie rzeczy nie pozwalają odetchnąć z ulgą. Pierwsza: dwaj producenci — Augment i Windsurf — w chwili publikacji wciąż nie wydali poprawki, a jeden z nich, jak Anthropic, uważa, że nie ma czego poprawiać. Druga, ważniejsza: to nie jest błąd jednego narzędzia, który akurat powtórzył się gdzie indziej. Wiz nazywa to „ślepą plamką na poziomie całej kategorii", a niezależnie, miesiąc wcześniej, badacze Adversa AI opisali tę samą technikę pod nazwą SymJacking, testując ją z powodzeniem na kolejnych narzędziach — Gemini CLI, GitHub Copilot CLI, Grok, Codex. Gdy ta sama luka pojawia się niezależnie u ośmiu czy dziesięciu producentów, to nie jest przypadek. To jest właściwość projektu całej kategorii narzędzi.

Co z tego wynika dla obrońcy

Pierwszy wniosek jest praktyczny. Jeśli używasz asystenta kodującego — a według jednego z badań robi to 81 procent deweloperów, blisko połowa codziennie — sprawdź, czy twój ma najnowszą wersję, i wiedz, którego producenta używasz, bo nie wszyscy naprawili problem. Do czasu poprawki obowiązuje stara, niemodna zasada, która nagle wróciła do łask: nie każ agentowi wykonywać instrukcji z repozytorium, któremu nie ufasz, tak samo jak nie uruchomiłbyś ręcznie cudzego skryptu, nie zajrzawszy do niego. Zaufanie do repozytorium jest teraz decyzją bezpieczeństwa, nie wygodą.

Drugi jest architektoniczny i to on jest sednem. GhostApproval pokazuje, że okno zgody agenta trzeba traktować jako element bezpieczeństwa pierwszej klasy — a nie jako formalność. Jeśli budujesz albo wybierasz narzędzie agentowe, pytanie nie brzmi już „czy ma potwierdzenie od człowieka", bo samo istnienie okna niczego nie gwarantuje. Pytanie brzmi: „czy to okno pokazuje prawdę — rozwiązaną, kanoniczną ścieżkę tego, co naprawdę zostanie zapisane, wyraźnie oznaczając zapis poza obszarem projektu". Zalecenia Wiz są tu proste i trafne: rozwiązuj symlinki przed pokazaniem okna, ostrzegaj wyraźnie, gdy zapis wychodzi poza katalog roboczy, i nigdy nie zapisuj na dysk przed uzyskaniem zgody. Zapis do ~/.ssh/authorized_keys powinien wyglądać zupełnie inaczej niż edycja ./config.json.

Trzeci jest najszerszy i domyka linię, którą prowadzimy od miesięcy. Przenosiliśmy obronę coraz dalej — z promptu do sandboxa, z sandboxa do zgody człowieka — w nadziei, że gdzieś jest warstwa, która wytrzyma. GhostApproval pokazuje, że sama zgoda człowieka nie jest tą warstwą, jeśli człowiekowi pokazuje się fałszywy obraz. Bo człowiek w pętli chroni tylko wtedy, gdy widzi to samo, co widzi agent. W chwili, gdy agent wie więcej niż ty — zna prawdziwy cel, którego ci nie pokazuje — pętla się rozrywa, a twoja zgoda staje się podpisem złożonym w ciemno. Ostateczną barierą nie jest obecność człowieka. Jest równość informacji między człowiekiem a maszyną. A tej równości, jak się okazało, żadne z sześciu narzędzi domyślnie nie gwarantowało.

Jedna myśl na koniec

Przez cały ten rok pocieszaliśmy się, że choćby agent zrobił nie wiadomo co, na końcu jest człowiek, który mówi „tak" albo „nie". GhostApproval odbiera to pocieszenie w najprostszy możliwy sposób: nie usuwa człowieka, tylko okłamuje go w momencie, gdy podejmuje decyzję. To jest groźniejsze niż atak, który omija zgodę, bo tamten przynajmniej widać. Tu wszystko wygląda poprawnie — jest repozytorium, jest agent, jest okno z pytaniem, jest świadome kliknięcie „zatwierdź". Każdy element układanki jest na swoim miejscu, a mimo to na końcu klucz atakującego ląduje w twoim pliku logowania. Bezpieczeństwo agenta nie zależy od tego, czy pytamy człowieka o zgodę. Zależy od tego, czy pokazujemy mu prawdę, gdy pytamy. Zgoda udzielona na podstawie fałszywego obrazu nie jest zabezpieczeniem. Jest tylko ładniejszą wersją jego braku.

Źródła

Wiz — oryginalne ujawnienie GhostApproval, z opisem mechanizmu symlinka, kluczową obserwacją o rozjeździe między rozumowaniem agenta a oknem dialogowym oraz pełnym stanowiskiem sześciu producentów i odpowiedzią Anthropic: https://www.wiz.io/blog/ghostapproval-a-trust-boundary-gap-in-ai-coding-assistants

The Hacker News — omówienie z detalami technicznymi (symlink na ~/.ssh/authorized_keys i ~/.zshrc), kontekstem sporu o klasyfikację i powiązaniem z robakiem Miasma: https://thehackernews.com/2026/07/ghostapproval-symlink-flaws-could-let.html

SecurityWeek — analiza z naciskiem na „prastarą technikę wymierzoną w nowe narzędzie", statusem łatek u poszczególnych producentów i powiązaniem CVE z DuneSlide: https://www.securityweek.com/ai-coding-tools-tricked-into-hacking-developer-machine-via-decades-old-technique/

The Register — pełne stanowisko Anthropic o „shared responsibility" i architekturze agenta, oraz cytat o tym, że żadna łatka nie oddzieli edycji kodu od dostępu do plików: https://www.theregister.com/security/2026/07/08/bug-in-top-ai-coding-agents-shows-that-unix-era-security-headaches-never-really-die/

DevOps.com — niezależne odkrycie tej samej techniki przez Adversa AI pod nazwą SymJacking, z listą dodatkowych podatnych narzędzi (Gemini CLI, Copilot CLI, Grok, Codex): https://devops.com/ghostapproval-flaw-featuring-decades-old-feature-found-in-six-ai-coding-tools/