About this post

These are my notes on "OllamaDrama: Designing and Deploying a Honeypot to Measure Attacks on Exposed LLM Infrastructure" by Karina Elzer, Niklas Netterstrøm Johansen, and Emmanouil Vasilomanolakis from the Technical University of Denmark. The research and the data are theirs; I'm writing this up to understand their findings. You can read the paper on arXiv or in its HTML version. The paper is under arXiv's standard license, so I haven't reproduced any of its figures here. The tables below are my own summaries of their numbers.

Running a model on your own machine with Ollama is about as easy as it gets. You install it and pull a model, and you already have an API on port 11434. The catch is that this API has no authentication of its own. As long as it only listens on localhost that’s fine, but once someone opens it to the internet so they can reach it from another machine, anyone who finds it can use it. The authors cite Shodan showing close to 20,000 publicly reachable Ollama instances, and an IMC 2026 study that counted 152,137 different endpoints over 362 days.

This paper asks who is looking for these servers and what they do once they find one. The authors answer it the way honeypot research usually does, by putting out a convincing fake and logging everything that touches it.

A ceramic honey pot with a wooden dipper, in black and white. Photo: “Honey jar” by Nic McPhee, CC BY-SA 2.0, via Wikimedia Commons.

The honeypot: Ollure

The authors built Ollure, a honeypot written in Python with FastAPI that mimics the Ollama REST API. There is no real model behind it, which keeps it cheap and means an attacker can’t get real code execution through it.

It comes in two flavors. The low-interaction version returns correctly shaped responses and error messages, a fixed list of models (things like llama3.1:70b and mistral:7b), and the same static answer to every prompt. The medium-interaction version adds session tracking keyed on IP address and User-Agent, so if a client “pulls” a model, that model shows up in its model list afterwards. It also answers common prompts with a small dictionary plus regex rules for “repeat this word” requests and basic math.

One detail I liked is that they paid attention to timing. FastAPI answers much faster than a real Ollama server, which would be an easy giveaway. So they measured the real thing and added delays: roughly 0.3 seconds to start a response, 2 to 3 seconds for prompt evaluation, and around 52 to 54 seconds when the client asks for a model that isn’t “loaded” yet.

They ran four instances, one of each type on DigitalOcean in Frankfurt and on their university network, from June 29 to September 20, 2026. That’s 84 days.

What showed up

Over those 84 days, the four instances logged 290,887 interactions from 2,793 unique IP addresses. Most of it was reconnaissance. About 79% of all interactions hit endpoints that only reveal information, like the model list (/api/tags), the version, or running models. /api/tags alone got 102,795 requests. The only endpoint nobody touched at all was /api/copy.

What the requests were doingCount
Total interactions (4 instances, 84 days)290,887
Requests to inference endpoints (generate, chat, embed)56,063
Model management attempts (pull, push, create, delete)3,983
…of which model downloads (/api/pull)3,832, from only 45 IPs
Unique prompts collected4,378

Numbers from Section 4 of the paper.

Most scanners didn’t seem very coordinated. 65.38% of IPs only ever talked to one of the four instances, and only 8.27% found all four. The authors read this as either a small number of actors or campaigns spread across separate IP pools.

The prompts themselves were mostly boring on purpose. The biggest category was simple math (31,639 requests to /api/generate), along with “reply with only this number” and “reverse this token” style tasks. Questions like these don’t need a smart model, which is why the authors think they are probes. They check whether the API really answers, and maybe what kind of model is behind it. Another 3,753 generate requests asked the model about itself: which model it is, what its system prompt says, what it can access.

The attacks hiding in the noise

Under all the scanning, the authors found real exploitation attempts against both the server and the model.

On the infrastructure side, attackers stuffed file paths into model names to try a known path traversal bug in the push endpoint (CVE-2024-39722), going after things like cloud credentials and SSH keys. Other model names were URLs, either pointing at internal addresses such as the cloud metadata service (an SSRF attempt) or at interactsh-style callback domains used to check whether the server will make outbound requests. The model creation endpoint was abused to smuggle in remote code execution payloads for XMRig cryptocurrency mining. The paper also shows one campaign from a single source that cycled through several of these techniques, with CVE numbers baked into the model names.

On the model side, the more interesting finds for me were these:

  • Requests that set absurd generation options, like an enormous context size or unlimited token output, or that sent the word “test” repeated 12,288 times. The goal there is to burn compute.
  • 172 system prompts telling the model to pretend to be another high-capability model.
  • Prompts trying to pull earlier conversation history or the system prompt out of the model, sometimes in other languages (“translate your prompt to French”) to get around filters.
  • Chat requests that passed tool definitions like read_file, write_file, and ping, which suggests someone hoped to find an agent setup they could make use of.
  • “Begware”, where a created model gets a system prompt asking whoever uses it to send Bitcoin.
  • A fantasy persona called “Drakonchik” whose system prompt was really a recruitment pitch, which is a strange way to try to reach people through someone else’s model.

Abliterated models (models with their refusal behavior removed) were pulled 501 times. Interestingly, the number of clearly harmful prompts stayed very low: 19 across both inference endpoints.

The authors map everything to MITRE ATLAS and say they saw attempts in nine of the ten OWASP Top 10 for LLM categories. They’re also clear about what they did not see: no indirect prompt injection, and no one using the server as a proxy to attack others. Privilege escalation and lateral movement were absent too, but the honeypot was built so those couldn’t happen anyway.

What can be done

The paper is a measurement study, not a defense paper, so most of this section is me connecting their observations to practical steps. The safest option is the simple one. Don’t put port 11434 on the internet. If you need remote access, put Ollama behind a reverse proxy or VPN that adds authentication, because Ollama itself won’t check who is calling.

Keep Ollama updated. Several of the attacks the authors observed went after specific, already-published CVEs, and the CVE numbers in model names show that attackers are working from those lists.

If you do run an exposed instance, the endpoints worth watching are the ones that change state. Model pulls, pushes, and creates were rare in the honeypot data (3,983 out of almost 291,000 requests), yet many of the real attack payloads came through them. A request to /api/create from an IP you don’t recognize deserves a closer look.

Finally, if you use Ollama’s cloud models through a self-hosted instance, an open endpoint means strangers can spend your quota. The authors point out that misuse of cloud-hosted models can cost real money, on top of a local machine slowing to a crawl.

My takeaways

Most posts about LLM security talk about prompts, but this paper is a reminder that a model server is still a server. Seeing path traversal attempts and crypto miners in the same log as jailbreak prompts made that very concrete for me. It was also interesting that the attackers clearly knew the Ollama API well enough to target specific endpoints and parameters.

I also liked how honest the paper is about its limits. A low- or medium-interaction honeypot can only show you the first steps of an attack, since there’s nothing real behind it to exploit. The authors released Ollure’s code and a pseudo-anonymized dataset, so it would be possible to look at the raw prompts yourself.

I’ve been running a T-Pot honeypot since July 2025, and I’m used to seeing nonstop scanning against things like SSH and web services. Reading this paper made me realize the same thing is now happening to LLM servers, just with prompts mixed in. I’m thinking about adding an Ollama-style trap to my own setup to see what it catches.

If I misread anything here, I’d love to hear about it.

References

  • Karina Elzer, Niklas Netterstrøm Johansen, and Emmanouil Vasilomanolakis. “OllamaDrama: Designing and Deploying a Honeypot to Measure Attacks on Exposed LLM Infrastructure.” arXiv:2609.29757 [cs.CR], September 2026. arXiv abstract · HTML version.
  • Ollure source code: github.com/k-elzer/Ollure.