W kwietniu tego roku pisaliśmy o ataku na Marimo, w którym atakujący po uzyskaniu dostępu do serwera pobrali złośliwy ładunek z Hugging Face — platformy hostingowej dla modeli AI — i zainstalowali go pod nazwą udającą legalnego agenta. Teza była: zaufane platformy stają się infrastrukturą dostarczania złośliwego kodu.
CVE-2026-5760 w SGLang odwraca ten schemat. Tym razem to nie atakujący pobiera coś z Hugging Face po przejęciu serwera. Sam plik modelu pobrany z Hugging Face jest złośliwym oprogramowaniem.
SGLang i infrastruktura serwowania modeli
SGLang to wydajny framework open source do serwowania dużych modeli językowych i modeli multimodalnych — warstwa między surowym modelem a aplikacją która go wywołuje. Ponad 26 000 gwiazdek na GitHubie, ponad 5 500 rozwidleń projektu. Używany przez organizacje budujące własną infrastrukturę wnioskowania AI — zamiast polegać na zewnętrznych API, uruchamiają modele lokalnie przez SGLang.
Typowe środowisko SGLang ma dostęp do dużej mocy obliczeniowej, często na GPU w chmurze. Przetwarza dane użytkowników, może być połączony z wewnętrznymi bazami danych i interfejsami API, działa z podwyższonymi uprawnieniami. Jest dokładnie tym rodzajem infrastruktury, który jest atrakcyjny dla atakujących — i o którym administratorzy często myślą jako o "środowisku deweloperskim" raczej niż "systemie produkcyjnym."
Jak działa podatność
CVE-2026-5760 siedzi w punkcie końcowym /v1/rerank — interfejsie do szeregowania wyników według trafności, używanym przy wyszukiwaniu i systemach RAG. Gdy SGLang przetwarza żądanie przez ten punkt końcowy, odczytuje szablon konwersacji z załadowanego modelu — pole tokenizer.chat_template w metadanych pliku GGUF.
Problem leży w tym jak ten szablon jest renderowany. SGLang używa biblioteki szablonów Jinja2 przez standardową klasę jinja2.Environment(). Ta klasa nie ma włączonej piaskownicy wykonania — renderuje szablony z pełnym dostępem do środowiska Pythona. Jest bezpieczna dla zaufanych szablonów. Jest niebezpieczna dla szablonów pochodzących z zewnętrznych plików modeli.
Atak przebiega w kilku krokach. Atakujący tworzy plik modelu GGUF z złośliwym szablonem konwersacji zawierającym wstrzyknięcie szablonu po stronie serwera — payload SSTI. Szablon zawiera konkretną frazę wyzwalającą aktywującą podatną ścieżkę kodu dla modelu Qwen3 w pliku serving_rerank.py. Ofiara pobiera model z Hugging Face lub innego publicznego repozytorium i ładuje go do SGLang. Gdy przychodzi żądanie do /v1/rerank, SGLang renderuje szablon — i payload SSTI ucieka z kontekstu szablonu przez znane techniki obejścia Pythona, wykonując dowolne polecenia systemowe na serwerze.
Wynik CVSS: 9.8. Zdalne wykonanie kodu bez uwierzytelnienia, inicjowane przez sam plik modelu.
Ta sama klasa błędu, trzecia ofiara z rzędu
Jest jeden kontekst, który czyni tę historię czymś więcej niż pojedynczym CVE w pojedynczym frameworku.
CVE-2026-5760 należy do tej samej klasy podatności co CVE-2024-34359 — znany jako "Llama Drama" — krytyczna luka w bibliotece llama_cpp_python z wynikiem CVSS 9.7, wykryta wcześniej i naprawiona. Ta sama klasa błędu pojawiła się też w vLLM pod koniec 2025 roku jako CVE-2025-61620. Teraz SGLang.
Trzy popularne frameworki do serwowania modeli AI, ta sama klasa podatności, kolejne odkrycia w ciągu roku. Nie chodzi o konkretny błąd konkretnego dewelopera. Chodzi o wzorzec: frameworki do serwowania modeli AI ładują zewnętrzne pliki modeli i przetwarzają zawarte w nich metadane — w tym szablony konwersacji — przez silniki szablonów bez włączonej piaskownicy. Każdy framework, który tak robi, ma tę samą strukturalną podatność. CERT/CC wskazuje wprost: rozwiązaniem jest użycie ImmutableSandboxedEnvironment zamiast jinja2.Environment() wszędzie gdzie renderowane są szablony z zewnętrznych źródeł.
Plik modelu jako złośliwe oprogramowanie
Pisaliśmy o Smart Slider 3 Pro cytując analizę Patchstack: "The plugin is the malware." Wtyczka, która wygląda normalnie i działa normalnie, jest jednocześnie narzędziem zdalnego dostępu dla atakujących.
CVE-2026-5760 to ten sam wzorzec, ale w infrastrukturze AI. Model, który wygląda normalnie i działa normalnie — produkuje sensowne wyniki dla zapytań, ma właściwe metadane, pochodzi z zaufanej platformy — jest jednocześnie nośnikiem złośliwego kodu wykonywanego przy każdym żądaniu do punktu końcowego szeregowania.
Różnica między "złośliwym modelem" a "bezpiecznym modelem z osadzonym payloadem SSTI" jest niewidoczna dla użytkownika pobierającego plik. GGUF to format binarny zawierający wagi modelu, architekturę i metadane. Dodanie złośliwego szablonu konwersacji do metadanych nie zmienia zachowania modelu dla normalnych zapytań. Zmienia tylko to co się dzieje gdy SGLang przetwarza żądanie przez punkt końcowy /v1/rerank.
Nikt nie sprawdza podpisów kryptograficznych plików modeli przed ich załadowaniem. Nikt nie weryfikuje że metadane w pliku GGUF są bezpieczne do renderowania przez silnik szablonów. Pliki modeli krążą między badaczami, organizacjami i projektami open source jak pliki danych — z domyślnym założeniem że są pasywne i niegroźne.
To założenie jest właśnie tym co CVE-2026-5760 obala.
Hugging Face jako wektor dystrybucji
W aktualizacji o Marimo pisaliśmy że Hugging Face stał się infrastrukturą dostarczania złośliwego kodu — przestrzeń hostingowa z milionami legalnych użytkowników, której reputacja jest dziedziczona przez każdy plik na niej hostowany.
CVE-2026-5760 podnosi to o poziom wyżej. Tam złośliwy ładunek był pobierany z Hugging Face po przejęciu serwera przez inną podatność. Tutaj złośliwy ładunek jest wbudowany w plik modelu hostowany na Hugging Face — i pobierany jako model przez ofiarę, która w ogóle nie jest świadoma że jej serwer wnioskowania będzie wykonywał kod zawarty w metadanych.
Warunek eksploitacji jest jeden: ofiara musi załadować złośliwy model do SGLang i wysłać żądanie do punktu końcowego /v1/rerank. W środowiskach z automatycznym pobieraniem modeli z publicznych repozytoriów — na przykład przez skrypty inicjalizacyjne porównujące dostępne modele z Hugging Face — ten warunek może być spełniony bez żadnej świadomej decyzji użytkownika.
Połączenie z ekosystemem MCP
Jest jeszcze jedna warstwa tej historii, którą warto wyciągnąć.
Pisaliśmy o architektonicznym błędzie w STDIO w protokole MCP — niezaufane dane z zewnętrznego źródła trafiają do środowiska wykonawczego z dostępem do sekretów produkcyjnych. CVE-2026-5760 to ten sam schemat na poziomie niżej: niezaufane metadane z zewnętrznego pliku modelu trafiają do silnika szablonów z dostępem do środowiska Pythona.
Różnica jest w tym że w przypadku MCP problem był w projekcie protokołu. W przypadku SGLang problem jest w implementacji konkretnego wywołania Jinja2 — i jest naprawialny przez zmianę jednej linii kodu. CERT/CC i badacze są w tej sprawie zgodni: ImmutableSandboxedEnvironment zamiast jinja2.Environment(). Dwa słowa różnicy, które eliminują całą klasę ataku.
Llama Drama była naprawiona. vLLM był naprawiony. SGLang teraz wymaga naprawy. Pytanie brzmi ile innych frameworków do serwowania modeli robi to samo wywołanie w tym samym niebezpieczny sposób i jeszcze nie dostało własnego CVE.
Co zrobić
SGLang wersja 0.5.9 jest podatna. Łatka wymagająca użycia ImmutableSandboxedEnvironment jest w przygotowaniu — do czasu jej wydania CERT/CC rekomenduje unikanie ładowania niezweryfikowanych modeli GGUF z publicznych repozytoriów szczególnie w środowiskach gdzie punkt końcowy /v1/rerank jest aktywny.
Środowiska, które nie używają punktu końcowego szeregowania, mogą wyłączyć /v1/rerank jako tymczasowe obejście eliminujące wektor ataku bez aktualizacji frameworku.
Szersza rekomendacja: każde środowisko SGLang powinno mieć listę zaufanych źródeł modeli i mechanizm weryfikacji że pobierane pliki pochodzą z tych źródeł. Domyślne zaufanie do "modelu z Hugging Face" bez dodatkowej weryfikacji nie jest bezpiecznym założeniem w środowisku gdzie pliki modeli mogą zawierać wykonywalny kod w metadanych.
Podsumowanie
CVE-2026-5760 w SGLang to nie jest historia o jednej podatności w jednym frameworku. To jest historia o klasie podatności, która pojawia się systematycznie w infrastrukturze serwowania modeli AI — i o założeniu, które tę podatność umożliwia: że pliki modeli są pasywne i można im ufać.
Llama Drama, vLLM, SGLang. Trzy frameworki, ta sama klasa błędu, trzy osobne odkrycia. Wzorzec jest czytelny. Frameworki AI dziedziczą podatności swojej infrastruktury — a infrastruktura renderowania szablonów bez piaskownicy jest podatna na wstrzyknięcie niezależnie od tego co renderuje.
Model może być złośliwym oprogramowaniem. Ta zdanie brzmi absurdalnie dopóki nie przeczytasz CVE-2026-5760.
Źródła
The Hacker News — pierwotne omówienie CVE-2026-5760 i kontekst Llama Drama: https://thehackernews.com/2026/04/sglang-cve-2026-5760-cvss-98-enables.html
GBHackers — szczegóły techniczne łańcucha ataku i warunku wyzwalającego: https://gbhackers.com/malicious-gguf-models-could-trigger-rce/
CERT/CC — oficjalne ogłoszenie podatności z rekomendacją techniczną: https://www.kb.cert.org/vuls/id/CVE-2026-5760
Vulert — analiza klasy podatności CWE-1336 i CWE-94: https://vulert.com/blog/sglang-cve-2026-5760-rce/
Cybersecurity News — mechanizm eksploitacji przez Qwen3 trigger phrase: https://cybersecuritynews.com/sglang-cve-2026-5760/






































































