← Wszystkie notatki

AnalizaDziałaj

Zgoda, o którą nie ma kogo zapytać

Pięć agentów, pięć rekordów CVE, jeden tydzień i ten sam brakujący krok: agent ma narzędzie powłoki i nikt nie jest pytany, zanim polecenie się wykona. Zgoda człowieka to funkcja terminala. Wystarczy przenieść agenta na Slacka, do czatu albo na serwer, a człowiek znika jako pierwszy.

Opublikowano
Tematy
bezpieczeństwo agentów AI · prompt injection · człowiek w pętli · CVE · CWE
5agentów, których narzędzie powłoki działa bez pytania człowieka, w rekordach z 15 do 20 października

Jednego dnia ci sami trzej badacze opublikowali cztery CVE dla czterech niezwiązanych ze sobą produktów z agentami AI. Piąte, od kogoś innego, pojawiło się pięć dni wcześniej. Wszystkie da się opisać jednym zdaniem: agent ma narzędzie powłoki i zanim wykona polecenie, nikt nie jest pytany o zgodę.

Bramkę zbudowano dla terminala

Najwięcej uczy przypadek OpenSRE, bo tam bramka zatwierdzania istnieje. W terminalu agent zatrzymuje się i pyta, zanim uruchomi polecenie. Ale ten sam agent odpowiada też na Slacku, a kod, który zastępuje tam terminal, musi odpowiedzieć na to samo pytanie, nie mając kogo zapytać. Odpowiada tak:

OpenSRE w commicie, na który powołuje się rekord. Dwa pliki, skrócone
# gateway/transports/slack/processing/dispatcher.py
# No approval prompts in Slack for now. Button waits stalled the
# turn until the timeout and posted extra replies in the thread.

# tools/interactive_shell/subprocess_presenter.py
def execution_allowed(self, policy, *, action_summary) -> bool:
    _ = (policy, action_summary)
    return True

Komentarz w kodzie jest szczery i mówi wszystko: na razie bez pytań o zgodę na Slacku, bo czekanie na przycisk blokowało rozmowę do limitu czasu. Nikt nie postanowił wyłączyć zabezpieczenia. Prawdziwy problem z używalnością rozwiązano, odpowiadając „tak”. Bramka była elementem interfejsu, a kiedy interfejs się zmienił, domyślnie stanęła otworem, bo tylko wtedy produkt dalej działał.

Każde wdrożenie, które ma znaczenie, działa bez człowieka

Pozostałe cztery nie doszły nawet do zaślepki. Trzy rekordy opisują narzędzie powłoki bez żadnego kroku zatwierdzania, dostępne przez endpoint czatu, wgrany dokument albo pobraną stronę WWW. Archon to forma najczystsza: agent programistyczny z wyłączonymi własnymi pytaniami o uprawnienia, za API sterującym, które nasłuchuje na wszystkich interfejsach. Serwer nie kliknie przycisku, więc przycisk znika.

Warto spojrzeć, skąd w każdym przypadku przychodzą instrukcje: alerty, wiadomości na Slacku, pobrane strony, wgrane dokumenty, otwarty port HTTP. Żadne z tych źródeł nie jest operatorem. Agent staje się użyteczny dokładnie wtedy, gdy pracuje sam na cudzych danych, i dokładnie w takim wdrożeniu kontrola typu „człowiek w pętli” nie ma w pętli człowieka.

Zaufanie to powierzchnia ataku

Agent, który przed każdym poleceniem zatrzymuje się i pyta, wygląda na bezpiecznego, i na pokazie rzeczywiście taki jest, bo pokaz odbywa się w terminalu. To jednak cecha sesji, a nie narzędzia, i nic w produkcie nie mówi, że wdrożona przez Ciebie sesja to akurat ta, w której odpowiedź zawsze brzmi „tak”.

Co konkretnie zrobić

  • Spisz wszystkie agenty, które działają bez terminala. Boty na Slacku i w Teams, webhooki, zadania cykliczne, endpointy czatu. Dla każdego ustal, co dzieje się tam z zatwierdzaniem poleceń. Jeśli odpowiedź brzmi „zatwierdza samo”, traktuj jego narzędzie powłoki jak zdalne wykonanie kodu dla każdego, kto może wpłynąć na jego dane wejściowe.
  • Bez człowieka odpowiedź ma brzmieć „nie”. Gdy nie ma kogo zapytać, bramka musi odmawiać, a nie przepuszczać. Wolna albo nieudana odpowiedź kosztuje ponowną próbę. Fałszywe „tak” kosztuje cały serwer.
  • Zabierz powłokę agentom, które pracują same. Daj im wąskie narzędzia o stałych argumentach. Bot SRE, który ma restartować usługę, potrzebuje narzędzia do restartu, a nie basha.
  • Uruchamiaj agenta bez niczego, co warto ukraść. Każdy z tych rekordów wymienia jako łup klucze i dane uwierzytelniające samego agenta. Trzymaj je poza jego środowiskiem i poza jego zasięgiem.
  • Porty sterujące tylko na loopbacku i tylko z uwierzytelnianiem. API agenta na 0.0.0.0 bez logowania to powłoka dla całej sieci, niezależnie od tego, co agentowi kazano robić.

