Przejdź do treści
INDEKS ANALIZ BREACHROAD / NOTA TECHNICZNA

MindsDB CVE-2026-73678: agent AI daje nieuwierzytelnione RCE

Otwarty endpoint, szeroki CORS i scratchpad wywołujący exec() tworzą pełny łańcuch RCE. Wyjaśniamy ekspozycję Minds Platform i reakcję bez poprawki.

MATERIAŁ PUBLICZNY
AUTOR
/ CEO Breachroad · OSCP · PNPT
PUBLIKACJA
14 sierpnia 2026
CZAS CZYTANIA
14 min czytania
TEMAT
Bezpieczeństwo AI
MindsDB CVE-2026-73678: agent AI daje nieuwierzytelnione RCE

14 sierpnia 2026 roku opublikowano CVE-2026-73678, krytyczną podatność MindsDB Minds Platform. Wersje do 26.1.0 włącznie udostępniają backend cowork-server bez uwierzytelnienia. Klient może najpierw ustawić własny klucz dostawcy LLM przez endpoint ustawień, a następnie wysłać prompt do /api/v1/responses/. Agent Anton może przekazać wygenerowany kod do narzędzia scratchpad, które kompiluje go i wykonuje przez Pythonowe exec() w procesie serwera. Skutkiem jest wykonywanie poleceń systemowych z prawami użytkownika uruchamiającego aplikację.

Advisory projektu przyznaje luce 10,0 w CVSS 3.1. Nie wymaga konta ofiary ani interakcji poza działającą aplikacją. Co więcej, szeroki CORS może pozwolić stronie odwiedzonej w przeglądarce wysyłać żądania do lokalnego portu 26866. To oznacza, że usługa związana tylko z localhost nie jest automatycznie bezpieczna: przeglądarka użytkownika może stać się pośrednikiem między zewnętrzną stroną a lokalnym API.

Trzy błędy tworzą jeden łańcuch

Pierwszą przyczyną jest brak uwierzytelnienia dla całego routera /api/v1/. Endpoint odpowiedzi nie ma kontroli tożsamości, a ustawienia modelu również są dostępne anonimowo. Napastnik nie musi znać klucza API ofiary. Może podać własny klucz, wybrać obsługiwany model i uruchomić przepływ agenta.

Drugą przyczyną jest konfiguracja CORS dopuszczająca dowolne originy. CORS nie chroni usługi przed bezpośrednim klientem sieciowym, ale tutaj dodatkowo otwiera drogę z obcej strony internetowej do API na komputerze użytkownika. Jeżeli aplikacja działa na localhost, a przeglądarka może wysłać do niej żądanie cross-origin, klasyczna granica „port nie jest publiczny” znika.

Trzecią i najważniejszą przyczyną jest scratchpad. Narzędzie przyjmuje kod Pythona generowany przez model, kompiluje go, a następnie wywołuje exec(compiled, namespace). Nie działa w izolowanym interpreterze z ograniczonym zestawem funkcji. Kod może importować moduły, czytać pliki, uruchamiać procesy i łączyć się z siecią w zakresie praw procesu MindsDB.

Każdy z tych błędów jest groźny osobno, ale dopiero ich połączenie daje prostą ścieżkę anonimowy klient → prompt → agent → wykonanie kodu. Uwierzytelnienie ograniczyłoby osiągalność, twardy CORS zmniejszyłby wariant przeglądarkowy, a prawdziwy sandbox zatrzymałby przejście z odpowiedzi modelu do systemu operacyjnego. Bezpieczeństwo agenta wymaga wszystkich warstw, nie jednej instrukcji systemowej.

Dlaczego to nie jest tylko prompt injection

Prompt steruje zachowaniem modelu, lecz krytyczny błąd architektury polega na tym, że model ma dostęp do narzędzia wykonującego arbitralny kod bez niezależnej polityki. Nawet filtracja fraz w promptcie nie daje gwarancji: model może wygenerować semantycznie równoważny kod, instrukcję można zakodować, a zachowanie zmienia się między dostawcami i wersjami.

Narzędzie wysokiego ryzyka powinno przyjmować wąski, deklaratywny zestaw operacji. Jeżeli zadanie wymaga obliczeń, serwer może udostępnić ograniczone funkcje matematyczne lub jednorazowy sandbox bez sekretów i egressu. Ogólne exec() w głównym procesie serwera jest równoważne przekazaniu modelowi powłoki z prawami aplikacji.

Typed output również nie rozwiązuje problemu. Schema może potwierdzić, że pole zawiera string code, ale nie decyduje, czy kod ma prawo czytać klucz SSH. Autoryzacja musi odnosić się do skutku i zasobów, a nie tylko poprawności JSON.

Kto jest narażony

