- Lỗ hổng RCE trong SGLang 0.5.9: một Jinja2 chat template độc bên trong file GGUF chạy code Python trên server ngay khi /v1/rerank được gọi.
- CVSS 9.8, chưa có patch chính thức, PoC đã public.
TL;DR
- CVE-2026-5760 — RCE không cần xác thực trong SGLang (CVSS 9.8, Critical), công bố 2026-04-20 bởi CERT/CC.
- Gốc rễ: SGLang render Jinja2 chat template bằng
jinja2.Environment()không sandbox. Một file GGUF cótokenizer.chat_templateđộc → khi endpoint/v1/rerankbị gọi, code Python của attacker chạy trên server. - Ảnh hưởng: SGLang 0.5.9 (version duy nhất được liệt kê trong advisory). Chưa có patch chính thức tại thời điểm công bố. PoC public đã tồn tại.
- Đây là supply-chain attack: payload nằm trong file model, dormant, kích hoạt khi một user gửi prompt chứa trigger phrase (HTML, login, financial queries).
Chuyện gì vừa xảy ra
Ngày 2026-04-20, CERT/CC công bố CVE-2026-5760 — một lỗ hổng RCE critical trong SGLang, framework phục vụ LLM đang được dùng rộng rãi trong các pipeline RAG và reranking. CVSS 9.8, AV:N, PR:N — tức là chỉ cần tiếp cận được qua mạng là xong, không cần tài khoản, không cần tương tác người dùng.
Điểm đặc biệt: attacker không gửi payload qua HTTP body. Họ nhét payload vào chính file model mà victim tải về và load.
Vì sao đáng lo
Cho đến giờ, hầu hết tổ chức đầu tư an ninh AI vẫn đặt niềm tin vào prompt-level guardrails — filter input, filter output, system prompt hardening. CVE-2026-5760 bypass toàn bộ lớp đó: code chạy ở tầng template, nằm giữa việc endpoint nhận request và việc model thật sự inference. API layer không thấy gì cả.
Tệ hơn, payload có thể dormant. Pillar Security mô tả class tấn công này là "Poisoned GGUF Templates": model chạy bình thường khi người dùng hỏi công thức nấu ăn, nhưng chỉ cần một prompt chứa trigger phrase — ví dụ yêu cầu render HTML login form — thì Jinja2 SSTI kích hoạt và shell của attacker mở ra.
Technical facts
| Thuộc tính | Giá trị |
|---|---|
| CVE ID | CVE-2026-5760 |
| CVSS | 9.8 Critical (AV:N, PR:N) |
| CWE | CWE-94 — Improper Control of Generation of Code |
| Assigner | CERT/CC |
| Affected version | SGLang 0.5.9 |
| Patched version | Chưa có tại thời điểm công bố |
| Attack surface | Endpoint /v1/rerank |
| Reserved | 2026-04-07 |
| Published | 2026-04-20 |
Code pattern gây lỗi: SGLang gọi jinja2.Environment().from_string(template).render(...) trực tiếp trên chuỗi tokenizer.chat_template đọc từ metadata của model, không dùng ImmutableSandboxedEnvironment và không bật bất kỳ sandbox flag nào. Jinja2 không sandbox cho phép biểu thức template truy cập __class__, __subclasses__, __globals__, từ đó chạm tới os.popen hoặc __builtins__.__import__ — chính là kỹ thuật SSTI kinh điển.
Chuỗi tấn công — từng bước
- Craft payload: attacker tải một file GGUF hợp pháp, mở bằng hex editor, tìm trường
tokenizer.chat_templatevà thay bằng Jinja2 SSTI (đại khái{{ ().__class__.__base__.__subclasses__() ... os.popen('...') }}). - Distribute: upload model lên Hugging Face. Trick: HF UI chỉ hiển thị chat template của file đầu tiên trong repo, nên attacker để template sạch ở
Q2_K.ggufvà giấu payload trongQ4_K_M.gguf. - Victim loads model: team ops hoặc CI của victim pull model về, SGLang 0.5.9 load file, parse metadata, cache template.
- Trigger: một request bình thường tới
/v1/rerank(hoặc một prompt chứa trigger phrase) khiến SGLang render template → code Python chạy trong context process của SGLang. - Post-exploit: attacker có RCE, thường là root hoặc service account có quyền đọc API keys, model weights, dữ liệu RAG.
So với các lỗ hổng LLM RCE gần đây
| Lỗ hổng | Framework | Vector | Timing |
|---|---|---|---|
| CVE-2026-5760 | SGLang 0.5.9 | Jinja2 SSTI qua tokenizer.chat_template trong GGUF | Dormant, trigger ở inference time |
| CVE-2026-3059 / 3060 / 3989 (VU#665416) | SGLang (multimodal / disagg) | pickle.loads() trên ZMQ broker bind tcp://* | Ngay lập tức, trước khi app validate |
| CVE-2024-34359 (GHSA-56xg-wfcc-g829) | llama-cpp-python | Jinja2 SSTI qua tokenizer.chat_template (giống hệt) | Inference time |
Chú ý bug llama-cpp-python có từ 2024, và hai năm sau SGLang ship lại y chang pattern. Điều đó nói lên một việc: hệ sinh thái Python AI/ML vẫn chưa coi file model là code đang chạy, mà vẫn coi là data.
Ai bị ảnh hưởng nhiều nhất
- Platform nội bộ dùng SGLang cho reranking/RAG — chính endpoint
/v1/reranklà attack surface. - Team dùng model tool-calling / reasoning (Phi-4-mini và tương tự) — những model này cần custom chat template để hoạt động, nên template bất thường không bị nghi.
- Người dùng local LLM client như LM Studio tự động load template từ GGUF mà không hiển thị cho user.
- Bất kỳ ai pull quantized GGUF từ Hugging Face và không kiểm template trước khi deploy.
Limitations & mitigations
Điều kiện exploit: attacker phải khiến SGLang load file model độc — qua supply chain HF, qua config cho phép custom model path, hoặc qua feature upload model nếu có. /v1/rerank cũng phải được bật.
Mitigation (chưa có patch chính thức):
- Không load GGUF từ nguồn không đáng tin. Pin hash cụ thể của quantization đã được audit.
- Extract
tokenizer.chat_templatekhỏi mọi file GGUF trước khi load và grep các pattern nguy hiểm:__class__,__subclasses__,__globals__,__import__,os., conditionalif/elsebất thường. - Tắt
/v1/reranknếu không dùng. - Đặt SGLang sau một auth proxy, không expose trực tiếp.
- Theo dõi release của sgl-project/sglang; fix đúng cách là chuyển sang
jinja2.sandbox.ImmutableSandboxedEnvironment(đúng cách llama-cpp-python đã fix).
Detection: không có tín hiệu ở API layer — code chạy dưới lớp prompt/response monitor. Phải watch process SGLang: unexpected child process, outbound connection lạ, write vào /tmp.
What's next
CVE này không chỉ là chuyện của SGLang. Nó là bằng chứng mới nhất cho một class-level problem: file model chứa active code, và hệ sinh thái vẫn phân phối file model dựa trên niềm tin cộng đồng thay vì chữ ký số. Kỳ vọng trong vài tháng tới:
- Patch chính thức từ SGLang — nhiều khả năng là switch sang Jinja2 sandbox + hardening model loader.
- Audit tương tự trên vLLM, Ollama tooling, LMDeploy — pattern này gần như chắc chắn còn ở đó.
- Hugging Face và các model hub sẽ phải mở rộng scanner để cover template-level vuln, không chỉ weights.
- Model signing + provenance sẽ thành hard requirement cho enterprise AI pipeline.
Trong lúc đó, nếu bạn đang chạy SGLang 0.5.9 trong production: kiểm template trong mọi file GGUF trước khi load, tắt /v1/rerank nếu không dùng, và đặt API sau proxy có auth — ngay hôm nay.
Nguồn: The Hacker News, TheHackerWire, THREATINT CVE record, Pillar Security, Orca Security.


