Plugin4Shell: luka w czterech agentach AI

Przez lata branża AI odpowiadała na zagrożenie zatruwania marketplace’ów wtyczek w jeden sposób: każdy dodatek przypinano do konkretnej, zweryfikowanej wersji kodu. Ten mechanizm właśnie przestał działać. Zespół badawczy z Air Security opublikował w czwartek szczegóły podatności nazwanej Plugin4Shell, która dotyczy czterech najczęściej używanych agentów kodujących: Claude Code od Anthropic, Codex od OpenAI, GitHub Copilot oraz Gemini CLI od Google. Jak podkreślają autorzy odkrycia – Nevo, Dor Granat i Niv Hoffman – mowa o zdalnym wykonaniu kodu bez interakcji użytkownika (zero-click remote code execution). Ofiara nie musi zrobić absolutnie nic. Jako pierwsza opisała to Jessica Lyons z The Register.

Na czym polega mechanizm Plugin4Shell

Agent kodujący instaluje rozszerzenia z marketplace’ów. Aby zapewnić bezpieczeństwo, platforma przypisuje każdemu dodatkowi hash commita – ciąg czterdziestu znaków identyfikujący dokładny stan kodu. Logika jest prosta: raz sprawdzony snapshot zostaje przypięty i agent powinien uruchamiać wyłącznie ten zweryfikowany kod. Problem w tym, że agenci proszą o przypięty snapshot, ale nigdy nie sprawdzają, co faktycznie otrzymali.

Git pozwala nadać gałęzi niemal dowolną nazwę – w tym ciąg wyglądający jak hash commita. Gdy dana nazwa jest jednocześnie poprawną gałęzią i obiektem, Git po cichu wybiera gałąź. Wystarczy więc, że osoba kontrolująca repozytorium wtyczki utworzy branch o nazwie odpowiadającej przypiętemu hashowi, wskaże go na inne pliki i ustawi jako domyślny. Agent pobierze gałąź, zainstaluje kod atakującego, a jednocześnie zaraportuje czystą instalację zgodną z pinem.

Osobny przypadek Gemini CLI

Gemini CLI psuje się w inny sposób. Narzędzie pobiera właściwy commit, ale potem wykonuje checkout, który przechwytuje gałąź domyślna o nazwie FETCH_HEAD. Poprawny kod nigdy nie trafia na dysk. Co ciekawe, sama poprawka to jedna linia – po checkoutcie wystarczy sprawdzić, co realnie leży w katalogu roboczym, i przerwać działanie, jeśli zawartość nie zgadza się z pinem.

Dlaczego nikt nie musi klikać

Agenci odświeżają zainstalowane wtyczki w tle. Claude Code i Codex robią to domyślnie. Atak nie wymaga więc instalowania czegokolwiek nowego – podmienia dodatek, któremu deweloper już ufa i który już jest uruchamiany. Air opisuje całą sekwencję krok po kroku:

  • Opublikuj coś naprawdę użytecznego.
  • Przejdź weryfikację i zdobądź użytkowników.
  • Wypuść rutynową aktualizację, żeby marketplace przypiął nowy commit.
  • Utwórz gałąź o nazwie odpowiadającej nowemu pinowi i wypełnij ją złośliwym kodem.

Resztę wykonuje automatyczna aktualizacja po stronie agenta. Wtyczka działa z takimi samymi uprawnieniami jak osoba korzystająca z agenta, więc podmieniony kod sięga do plików, zapisanych poświadczeń i wszystkich systemów, do których użytkownik może się zalogować. W tym samym miesiącu OWASP oznaczył ten problem, przesuwając nadmierne uprawnienia agentów na trzecie miejsce w swoim rankingu na 2026 rok.

Kto naprawił lukę, a kto nie zamierza

Anthropic załatał problem w Claude Code 2.1.179, a OpenAI w Codex 0.146.0. Microsoft nie wydał żadnej poprawki dla Copilota. Google zapowiedział, że Gemini CLI nie zostanie naprawione, ponieważ narzędzie jest wycofywane – użytkownikom wskazuje się Antigravity, którego atak nie dotyczy, bo nie ma w nim pinowania wtyczek do obejścia.