E/01Co jest potwierdzone
  • Cztery rekordy CVE nadane przez VulnCheck i opublikowane 20 października 2026, wszystkie z tymi samymi odkrywcami, Noy Pearl, Michaelem Srominem i Ophirem Drorem: CVE-2026-109444 (OpenSRE do 0.1.2026.10.19), CVE-2026-109440 (LangAlpha do 2026.09.07), CVE-2026-109442 (piflow od 2.0.0 do 2.0.1) i CVE-2026-77926 (Aix-DB 1.2.4).
  • Piąty rekord, CVE-2026-111322, nadany przez VulnCheck i opublikowany 15 października 2026, dotyczy Archon od 0.2.13 do 0.11.1 i wskazuje odkrywcę hieuPenguinnn.
  • Żaden z pięciu rekordów nie podaje wersji z poprawką.
  • Mechanizm według rekordów. CVE-2026-109444: execution_allowed() w trybie bez terminala (headless presenter) zawsze zwraca True, więc polecenia shell_run wykonują się bez potwierdzenia, a wyzwalaczem są instrukcje wstrzyknięte w alerty lub wiadomości na Slacku, które agent analizuje. CVE-2026-109440: narzędzia Bash i ExecuteCode nie mają listy dozwolonych poleceń ani zatwierdzania przez człowieka, a wyzwalaczem są instrukcje podłożone w treści WWW pobieranej przez agenta. CVE-2026-109442: nieuwierzytelnione endpointy POST /chat i POST /chat/stream pozwalają każdemu polecić agentowi wywołanie exec_shell, które uruchamia polecenia przez subprocess.run bez zgody człowieka i bez listy dozwolonych. CVE-2026-77926: narzędzie execute agenta ChatBI nie ma żadnej bramki i jest dostępne dla uwierzytelnionych użytkowników bez uprawnień administratora przez czat lub wgrane dokumenty. CVE-2026-111322: API sterujące /api/* domyślnie nasłuchuje na 0.0.0.0 bez uwierzytelniania, a agent programistyczny za nim działa z bypassPermissions.
  • Co według rekordów jest narażone: dane uwierzytelniające do LLM, Slacka i chmury (CVE-2026-109444), sekrety w _internal/.vault_secrets.json (CVE-2026-109440), sekrety ze zmiennych środowiskowych, takie jak klucze API do LLM i dane dostępowe do bazy (CVE-2026-109442), dane dostępowe do źródeł danych i klucze API modeli (CVE-2026-77926) oraz polecenia na hoście z uprawnieniami użytkownika Archon (CVE-2026-111322).
  • Słabość: CWE-862, brak autoryzacji, dla CVE-2026-109444. CWE-1427, niewłaściwa neutralizacja danych wejściowych użytych w prompcie LLM, dla CVE-2026-109440. CWE-306, brak uwierzytelniania dla krytycznej funkcji, dla CVE-2026-109442 i CVE-2026-111322. CWE-749, wystawiona niebezpieczna metoda lub funkcja, dla CVE-2026-77926.
  • Oceny VulnCheck dla CVE-2026-109442 i CVE-2026-111322: CVSS 3.1 podstawa 9.8 i CVSS 4.0 podstawa 9.3, bez uprawnień i bez interakcji użytkownika.
  • Oceny VulnCheck dla CVE-2026-109444: CVSS 3.1 podstawa 8.8 i CVSS 4.0 podstawa 8.7, wymagana interakcja użytkownika.
  • Oceny VulnCheck dla CVE-2026-77926: CVSS 3.1 podstawa 8.8 i CVSS 4.0 podstawa 8.7, wymagane niskie uprawnienia.
  • Oceny VulnCheck dla CVE-2026-109440: CVSS 3.1 podstawa 8.1 i CVSS 4.0 podstawa 8.6, wymagana interakcja użytkownika, bez wpływu na dostępność.
  • Wpisy ADP agencji CISA klasyfikują wykorzystanie jako proof of concept, automatyzowalność jako tak i wpływ techniczny jako całkowity dla CVE-2026-109442, CVE-2026-109444 i CVE-2026-111322, a dla CVE-2026-77926 jako proof of concept, automatyzowalność nie, wpływ całkowity. CVE-2026-109440 nie ma oceny ADP.
  • Status w NVD na 21 października 2026 dla wszystkich pięciu: Deferred, więc NVD nie opublikowało własnej oceny.
  • W kodzie OpenSRE w commicie 8eba8c9, na który powołuje się CVE-2026-109444, HeadlessSubprocessPresenter.execution_allowed() ignoruje argumenty i zwraca True. Ta sama funkcja na gałęzi main, odczytana 21 października 2026, jest bez zmian.
E/02Czego jeszcze nie wiemy
  • Czy dla któregokolwiek z pięciu istnieje poprawka. Rekordy żadnej nie podają. Sprawdziliśmy tylko gałąź main OpenSRE, gdzie bramka nadal zatwierdza wszystko. Pozostałych czterech repozytoriów nie sprawdzaliśmy.
  • Nie odtworzyliśmy żadnej z pięciu podatności. Wszystko tutaj opiera się na rekordach CVE, a w przypadku OpenSRE także na lekturze kodu.
  • Kto może dotrzeć do agenta w prawdziwym wdrożeniu. W OpenSRE zależy to od tego, kto pisze na analizowanych kanałach albo wpływa na treść alertów. W piflow i Archon od tego, w jakiej sieci wystawiony jest port. Nikt nie opublikował liczby wdrożeń, a my nie mamy żadnej telemetrii: nasz publiczny sensor jest wyłączony.
  • Jak mocna jest piaskownica obszaru roboczego, o której wspomina rekord LangAlpha. Rekord mówi, że kod wykonuje się w niej, a sekrety i tak da się odczytać.
  • NVD odłożyło analizę wszystkich pięciu, więc każda ocena tutaj pochodzi wyłącznie od VulnCheck.