CVE-2026-61539: Xinference: Remote code execution via unsafe `eval()` in Llama3 tool-call parsing
Summary
Xinference used Python's unsafe eval() function when parsing Llama3 tool-call output generated by a large language model. Because the model output can be influenced by attacker-controlled prompts sent to the chat completion API, a remote attacker can craft prompts that cause the model to return a Python expression. Xinference then evaluates that expression on the server while post-processing the tool-call result. In the tested default deployment, authentication was not enabled, so the vulnerability was exploitable by an unauthenticated remote attacker through the /v1/chat/completions endpoint.
Details
Users can interact with deployed models through Xinference's OpenAI-compatible /v1/chat/completions API. The request entry point is implemented in xinference/api/restfulapi.py; non-streaming requests call the model instance's chat() method and return the inference result.
When the Transformers backend is used, inference results flow through the batching logic in xinference/model/llm/transformers/core.py. Non-streaming chat results are handled by handlechatresultnonstreaming(). If the request contains a tools field, Xinference calls postprocesscompletion() to parse tool-call output from the model response.
The Llama3 tool-call parser is implemented in xinference/model/llm/toolparsers/llama3toolparser.py. In affected versions, extracttoolcalls() parsed model output with eval():
python def extracttoolcalls( self, modeloutput: str ) -> List[Tuple[Optional[str], Optional[str], Optional[Dict[str, Any]]]]: try: data = eval(modeloutput, {}, {}) return [(None, data["name"], data["parameters"])] except Exception: return [(modeloutput, None, None)]
The intended behavior was to convert a Python dictionary-like string generated by the model into a dictionary object. However, eval() executes the input as a Python expression, and eval(modeloutput, {}, {}) is not a security sandbox. If an attacker can influence the model output through prompt injection or direct chat input, the attacker can cause the model to return an expression such as:
python import('os').system('touch /tmp/hacked')
When the expression reaches eval(), it is executed in the Xinference server process context. The harmless touch /tmp/hacked command can be replaced with other payloads, such as a reverse shell, malware download, sensitive file read, or lateral-movement payload.
Score
Severity: Critical
CVSS v3.1: 10.0
Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
Rationale:
- AV:N: the vulnerable API is remotely reachable over the network; - AC:L: exploitation only requires a crafted chat-completion request and tool-call parameter; - PR:N: the tested default configuration did not require authentication; - UI:N: no user interaction is required; - S:C: command execution can affect resources beyond the Xinference application boundary; - C:H/I:H/A:H: remote code execution can fully compromise confidentiality, integrity, and availability.
Credit
This vulnerability was discovered by:
- XlabAI Team of Tencent Xuanwu Lab (xlabai@tencent.com) - Atuin Automated Vulnerability Discovery Engine - Guannan Wang (wgnbuaa@gmail.com), Zhanpeng Liu (pkugenuine@gmail.com), Guancheng Li (lgcpku@gmail.com)
Other sources
Xinference is an inference API for running open-source, speech, and multimodal models. In 2.5.0 and earlier, Xinference passes attacker-influenced Llama3 tool-call output to eval() in xinference/model/llm/toolparsers/llama3toolparser.py and xinference/model/llm/utils.py. Requests to /v1/chat/completions with a tools field flow through xinference/api/restfulapi.py, xinference/model/llm/transformers/core.py, handlechatresultnonstreaming(), and postprocesscompletion() before extracttoolcalls() or evalllama3chatarguments() evaluates the model-generated Python expression. An unauthenticated remote attacker can influence that output through a crafted prompt and execute commands in the Xinference server process context. This issue is fixed in version 2.7.0.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/xinferenceto a version that resolves this vulnerability.Fixed in 2.7.0 - Upgrade
Upgrade
Xinferenceto a version that resolves this vulnerability.Fixed in 2.7.0
Event History
Frequently Asked Questions
Who is exposed to exploitation?
Xinference deployments running version 2.5.0 or earlier are exposed if an attacker can reach the chat-completions endpoint. The described attack is unauthenticated and remote, so no existing account or user interaction is required.
What must an attacker send to trigger the issue?
The attacker sends a crafted request to /v1/chat/completions that includes a tools field and uses a prompt to influence Llama3 tool-call output. That output reaches unsafe eval() calls during tool-call parsing.
What is the impact if exploitation succeeds?
An attacker can execute commands in the context of the Xinference server process. This can compromise confidentiality, integrity, and availability of resources accessible to that process.
How can I remediate the vulnerability?
Upgrade Xinference to version 2.7.0, which fixes the issue. The provided data does not identify an alternative mitigation for deployments that cannot immediately upgrade.