- Lỗ hổng CVSS 9.8 trong SGLang cho phép attacker RCE qua file GGUF độc.
- Gốc rễ: /v1/rerank dùng jinja2.Environment() thay vì ImmutableSandboxedEnvironment.
- PoC đã public, vendor chưa phản hồi.
TL;DR
CVE-2026-5760 là lỗ hổng Remote Code Execution critical (CVSS 9.8, AV:N/AC:L/PR:N/UI:N) trong SGLang — framework serving LLM phổ biến. Endpoint /v1/rerank render tokenizer.chat_template từ file GGUF bằng jinja2.Environment() không sandbox, nên chỉ cần server load model GGUF độc và nhận 1 request rerank là attacker chạy được Python tuỳ ý trong process. Không cần auth. Researcher Stuart Beck (@stuub_) công bố ngày 20/04/2026 kèm PoC. Vendor im lặng suốt coordination qua CERT/CC — chưa có bản vá chính thức.
What's new
Ngày 20/04/2026, CERT/CC publish VU#915947 và NVD thêm CVE-2026-5760 với điểm CVSS 9.8. Cùng lúc, Stuub drop repo PoC trên GitHub với exploit chạy được bằng một dòng: python3 exploit.py "id" — nhận command shell tuỳ ý làm argument.
Đây là CVE đầu tiên 2026 mà Stuub công bố, và là đòn tiếp theo giáng vào một pattern đã quen thuộc: LLM serving frameworks liên tục render chat template từ model file mà không coi đó là untrusted input.
Why it matters
SGLang không phải phần mềm niche — nó được các team infer LLM production dùng để serving Qwen, Llama, DeepSeek... ở quy mô lớn. Bất kỳ team nào:
- Tự host SGLang và để
/v1/rerankreachable từ network (nội bộ hoặc Internet), - Load model GGUF từ nguồn bên thứ ba (Hugging Face mirror, marketplace, registry nội bộ cho phép upload),
- Chạy Qwen3 reranker,
đều đang có một đường RCE không auth thẳng vào server. Với platform multi-tenant kiểu "bring your own model", một upload độc = compromise toàn bộ host inference. Đó là kịch bản tệ nhất: model file — thứ người ta nghĩ là data — thực chất là code.
Technical facts
Root cause nằm ở file python/sglang/srt/entrypoints/openai/serving_rerank.py, dòng 128–132: environment Jinja2 được khởi tạo không sandbox.
| Thuộc tính | Giá trị |
|---|---|
| CVE ID | CVE-2026-5760 |
| CVSS 3.1 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-94 / CWE-1336 |
| Affected | SGLang 0.5.9 (và các bản trước có cùng code path) |
| Endpoint | POST /v1/rerank |
| Trigger | Qwen3 reranker trigger phrase trong chat template |
| Auth | Không yêu cầu |
| Assigner | CERT/CC (VU#915947) |
| Disclosure | 2026-04-20 |
Chuỗi tấn công gọn lỏn 4 bước:
- Attacker tạo file GGUF với
tokenizer.chat_templatechứa Jinja2 SSTI payload + Qwen3 trigger phrase. - Victim (vô tình hoặc do BYO-model) load model đó vào SGLang.
- Bất kỳ request
/v1/reranknào đi qua → SGLang render template. - Payload break out khỏi Jinja2 qua global object — ví dụ
lipsum.__globals__["os"].popen(cmd).read()— và chạy command shell với quyền của process inference.
Comparison — chuyện cũ lặp lại
Không phải lần đầu LLM stack dính đòn này:
| CVE | Project | Gốc rễ |
|---|---|---|
| CVE-2024-34359 (Llama Drama) | llama-cpp-python | Unsandboxed Jinja2 trong chat template → RCE |
| CVE-2025-61620 | vLLM | Chat-template attack surface tương tự → DoS |
| CVE-2026-5760 | SGLang | Unsandboxed Jinja2 trong rerank chat template → RCE |
Cùng một class bug, cùng một fix có sẵn (ImmutableSandboxedEnvironment), cứ mỗi 6–12 tháng lại rơi vào một framework khác. Tokenizer chat_template là input không tin cậy — cần được xử lý như bất cứ payload nào đến từ người dùng.
Ai đang gặp nguy cơ
- Team tự host SGLang chạy Qwen3 reranker, đặc biệt nếu endpoint
/v1/rerankexpose ra network rộng. - Platform inference multi-tenant cho phép user upload/chọn model (BYO-model).
- CI/CD pipeline auto-pull model từ Hugging Face vào SGLang mà không kiểm tra
tokenizer.chat_template. - Internal ML platform nơi developer có thể push model — vì lỗ hổng biến "model artifact" thành vector code execution.
Limitations & mitigation
Điều kiện khai thác: target phải load được GGUF độc. Không có path traversal hoặc remote model-fetch trong PoC — cần social engineering, BYO-model, hoặc thao tác supply chain. Nhưng khi đã load rồi thì không auth, không user interaction.
Mitigation trước khi có patch chính thức:
- Patch thủ công: sửa
serving_rerank.py, thayjinja2.Environment()bằngjinja2.sandbox.ImmutableSandboxedEnvironment(). - Lock model source: chỉ load GGUF từ registry nội bộ đã verify; block BYO-model tới khi có vá.
- Network isolation: không expose
/v1/rerankra Internet hoặc mạng user-facing. Đặt sau auth proxy. - Process hardening: chạy SGLang trong container với seccomp, read-only filesystem, user không privilege, egress firewall.
- Audit: grep
tokenizer.chat_templatetrong tất cả GGUF đang serve; bất kỳ chuỗi nào dạng{{ ... __globals__ ... }}hoặclipsum,cycler,joinerđều đáng nghi.
What's next
Vendor SGLang chưa phản hồi suốt coordination period (07/04 → 20/04). Cộng đồng nhiều khả năng sẽ submit PR sandbox trong vài ngày tới, nhưng đến lúc có release chính thức, mọi instance SGLang 0.5.9 trở xuống đều coi như vulnerable. Nếu bạn đang vận hành SGLang production, đừng chờ CHANGELOG — audit ngay hôm nay.
Về dài hạn: đã đến lúc LLM-serving ecosystem có một baseline security contract cho "model-supplied template" — giống như web framework auto-escape HTML. Một CVE nữa cùng pattern là quá đủ để kết luận đây là vấn đề thiết kế, không phải tai nạn.
Nguồn: The Hacker News, CERT/CC VU#915947, CIRCL Vulnerability Lookup, PoC của Stuub trên GitHub, tweet công bố.
