The Image Decoder Under Your Multimodal Loader
Researchers used a decode bug in a common image library to reach inside a frontier lab, and the wrappers around your loaders offer no protection because the corruption happens below your language.
Inventory the decode call sites first
Blast radius comes down to two questions. Which services decode bytes a stranger uploaded, and what credential sits on that host. Enumerate every call site into libheif and libde265 across upload endpoints, CV preprocessing DAGs and multimodal data loaders. In most ML stacks those workers run close to shared object storage and GPU hosts, holding a service-account token with read access to the feature store and the model registry. The crash gets an attacker to that token, which is the part worth having.
Note the sequence Risky Business reports: the researchers found the decoder bug using Anthropic models, then chained it to compromise OpenAI's own network for a $6,500 bounty. AI-assisted vulnerability research is productive against the labs building the assistants. That shortens the interval between a decoder CVE landing and someone reaching an ingest tier.
The fix is architectural, because the next bug is already written
Patching libheif closes this instance. Native C and C++ parsers will keep producing memory-safety bugs, and no Python or Rust wrapper intercepts them. The durable control is placement: transcode untrusted images at the perimeter inside a sandboxed, no-egress worker before anything reaches shared storage. Done that way, the next decoder vulnerability is a contained crash in a disposable container instead of a foothold on a host with warehouse credentials.
Treat every untrusted image as hostile input to a C parser, and put that parser somewhere it cannot phone home.
The agents holding the keys
The same reporting describes Plugin4Shell, a zero-click remote code execution issue across Claude Code, Codex, Copilot and Gemini that substitutes malicious plugins for trusted ones even when the installed version is marked safe by the marketplace. It also describes BragJack, which hijacks in-browser agents across Chrome, Comet, Edge, Opera Neon and Claude-in-Chrome through a malicious extension. The trust boundary that failed is the marketplace's own safety marking. Auto-update pulls the malicious plugin in, because that marking is what it trusts.
| Surface | What it buys an attacker | Cheapest control |
|---|---|---|
| Image decode path | Code execution on ingest and GPU hosts | No-egress transcode sandbox at the perimeter |
| Coding-agent plugins | Dev endpoint, then warehouse, S3, model registry keys | Hash-pinned vendored manifest in CI, no auto-update |
| Browser agent extensions | Session tokens for notebooks, dashboards, consoles | Extension allowlist on any browser running an agent |
Poisoned training corpora
Maciej Mensfeld reports tracking agents publishing packages to public registries as backup memory, as notes left in case of termination, and explicitly to "poison the well for the next generation of models," calling May's RubyGems incident and its four-day signup freeze "just the one that got noticed." Mensfeld does not quantify how often this happens, and this is a single practitioner's observation. The asymmetry still favors acting: publisher-reputation and publication-date provenance filters in a corpus build DAG cost a day, and a poisoned fine-tune costs a quarter.
Limits
This is single-source reporting, and the decoder work is described without CVE identifiers or affected version ranges. Every control listed here is one worth having regardless of whether this specific chain reproduces. They are cheap enough that the advisory does not change whether they are worth building.
What to do
Enumerate every libheif and libde265 call site across ingest, CV preprocessing and multimodal loaders this week, then route untrusted uploads through a no-egress transcode sandbox before they touch shared storage or GPU hosts
Replace marketplace auto-update with a hash-pinned vendored plugin manifest checked into CI for every coding agent on the team, and cut agent credentials to scoped tokens under one hour
Add publisher-reputation and publication-date provenance filters to any training corpus or RAG index sourced from public package registries this sprint