🛡️ CVE-2026-57131 — praisonai
Description
PraisonAI: Jobs API exposes agent-execution endpoints with no authentication
# praisonai: Jobs API exposes agent-execution endpoints with no authentication
Researcher: Kai Aizen — SnailSploit (@SnailSploit), Adversarial & Offensive Security Research
Target: https://github.com/MervinPraison/PraisonAI
Package: praisonai on PyPI
Affected version (empirically tested): 4.6.48
Components:
praisonai.jobs.server.create_app—praisonai/jobs/server.pypraisonai.jobs.router.create_router—praisonai/jobs/router.py- Routes mounted at
/api/v1/runs/...
Weakness: CWE-306 Missing Authentication for Critical Function · CWE-862 Missing Authorization · CWE-94 Code Injection (via prompt / agent_yaml).
TL;DR
praisonai ships a standalone async-jobs HTTP server (python -m praisonai.jobs.server --host=0.0.0.0 --port=8005) whose job is to accept job submissions and run agents on the operator's behalf. Every endpoint under /api/v1/runs is unauthenticated. There is no auth_token field, no Depends(verify_*), no middleware that inspects Authorization — the CORS middleware *lists* Authorization in allow_headers (the only signal in the whole module that the developer was aware authentication is a thing), but no route ever reads it.
A network-reachable attacker can:
1. Execute arbitrary agent code — POST /api/v1/runs accepts prompt, agent_yaml, agent_file, config, framework. The job is queued and an executor invokes whichever framework (praisonai / crewai / autogen) the attacker picks, with whichever prompt and tool config the attacker supplies. The job runs in the operator's process — same environment variables, same filesystem, same credentials (OpenAI / Anthropic / Azure / Bedrock keys; tool integrations; on-disk YAML recipes).
2. List and read every job system-wide — GET /api/v1/runs lists all jobs; GET /api/v1/runs/{job_id}/result returns the full result of any completed job. Operator's prompts, the agent's chain-of-thought, tool inputs / outputs, retrieved documents — all readable to an anonymous client.
3. Cancel or delete any job — POST /…/cancel and DELETE /…/{job_id} accept arbitrary job IDs without any ownership / authorization check.
4. Stream live SSE of any in-flight job — GET /…/{job_id}/stream reads the executor's live progress for any job ID.
The remote-RCE shape (1) is the load-bearing one. Even with webhook_url SSRF-guarded (and it is — the model validator at jobs/models.py:42-65 rejects localhost / private IPs), the attacker needs no callback: SSE streaming returns the agent's output directly on the same connection.
Root cause
```
Expected behavior when starting praisonai.jobs.server:
"I'm running an HTTP API my application backend will call.
The CORS middleware permits Authorization, so the server
enforces it. Anonymous attackers cannot submit jobs."
Actual behavior (praisonai 4.6.48):
- server.py:59-152 create_app builds a FastAPI app, adds
CORSMiddleware, includes the jobs router.
NO auth middleware. NO global Depends.
- router.py:43 @router.post("") submit_job(...)
No Depends, no Authorization header read,
no auth_token config field at all.
- router.py:109,148,161,180,205,224 every other route:
likewise, no auth on any of GET-list,
GET-status, GET-result, POST-cancel,
DELETE, GET-stream.
- server.py:117 CORS allow_headers DOES include
"Authorization" — the only token in the
entire jobs/ subpackage that suggests
the developer was thinking about auth.
Impact:
The API is intended to be production-ready (the CORS code at
server.py:96-102 explicitly branches on
os.getenv("ENVIRONMENT") == "production" to harden origins),
yet ships with no authentication layer at all. Operators who
bind the server to a network interface — including the
suggested --host=0.0.0.0 in the CLI parser — expose
unauthenticated agent execution to anyone who can reach the
port.
```
The same package gets auth right elsewhere (praisonai/gateway/server.py auto-generates an auth_token if none is configured and refuses to serve requests without it; praisonai/endpoints/a2u_server.py:250-264 uses hmac.compare_digest on a Bearer token). The jobs API is the outlier.
Empirically affected routes
Verified by PoC against published praisonai==4.6.48 (/api/v1/runs/... paths):
| Method | Path | Unauth result |
|----------|-------------------------------|--------------------------|
| POST | /api/v1/runs | HTTP 202 Accepted, attacker job queued and executor invoked the framework |
| GET | /api/v1/runs
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability high.
Weakness class
CVE-2026-57131 is classified as CWE-306: Missing Authentication for Critical Function. A sensitive function can be reached without authenticating at all.
Affected software
CVE-2026-57131 is recorded against 1 package.
- praisonai (fixed in 4.6.59)
Timeline and source
Published on 18 June 2026 and last revised on 23 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.
References
Details
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| praisonai | — | 4.6.59 |
References
Similar Threats
- Medium CVE-2026-40112
- High CVE-2026-40113
- High CVE-2026-40114
- Critical CVE-2026-39888
- High CVE-2026-39889
More CVE 2026 advisories
Browse all of CVE 2026 in the advisory index.
Exploit Protection
Are you running praisonai?
CVE-2026-57131 carries CVSS 9.5 Critical rating. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.
Check My Site For CVE-2026-57131 →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.