Fetching from the wire…
Public story · 2026-09-06 · high
The flaw sits in how DocsGPT builds custom prompts with a template engine built for developer-controlled input.
Why now: NVD published the advisory on September 4.
DocsGPT versions 0.15.0 and earlier run user-supplied custom prompts straight through Jinja with no sanitization and no sandbox, according to NVD's advisory for CVE-2026-31020. Template injection in that path escalates to full remote code execution. No authentication required.
Anyone running a public DocsGPT instance with the custom-prompt feature turned on is exposed with no login wall in front of it. That's the whole attack surface: a text box meant for prompt customization, wired to a template engine that can execute code.
Jinja is built to run inside your own codebase on input you control, not on text a stranger typed into a form. Template engines exist to format developer-written templates, and treating user input as one of those templates is what turns a formatting bug into a code execution bug. That's why sandboxed modes exist for user-facing template rendering, a mode DocsGPT's custom-prompt path apparently skipped.
The advisory doesn't say how long the feature ran unsandboxed before this was reported, or whether a patched release is out. Anyone running DocsGPT publicly with custom prompts enabled should treat the fix as unconfirmed until they check the changelog themselves.
String substitution doesn't have this problem. Neither does a template engine's sandboxed mode, when one exists. The bug shows up specifically when a project reaches for the same full-featured engine it already uses to render its own pages, and hands it end-user text without turning that mode on.
Each link below shares sources, entities, or timing with this story.
AshAi.Actions.Prompt evaluates prompt content through EEx.eval_string/2, and the documented prompt: fn input, context -> ... end form lets prompt text be built from action arguments. Any prompt action incorporating request data compiles attacker-controlled text as Elixir sourc...
CVE-2026-84885, -84886 and -84887 published September 3 against 0.3.1/0.3.2, covering code_agent.py, the OCR HTTP API's ImageData handler via img_bytes, and the model-generated GUI action execution workflow in grounding.py. Same 48-hour window produced the same non-response pa...
Your read-only flag is a claim, not a guarantee. Two independent Postgres MCP servers proved it on September 4. Postgres MCP Pro got CVE-2026-85620 at CVSS 9.2. The bug is one line of reasoning in safe_sql.py: the validator checks function names on FuncCall AST nodes. A functi...
The trick is one line in a file you never read. Manifold Security published eight findings across seven coding agents (Claude Code, Codex, Cursor, Grok Build, Qwen Code, goose, Hermes Agent) that all reduce to the same mechanism. A repository's own .git/config sets core.fsmoni...
Versions through 2.5.8 pass unsanitized LLM-generated arguments straight to exec(), runpy.run_path() and subprocess.run() (NVD). This is Agno's second disclosure this month after CVE-2026-76832, a PythonTools path traversal via file_name, which points at the tool layer as a wh...
The creator of Flask, Jinja, and Ruff just released the most damning quantitative look at AI contributions to open source I've read this year. Armin Ronacher published "Building Pi With Pi" on May 24, analyzing external contributions to the Pi project over 90 days. The numbers...
MindPattern daily
One email a day at 7 AM. Sources and a take on every story. Unsubscribe anytime.