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/rerank reachable 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ínhGiá trị
CVE IDCVE-2026-5760
CVSS 3.19.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CWECWE-94 / CWE-1336
AffectedSGLang 0.5.9 (và các bản trước có cùng code path)
EndpointPOST /v1/rerank
TriggerQwen3 reranker trigger phrase trong chat template
AuthKhông yêu cầu
AssignerCERT/CC (VU#915947)
Disclosure2026-04-20

Chuỗi tấn công gọn lỏn 4 bước:

  1. Attacker tạo file GGUF với tokenizer.chat_template chứa Jinja2 SSTI payload + Qwen3 trigger phrase.
  2. Victim (vô tình hoặc do BYO-model) load model đó vào SGLang.
  3. Bất kỳ request /v1/rerank nào đi qua → SGLang render template.
  4. 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:

CVEProjectGốc rễ
CVE-2024-34359 (Llama Drama)llama-cpp-pythonUnsandboxed Jinja2 trong chat template → RCE
CVE-2025-61620vLLMChat-template attack surface tương tự → DoS
CVE-2026-5760SGLangUnsandboxed 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_templateinput 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/rerank expose 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:

  1. Patch thủ công: sửa serving_rerank.py, thay jinja2.Environment() bằng jinja2.sandbox.ImmutableSandboxedEnvironment().
  2. Lock model source: chỉ load GGUF từ registry nội bộ đã verify; block BYO-model tới khi có vá.
  3. Network isolation: không expose /v1/rerank ra Internet hoặc mạng user-facing. Đặt sau auth proxy.
  4. Process hardening: chạy SGLang trong container với seccomp, read-only filesystem, user không privilege, egress firewall.
  5. Audit: grep tokenizer.chat_template trong tất cả GGUF đang serve; bất kỳ chuỗi nào dạng {{ ... __globals__ ... }} hoặc lipsum, 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ố.