Bezpośrednio dotknięte są Minds Platform do 26.1.0. Advisory nie wskazuje poprawionej wersji. Najwyższy priorytet mają instancje dostępne z sieci, środowiska deweloperskie przekierowujące port przez kontener lub IDE, hosty desktopowe z aktywnym portem lokalnym i serwery uruchamiane jako konto posiadające klucze, tokeny chmurowe lub dostęp do repozytoriów.

Inwentaryzacja powinna objąć nie tylko produkcję. Aplikacja uruchamiana przez dewelopera może widzieć katalog .ssh, konfigurację Git, klucze dostawców AI, pliki .env i połączenia do sieci firmowej. W takim środowisku RCE na laptopie ma większy blast radius niż kompromitacja odseparowanego poda.

Sprawdź sposób bindowania portu, reguły Docker, tunele, reverse proxy, udostępnienie przez Codespaces oraz możliwość dostępu z przeglądarki. Localhost ogranicza bezpośrednie połączenia sieciowe, ale nie wariant drive-by opisany przez advisory.

Co zrobić, gdy nie ma poprawionej wersji

  1. Zatrzymaj Minds Platform do czasu wydania zweryfikowanej poprawki, jeśli scratchpad nie jest krytycznie potrzebny.
  2. Zablokuj port 26866 spoza dedykowanego hosta i odetnij dostęp przeglądarkowy przez lokalny firewall lub proxy wymagające uwierzytelnienia.
  3. Wyłącz albo usuń narzędzie scratchpad i każdą ścieżkę prowadzącą do exec(); nie polegaj wyłącznie na zmianie promptu.
  4. Uruchamiaj usługę jako dedykowany, nieuprzywilejowany użytkownik w efemerycznym kontenerze z read-only root, bez katalogu domowego i sekretów.
  5. Zastosuj domyślnie zablokowany egress, dopuszczając jedynie wymagany endpoint modelu przez kontrolowany proxy.
  6. Monitoruj advisory i wydania projektu. Aktualizację uznaj za bezpieczną dopiero po potwierdzeniu, że usuwa brak auth, szeroki CORS i nieograniczone wykonanie.
  7. Jeżeli usługa działała, zbadaj host przed rotacją sekretów, aby zachować dowody i usunąć ewentualną trwałość.

Własny reverse proxy może być mitygacją tymczasową, ale musi chronić również localhost i wszystkie interfejsy. Jeśli backend pozostaje bez auth, obejście proxy przez bezpośredni port przywraca lukę. Network namespace i reguły systemowe powinny uniemożliwiać taką ścieżkę.

Jak szukać śladów wykorzystania

Przejrzyj żądania do /api/v1/settings/ i /api/v1/responses/, szczególnie bez znanej sesji użytkownika, z obcych originów lub w nietypowych godzinach. Zwróć uwagę na zmiany dostawcy modelu, nowe klucze i nagły wzrost wywołań scratchpada. Jeżeli aplikacja nie logowała pełnego kontekstu, połącz logi HTTP z telemetrią procesu.

Na hoście szukaj procesów potomnych serwera Python, nowych plików w katalogach tymczasowych, zmian .bashrc, crona, authorized_keys, uruchomionych narzędzi sieciowych i połączeń wychodzących do nowych adresów. Odczyt kluczy może nie pozostawić jednoznacznego śladu, dlatego zakres potencjalnej rotacji powinien wynikać z praw procesu i czasu ekspozycji.

Po potwierdzonym RCE aktualizacja lub zatrzymanie aplikacji nie zamyka incydentu. Trzeba odtworzyć host z zaufanego obrazu albo uzyskać równoważny poziom pewności, zmienić sekrety dopiero po usunięciu trwałości oraz sprawdzić konta i systemy osiągalne z maszyny.

Bezpieczniejszy wzorzec dla agentów wykonujących kod

Jeśli produkt naprawdę potrzebuje kodu generowanego przez model, każde wykonanie powinno trafić do jednorazowego sandboxa bez sekretów, bez sieci, z minimalnym filesystemem, limitem czasu, pamięci i procesów. Wynik powinien być czystymi danymi. Sandbox nie może współdzielić socketu Dockera, tokenu ServiceAccount ani katalogu domowego serwera.

Warstwa polityki powinna ocenić plan przed wykonaniem: dozwolony język, biblioteki, rozmiar, operacje I/O i cel biznesowy. Operacje nieodwracalne wymagają zatwierdzenia związanego z dokładnym artefaktem kodu. Log należy przechowywać poza workerem, aby wykonany kod nie mógł go zmienić.

Fakty o endpointach, CORS, scratchpadzie, zakresie wersji i braku poprawki pochodzą z advisory projektu oraz rekordu CVE. Źródła nie potwierdzają masowej kampanii. Segmentacja, hunting i projekt sandboxa są rekomendacjami Breachroad. Ten przypadek warto przećwiczyć na szkoleniu z bezpieczeństwa AI i cyberbezpieczeństwa, a architekturę agentów i uprawnienia można uporządkować przez bezpieczne wdrożenie AI.

UDOSTĘPNIJ / KOPIUJ