GitHub twierdzi, że jego użytkownicy nie są narażeni, bo platforma odrzuca nazwy gałęzi przypominające hash commitów. Rzecznik firmy powiedział The Register, że to zabezpieczenie blokuje wykorzystanie podatności na GitHubie. Air się z tym nie zgadza. Marketplace’y mogą działać gdzie indziej – choćby na Bitbucket czy na firmowym serwerze git. Oba te środowiska pozwalają na nazwy gałęzi w kształcie hasha, a dokumentacja Anthropic wymienia je jako prawidłowe backendy marketplace’ów. Copilot również obsługuje takie hosty i właśnie tam – zdaniem Air – leży ryzyko. Microsoft nie odpowiedział The Register. To nie pierwszy raz, gdy GitHub kwestionuje ustalenia badaczy dotyczące Copilota. Warto dodać, że według własnych danych Microsoftu około 90% firm z listy Fortune 500 korzysta z Copilota, a to jeden z dwóch agentów bez łatki.

Jak realnie wygląda skala zagrożenia

W praktyce Plugin4Shell jest węższy, niż sugeruje nagłówek o czterech agentach. Swati Khandelwal z The Hacker News sprawdziła 18 września marketplace’y dostarczane razem z agentami i ustaliła, że każda wtyczka w katalogu społeczności Anthropic oraz w domyślnych katalogach Claude Code i Copilot wskazuje na repozytorium GitHub. Obie części ataku też się rozdzielają.

Automatyczna aktualizacja w tle to element czyniący atak zero-click. Działa domyślnie wyłącznie dla wbudowanych marketplace’ów agentów, a te znajdują się na GitHubie. W przypadku zewnętrznych marketplace’ów pozostaje wyłączona lub opcjonalna. Deweloper instalujący dodatki tylko z domyślnych katalogów nigdy nie spotka wariantu z nazwą gałęzi. To rozumowanie nie obejmuje jednak Gemini CLI – jego wariant opiera się na gałęzi FETCH_HEAD, której reguły GitHuba wprost nie blokują. To także jedyny agent, którego nikt już nie załata.

Cztery miesiące ciszy i brak CVE

Air zbudował działający proof of concept w maju, a podatność zgłosił wszystkim czterem dostawcom w czerwcu. Anthropic potwierdził poprawkę 17 czerwca. Google 4 sierpnia oznajmił, że żadna łatka nie powstanie. Codex został zweryfikowany jako naprawiony 12 sierpnia. Na 18 września The Hacker News nie znalazł ani identyfikatora CVE, ani biuletynu bezpieczeństwa opublikowanego przez któregokolwiek z czterech producentów. Notatki wydania Claude Code 2.1.179 w ogóle nie wspominają o poprawce – jedynym publicznym źródłem potwierdzającym jej istnienie jest wpis Air. Nie ma też sygnałów, by luka została wykorzystana w rzeczywistym ataku.

Cztery miesiące milczenia to długo w przypadku oprogramowania używanego przez Fortune 500. Kłóci się to również z kierunkiem, w którym zmierzają europejskie przepisy. Cyber Resilience Act wprowadza 24-godzinny termin raportowania aktywnie wykorzystywanych podatności i mocno naciska na udokumentowane łańcuchy dostaw oprogramowania.

Trzeci raz ten sam wzorzec

Air pracuje na tym obszarze od miesięcy. Najpierw umieścił złośliwy skill w marketplace i dotarł do około 26 tysięcy agentów. Potem przejął 925 już używanych skilli, sięgając do 134 tysięcy agentów, poprzez przejęcie repozytoriów stojących za nimi. Pinowanie hashy SHA było odpowiedzią branży na oba te incydenty. W sierpniu pięć laboratoriów uzgodniło wspólny standard wtyczek. Dziś atakujący uderzają nie w same modele, lecz w warstwę dystrybucji pod nimi.

Ten sam błąd projektowy pojawił się w czterech produktach od czterech różnych firm. To sugeruje, że nikt nie zweryfikował założenia, a nie że jednemu zespołowi powinęła się noga. Jednej kwestii opublikowane relacje nie rozstrzygają: czy aktualizacja zainfekowanego agenta usuwa wtyczkę, która została już podmieniona, czy tylko blokuje kolejną podmianę. Deweloperzy, którzy widzieli już przejętego Claude Code albo agentów OpenAI pojawiających się w RubyGems, rozpoznają ten schemat. Gemini CLI pozostanie podatne na stałe. Pytanie warte powtórzenia za rok brzmi: ile instalacji Gemini CLI wciąż działa.

Źródło