🛡️ CVE-2026-47395 — praisonai

🟡 CVSS 5.5 — Medium ✅ No Known Exploit CWE-200 NVD
5.5
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

PraisonAI CLI automatically resolves @url mentions in prompt text and can read loopback URLs into model context

Summary

PraisonAI's direct-prompt CLI automatically expands @url: mentions in raw prompt text before agent execution begins.

If a prompt contains @url:<http-or-https-url>, the CLI calls MentionsParser.process(...). The @url: handler then performs a direct urllib.request.urlopen() request to the attacker-controlled URL and returns the response body. That response body is prepended to the final model prompt context.

There is no loopback/private-address restriction, no metadata-service restriction, and no approval gate before the fetch.

As a result, attacker-influenced prompt text can cause the operator's machine to fetch localhost-only HTTP resources and inject the response into model context.

Example:

```text

@url:http://localhost.:8766/ summarize this

````

This causes PraisonAI to make an HTTP request to the local machine and prepend the fetched response body to the prompt that the model receives.

This is a narrow local SSRF / local content disclosure issue in automatic prompt preprocessing. It is not a remote server takeover.

Details

The affected direct-prompt CLI path is in:

```text

src/praisonai/praisonai/cli/main.py

```

The CLI imports and instantiates MentionsParser on the direct prompt path:

```python

from praisonaiagents.tools.mentions import MentionsParser

parser = MentionsParser(workspace_path=os.getcwd())

if parser.has_mentions(prompt):

mention_context, prompt = parser.process(prompt)

if mention_context:

prompt = f"{mention_context}# Task:\n{prompt}"

```

This means raw prompt text is interpreted as a mention language before query rewriting, prompt expansion, tool execution, or LLM invocation.

The affected mention implementation is in:

```text

src/praisonai-agents/praisonaiagents/tools/mentions.py

```

@url: is a first-class mention type:

```python

PATTERNS = {

"file": re.compile(r'@file:([^\s]+)'),

"web": re.compile(r'@web:([^\s]+(?:\s+[^\s@]+)*)'),

"doc": re.compile(r'@doc:([^\s]+)'),

"rule": re.compile(r'@rule:([^\s]+)'),

"url": re.compile(r'@url:(https?://[^\s]+)'),

}

```

The URL mention handler performs an unrestricted HTTP request:

```python

req = urllib.request.Request(

url,

headers={'User-Agent': 'Mozilla/5.0 (compatible; PraisonAI/1.0)'}

)

with urllib.request.urlopen(req, timeout=10) as response:

content = response.read().decode('utf-8', errors='ignore')

```

There is no validation rejecting:

```text

127.0.0.1

localhost

localhost.

private RFC1918 addresses

link-local addresses

cloud metadata endpoints

other local-only HTTP services

```

The returned body is added to the generated mention context and then prepended to the prompt.

The resulting chain is:

```text

attacker-influenced prompt text

-> @url:http://localhost.:8766/

-> direct-prompt CLI calls MentionsParser.process(...)

-> _process_url_mention(...)

-> urllib.request.urlopen(attacker URL)

-> loopback HTTP response body is read

-> response body is injected into model prompt context

```

PoC

The following PoC is non-destructive. It starts a local HTTP server on 127.0.0.1:8766, passes a prompt containing @url:http://localhost.:8766/ through the real MentionsParser.process(...) implementation, and confirms that the local response body is injected into the generated prompt context.

Full PoC

```python

#!/usr/bin/env python3

"""Self-contained local replay for PraisonAI CLI @url mention loopback fetch."""

from __future__ import annotations

import sys

import threading

from http.server import BaseHTTPRequestHandler, HTTPServer

from pathlib import Path

REPO_ROOT = Path(__file__).resolve().parents[3] / "repos" / "praisonai"

PRAISON_ROOT = REPO_ROOT / "src" / "praisonai"

AGENTS_ROOT = REPO_ROOT / "src" / "praisonai-agents"

CLI_MAIN = PRAISON_ROOT / "praisonai/cli/main.py"

MENTIONS = AGENTS_ROOT / "praisonaiagents/tools/mentions.py"

def verify_source() -> None:

expected = {

CLI_MAIN: [

"from praisonaiagents.tools.mentions import MentionsParser",

"if parser.has_mentions(prompt):",

"mention_context, prompt = parser.process(prompt)",

'prompt = f"{mention_context}# Task:\\n{prompt}"',

],

MENTIONS: [

'"url": re.compile(r\'@url:(https?://[^\\s]+)\')',

"def _process_url_mention(self, url: str) -> Optional[str]:",

"with urllib.request.urlopen(req, timeout=10) as response:",

],

}

for path, needles in expected.items():

text = path.read_text(encoding="utf-8")

for needle in needles:

if needle not in text:

raise RuntimeError(f"source verification failed: {needle!r} not found in {path}")

class _Handler(BaseHTTPRequestHandler):

hits: list[tuple[str, str | None]] = []

body = b"<html><body>secret-local-page</body></html>"

def do_GET(self) -> None: #

How this vulnerability can be exploited

This issue can be reached with local access to the system, attack complexity is low, an attacker needs no privileges on the target. A user must be tricked into taking some action. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity none, availability none.

Weakness class

CVE-2026-47395 is classified as CWE-200: Exposure of Sensitive Information. Information that should stay internal is disclosed to someone who is not authorised to see it.

Affected software

CVE-2026-47395 is recorded against 3 packages.

  • praisonai (fixed in 4.6.40)
  • praisonaiagents (fixed in 1.6.40)
  • unknown

Timeline and source

Published on 29 May 2026 and last revised on 13 July 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Web)
github.com (Package)

Details

Severity Medium
CVSS Score 5.5
CVSS Vector CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
CWE CWE-200
Public Exploit ✅ No
Source NVD
Published 2026-05-29
Updated 2026-08-12
Modified 2026-07-13
Fix URL N/A

Affected Packages

Software From version Fixed in
praisonai 4.6.40
praisonaiagents 1.6.40
unknown

Similar Threats

Vulnerability Monitoring

Track new vulnerabilities in praisonai

CVE-2026-47395 is rated CVSS 5.5 Medium. BotEraser monitors your WordPress installation and notifies you when software you use appears in our vulnerability database.

Set Up Free Alerts →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.