CVE-2026-57131
praisonai: Jobs API exposes agent-execution endpoints with no authentication
PraisonAI is a multi-agent teams system. Prior to 4.6.58, praisonai.jobs.server.create_app mounts praisonai.jobs.router.create_router under /api/v1/runs without authentication or per-job authorization. Network clients can submit attacker-controlled prompts and agent configuration, list and read jobs, stream results, and cancel or delete other jobs, exposing service credentials and connected tool capabilities to unauthorized agent execution. This vulnerability is fixed in 4.6.58.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.8
praisonai: Jobs API exposes agent-execution endpoints with no authentication
PraisonAI is a multi-agent teams system. Prior to 4.6.58, praisonai.jobs.server.create_app mounts praisonai.jobs.router.create_router under /api/v1/runs without authentication or per-job authorization. Network clients can submit attacker-controlled prompts and agent configuration, list and read jobs, stream results, and cancel or delete other jobs, exposing service credentials and connected tool capabilities to unauthorized agent execution. This vulnerability is fixed in 4.6.58.
- Record
CVE-2026-57131- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-94, CWE-306, CWE-862
- Updated
- 2026-11-02
EUVDEUVD-2026-77597
9.8
PraisonAI is a multi-agent teams system. Prior to 4.6.58, praisonai.jobs.server.create_app mounts praisonai.jobs.router.create_router under /api/v1/runs without authentication or per-job authorization. Network clients can submit attacker-controlled prompts and agent configuration, list and read jobs, stream results, and cancel or delete other jobs, exposing service credentials and connected tool capabilities to unauthorized agent execution. This vulnerability is fixed in 4.6.58.
- Record
EUVD-2026-77597- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-fq2m-6wqh-x44g
9.8
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:
- Execute arbitrary agent code —
POST /api/v1/runsacceptsprompt,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). - List and read every job system-wide —
GET /api/v1/runslists all jobs;GET /api/v1/runs/{job_id}/resultreturns 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. - Cancel or delete any job —
POST /…/cancelandDELETE /…/{job_id}accept arbitrary job IDs without any ownership / authorization check. - Stream live SSE of any in-flight job —
GET /…/{job_id}/streamreads 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),
…
- Record
GHSA-fq2m-6wqh-x44g- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-94, CWE-306, CWE-862
- Updated
- 2026-11-02
NVD
9.8
PraisonAI is a multi-agent teams system. Prior to 4.6.58, praisonai.jobs.server.create_app mounts praisonai.jobs.router.create_router under /api/v1/runs without authentication or per-job authorization. Network clients can submit attacker-controlled prompts and agent configuration, list and read jobs, stream results, and cancel or delete other jobs, exposing service credentials and connected tool capabilities to unauthorized agent execution. This vulnerability is fixed in 4.6.58.
- Record
CVE-2026-57131- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-94, CWE-306, CWE-862
- Updated
- 2026-11-02
OSV
9.8
praisonai: Jobs API exposes agent-execution endpoints with no authentication
PraisonAI is a multi-agent teams system. Prior to 4.6.58, praisonai.jobs.server.create_app mounts praisonai.jobs.router.create_router under /api/v1/runs without authentication or per-job authorization. Network clients can submit attacker-controlled prompts and agent configuration, list and read jobs, stream results, and cancel or delete other jobs, exposing service credentials and connected tool capabilities to unauthorized agent execution. This vulnerability is fixed in 4.6.58.
- Record
CVE-2026-57131- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-306, CWE-862, CWE-94
- Updated
- 2026-11-02
OSVGHSA-fq2m-6wqh-x44g
9.8
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:
- Execute arbitrary agent code —
POST /api/v1/runsacceptsprompt,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). - List and read every job system-wide —
GET /api/v1/runslists all jobs;GET /api/v1/runs/{job_id}/resultreturns 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. - Cancel or delete any job —
POST /…/cancelandDELETE /…/{job_id}accept arbitrary job IDs without any ownership / authorization check. - Stream live SSE of any in-flight job —
GET /…/{job_id}/streamreads 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),
…
- Record
GHSA-fq2m-6wqh-x44g- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-306, CWE-862, CWE-94
- Updated
- 2026-11-02
OSVPYSEC-2026-3511
9.8
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:
- Execute arbitrary agent code —
POST /api/v1/runsacceptsprompt,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). - List and read every job system-wide —
GET /api/v1/runslists all jobs;GET /api/v1/runs/{job_id}/resultreturns 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. - Cancel or delete any job —
POST /…/cancelandDELETE /…/{job_id}accept arbitrary job IDs without any ownership / authorization check. - Stream live SSE of any in-flight job —
GET /…/{job_id}/streamreads 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),
…
- Record
PYSEC-2026-3511- CVSS 3.1
- 9.8 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
praisonaiPyPI |
before 4.6.59 | 4.6.59 |
praisonaiPyPI |
before 4.6.59, plus listed versions 0.0.10.0.100.0.110.0.120.0.13 Show 45 moreShow less0.0.140.0.150.0.160.0.170.0.180.0.190.0.20.0.200.0.210.0.220.0.230.0.240.0.250.0.260.0.270.0.280.0.290.0.30.0.300.0.310.0.320.0.330.0.340.0.350.0.360.0.370.0.380.0.390.0.40.0.400.0.410.0.420.0.430.0.440.0.450.0.460.0.470.0.480.0.490.0.50.0.500.0.520.0.530.0.540.0.55 |
4.6.59 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-57131 is a critical vulnerability (CVSS 9.8) in Mervinpraison Praisonai, published June 18, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.97%, the 62nd percentile. Fixed in praisonai 4.6.59.
References
github.com/MervinPraison/PraisonAI/security/advisories/GHSA-fq2m-6wqh-x44g
github.com/MervinPraison/PraisonAI/commit/2f9677abb2ea68eab864ee8b6a828fd0141612e1
github.com/MervinPraison/PraisonAI/releases/tag/v4.6.58
github.com/advisories/GHSA-fq2m-6wqh-x44g
github.com/CVEProject/cvelistV5/tree/main/cves/2026/57xxx/CVE-2026-57131.json
nvd.nist.gov/vuln/detail/CVE-2026-57131
github.com/MervinPraison/PraisonAI
pypi.org/project/praisonai
Left out here: 699 versions and the rest of 3 source descriptions. The JSON record has them.