Zdjęcie profilowe jako exploit. Co nowa podatność w Open WebUI mówi o tym, że maintainerzy zamknęli zgłoszenie bez odpowiedzi

maj 13, 2026 | Cyberflux

Jeśli używasz Open WebUI w wersji 0.7.2 lub starszej — brak łatki. Tymczasowa mitigacja: zmodyfikuj users.py żeby media_type akceptowało wyłącznie JPEG i PNG. Ogranicz uprawnienia workspace.tools do minimum. Monitoruj nieoczekiwane wywołania API na endpointach użytkownika.


Metin Yunus Kandemir odkrył coś prozaicznego: Open WebUI nie sprawdza czy przesłane zdjęcie profilowe jest zdjęciem.

Serwer przyjmuje base64-encoded dane, dekoduje je i zwraca bezpośrednio do przeglądarki jako streaming response. Jeśli zamiast JPEG prześlesz data:image/svg+xml;base64 z JavaScript wewnątrz — serwer posłusznie go zdekoduje i odeśle. Przeglądarka zobaczy SVG. SVG zawiera skrypt. Skrypt się wykonuje.

Każdy kto zobaczy twój profil uruchomi twój kod.

Stored XSS przez zdjęcie profilowe. Bez kombinowania, bez łańcucha podatności — jedna nieprawidłowa walidacja w pliku users.py. Jeśli ofiara jest administratorem lub ma uprawnienia workspace.tools: od przejęcia konta do RCE na backendzie przez API narzędzi Open WebUI, które wykonuje Python bez sandboxa. Jeśli zwykły użytkownik: kradzież tokenów sesji, historii czatów, kluczy API modeli.

Zamknięte bez odpowiedzi

Kandemir zgłosił podatność maintainerom w marcu. Dwa miesiące później maintainerzy zamknęli zgłoszenie jako duplikat — powołując się na nieopublikowane, prywatne advisory — i odmówili oficjalnego uznania badacza.

Uznając że to narusza normy odpowiedzialnego ujawniania, Kandemir opublikował szczegóły techniczne publicznie.

ClaudeBleed dostał częściową łatkę w tydzień po zgłoszeniu — niewystarczającą, ale przynajmniej był ruch. Tu nie ma żadnego ruchu. Wersja 0.7.2 jest podatna. Bez publicznego CVE, bez terminu poprawki, bez komunikatu.

Jest tu wzorzec który widzimy coraz częściej w ekosystemie narzędzi AI: szybki development, żadnego formalnego procesu zarządzania podatnościami, odpowiedź na zgłoszenie bezpieczeństwa taka sama jak na feature request — zamykamy jako duplikat, do widzenia.

12 000 instancji z internetu

Intruder w marcu przeskanował ponad dwa miliony hostów AI i znalazł ponad 12 000 instancji Open WebUI wystawionych na internet — 24 bez żadnego uwierzytelnienia.

Stored XSS przez profil użytkownika działa dokładnie w tym kontekście: atakujący zakłada konto na wystawionej instancji, wgrywa złośliwe "zdjęcie", i czeka aż administrator lub inny użytkownik z uprawnieniami workspace.toolsotworzy jego profil. W środowiskach wieloużytkownikowych to jest wysoce prawdopodobny scenariusz — każdy administrator przeglądający listę użytkowników wyzwoli payload.

RCE bez żadnej interakcji poza "administrator przejrzał listę użytkowników" to nie jest akademicka podatność. To jest gotowy wektor dla każdego kto znajdzie wystawioną instancję na Shodan.

Tymczasowe obejście

Do czasu pojawienia się oficjalnej łatki: jedna linia kodu w users.py — ograniczenie media_type do listy dozwolonych typów (JPEG, PNG, WebP) zamiast przyjmowania dowolnych danych. Nie eleganckie, ale skuteczne dla tego konkretnego wektora.

Wersja 0.7.2 jest podatna. Jeśli planujesz aktualizację — śledź repozytorium pod kątem patcha.

Źródła

GBHackers — pierwotna analiza z detalami technicznymi i endpointami API: https://gbhackers.com/open-webui-file-upload-vulnerability/

Cyberpress — szczegóły ścieżki exploitacji admin → RCE: https://cyberpress.org/open-webui-file-upload-vulnerability/

Intruder Research — dane o wystawionych instancjach Open WebUI: https://www.intruder.io/research/from-enterprise-chatbots-to-gooner-caves-exposed-ai-infrastructure-is-rampant