Safeguard
Vulnerability Analysis•

CVE-2025-32375: Critical Deserialization RCE in BentoML

CVE-2025-32375 is a critical RCE in the BentoML runner server before 1.4.8. Upgrade the bentoml package to 1.4.8 or later and restrict runner access.

Safeguard Security Team
3 min read

CVE-2025-32375 is a critical (CVSS 9.8) insecure deserialization flaw in the BentoML runner server. A crafted POST request can run arbitrary code on the host. Versions from 1.0 up to but not including 1.4.8 are affected, and 1.4.8 is the fix.

What's affected

The GitHub advisory GHSA-7v4r-c989-xh26 lists the pip package bentoml, affected versions >=1.0,<1.4.8, patched in 1.4.8. The NVD record describes the problem as insecure deserialization in the runner server, reachable by setting specific headers and parameters in a POST request, leading to arbitrary code execution on the server.

The weakness class is CWE-502 (deserialization of untrusted data). The CVSS 3.1 vector is CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H: network reachable, low complexity, no login, full impact on all three properties.

The record's KEV flag is false and the advisory does not report attacks in the wild. The advisory does include a proof of concept, which is public. I am not repeating it here.

How to check if you're exposed

Check the installed version in every environment that serves models.

pip show bentoml
pip list 2>/dev/null | grep -i bentoml
grep -ri "bentoml" requirements*.txt pyproject.toml poetry.lock 2>/dev/null

Anything between 1.0 and 1.4.7 is affected. Remember to check container images as well as virtual environments, since a pinned old version can sit in a base image. Then ask a second question: is a runner server port reachable from anywhere other than the API process that talks to it? The flaw is in the runner server, so exposure depends on who can send it requests.

The free in-browser dependency scan takes a manifest or lockfile and lists known CVEs for the packages in it, and the Gold directory lets you look up a CVE by id.

What to do now

  1. Upgrade bentoml to 1.4.8 or later and rebuild any images or bentos that pinned an older version.
  2. Redeploy every service that uses runners, then confirm the running version with the command above.
  3. Make sure runner servers listen only on a private interface or socket, and that only your own API process can reach them.
  4. Put network policy or a service mesh rule around model serving pods.
  5. Look at serving hosts for processes or files you do not recognise, since the impact of this class of bug is code execution as the serving user.
  6. Review any other place your pipeline loads pickled data, and treat it as code.

Why it matters

Deserialization turns bytes back into objects. Some formats, Python's pickle among them, can run code as part of that conversion, so loading data from an untrusted source is the same as running code from it. Model serving frameworks use these formats because models themselves are often saved that way.

The runner server is an internal component, which is why network isolation is as important as the upgrade. A good rule for ML infrastructure is to treat every serialization boundary as a trust boundary and prefer formats that carry data only.

Try it yourself

Click through it at your own pace, or open it full screen.

Quick check

Which versions are affected?

The advisory lists bentoml from 1.0 up to but not including 1.4.8. Version 1.4.8 is the patched release.

Is the runner server public by default?

The advisory does not say. Check your own deployment, and keep runners off public networks.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.