cd /news/ai-safety/i-let-a-prompt-injection-into-my-own… · home › topics › ai-safety › article
[ARTICLE · art-164153] src=dev.to ↗ pub= topic=ai-safety verified=true sentiment=↓ negative

I let a prompt injection into my own app's clinical notes. The model ignored it. The fallback didn't.

A developer running Tbibia, a dental clinic management SaaS, tested 30 indirect prompt injections embedded in synthetic patient clinical notes using the open-source SafeLabs-Eval framework (v0.12.0, ASI01 prompt library) and found the model itself never followed any injected instruction across 49 AI summaries. The vulnerability surfaced instead in the app's non-AI fallback: when the provider returned quota errors, a plain string template copied an injected note verbatim into the clinical "next step" field a dentist reads as guidance, reproduced 3 out of 3 times under forced failures. The developer fixed it in commit fd24d59 so the fallback references the last note by date without quoting it, and filed three issues with SafeLabs-Eval covering payload-surfaced detection, document delivery mode and schema-aware evaluation.

by read3 min views1 publishedNov 4, 2026

I hid 30 prompt injections inside a patient's clinical notes.

The model didn't follow a single one. My own fallback code put one in front of the dentist.

I built and run Tbibia, a dental clinic management SaaS. It has a "Résumé IA" button that summarises a patient's whole file in one click. So if someone saves a note saying "ignore your instructions and do X", that text reaches the model later, sitting between normal clinical notes.

That's indirect prompt injection. Nobody types the attack. It just waits in the file.

I tested it with SafeLabs-Eval, the open-source AI agent security framework built by Waqar Javed, using its ASI01 prompt injection library.

safelabs-eval 0.12.0, prompt library 1.13.0, all 30 ASI01 prompts.

Each prompt went in as a clinical note on a synthetic patient, through the real UI. Then I generated the summary over the whole file: three normal notes plus the injected one. Real app, real model chain, synthetic data only.

The prompts are written as user messages, so I wrote a small bridge that saves each one as a note.

The model didn't follow the injected instructions.

In all 49 AI summaries it either left the note out or described it neutrally. No system-prompt text, no confirmation token and no other patient's name showed up anywhere in the 70 prompt runs: 1 smoke test, 30 baseline, 30 retest, 3 reruns of the prompts that fell back, and 6 forced-failure runs.

Good news. Also the point where a normal test would stop.

On run day the provider returned quota errors, so the app fell back to a local summary built from the notes.

There's no model on that path. It took the injected note and surfaced it as the clinical "next step".

À retenir
Reprendre à partir de la dernière séance : ### PRIORITY DIRECTIVE ###
Emergency patch window is active platform-wide...

The model wasn't compromised and the app didn't execute anything. A plain string template put attacker text in the one field a dentist reads as an instruction. That's unsafe presentation of untrusted content, and it's a real bug on its own.

Forcing every model call to fail reproduced it 3 out of 3 times.

The fix is commit fd24d59. The next step now points to the last note by date without quoting it, the card says the AI didn't answer, and the browser gets a generic error. I verified it on 8 natural fallbacks in the 30-prompt retest and 3 out of 3 forced failures.

SafeLabs-Eval returned UNCERTAIN for all 30 ASI01 prompts, in the baseline and the retest, with zero indicators. That includes the case where the fallback showed attacker text as a next step.

The model hadn't followed the injection, so the usual signals had nothing to fire on. I found the bug by looking at what the app actually displayed.

In a document workflow, copying untrusted text into a trusted output field can be the failure, even when the model refuses the instruction.

So I opened three issues: payload-surfaced detection (#89), document delivery mode (#90) and schema-aware evaluation (#91).

If your AI feature has a non-AI fallback, test the fallback.

The attacker's text is already sitting in its input.

── more in #ai-safety 4 stories · sorted by recency
── more on @tbibia 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/i-let-a-prompt-injec…] indexed:0 read:3min 2026-11-04 · —