CVE-2026-39308
PraisonAI recipe registry publish path traversal allows out-of-root file write
PraisonAI is a multi-agent teams system. Prior to 1.5.113, PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400. This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it. This vulnerability is fixed in 1.5.113.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- High
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
7.1
PraisonAI recipe registry publish path traversal allows out-of-root file write
PraisonAI is a multi-agent teams system. Prior to 1.5.113, PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400. This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it. This vulnerability is fixed in 1.5.113.
- Record
CVE-2026-39308- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-19802
7.1
PraisonAI is a multi-agent teams system. Prior to 1.5.113, PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400. This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it. This vulnerability is fixed in 1.5.113.
- Record
EUVD-2026-19802- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-r9x3-wx45-2v7f
7.1
PraisonAI recipe registry publish path traversal allows out-of-root file write
Summary
PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400.
This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it.
Details
The bug is caused by the order of operations between the HTTP handler and the registry storage layer.
RegistryServer._handle_publish()insrc/praisonai/praisonai/recipe/server.py:370-426parsesPOST /v1/recipes/{name}/{version}, writes the uploaded.praisonfile to a temporary path, and immediately calls:
result = self.registry.publish(tmp_path, force=force)
LocalRegistry.publish()insrc/praisonai/praisonai/recipe/registry.py:214-287opens the uploaded tarball, readsmanifest.json, and trusts the attacker-controllednameandversionfields:
name = manifest.get("name")
version = manifest.get("version")
recipe_dir = self.recipes_path / name / version
recipe_dir.mkdir(parents=True, exist_ok=True)
bundle_name = f"{name}-{version}.praison"
dest_path = recipe_dir / bundle_name
shutil.copy2(bundle_path, dest_path)
- Validation helpers already exist in the same file:
def _validate_name(name: str) -> bool:
def _validate_version(version: str) -> bool:
but they are not called before the filesystem write.
- Only after
publish()returns does the route compare the manifest values with the URL values:
if result["name"] != name or result["version"] != version:
self.registry.delete(result["name"], result["version"])
return self._error_response(...)
At that point the out-of-root artifact has already been created. The request returns an error, but the write outside the registry root remains on disk.
Verified vulnerable behavior:
- Request path:
/v1/recipes/safe/1.0.0 - Internal manifest name:
../../outside-dir - Server response: HTTP
400 - Leftover artifact:
/tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
This demonstrates that the write occurs before the consistency check and rollback.
PoC
Run the single verification script from the checked-out repository:
cd "/Users/r1zzg0d/Documents/CVE hunting/targets/PraisonAI"
python3 tmp/pocs/poc.py
Expected vulnerable output:
[+] Publish response status: 400
{
"ok": false,
"error": "Bundle name/version (../../[email protected]) doesn't match URL ([email protected])",
"code": "error"
}
[+] Leftover artifact exists: True
[+] Artifact under registry root: False
[+] RESULT: VULNERABLE - upload was rejected, but an out-of-root artifact was still created.
Then verify the artifact manually:
ls -l /tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
find /tmp/praisonai-publish-traversal-poc -maxdepth 2 | sort
What the script does internally:
- Starts a local PraisonAI recipe registry server.
- Builds a malicious
.praisonbundle whose internalmanifest.jsoncontainsname = ../../outside-dir. - Uploads that bundle to the apparently safe route
/v1/recipes/safe/1.0.0. - Receives the expected
400mismatch error. - Confirms that
outside-dir-1.0.0.praisonwas still written outside the configured registry directory.
Impact
This is a path traversal / arbitrary file write vulnerability in the recipe registry publish flow.
Impacted parties:
- Registry operators running the PraisonAI recipe registry service.…
- Record
GHSA-r9x3-wx45-2v7f- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
7.1
PraisonAI is a multi-agent teams system. Prior to 1.5.113, PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400. This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it. This vulnerability is fixed in 1.5.113.
- Record
CVE-2026-39308- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
7.1
PraisonAI recipe registry publish path traversal allows out-of-root file write
PraisonAI is a multi-agent teams system. Prior to 1.5.113, PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400. This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it. This vulnerability is fixed in 1.5.113.
- Record
CVE-2026-39308- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-r9x3-wx45-2v7f
7.1
PraisonAI recipe registry publish path traversal allows out-of-root file write
Summary
PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400.
This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it.
Details
The bug is caused by the order of operations between the HTTP handler and the registry storage layer.
RegistryServer._handle_publish()insrc/praisonai/praisonai/recipe/server.py:370-426parsesPOST /v1/recipes/{name}/{version}, writes the uploaded.praisonfile to a temporary path, and immediately calls:
result = self.registry.publish(tmp_path, force=force)
LocalRegistry.publish()insrc/praisonai/praisonai/recipe/registry.py:214-287opens the uploaded tarball, readsmanifest.json, and trusts the attacker-controllednameandversionfields:
name = manifest.get("name")
version = manifest.get("version")
recipe_dir = self.recipes_path / name / version
recipe_dir.mkdir(parents=True, exist_ok=True)
bundle_name = f"{name}-{version}.praison"
dest_path = recipe_dir / bundle_name
shutil.copy2(bundle_path, dest_path)
- Validation helpers already exist in the same file:
def _validate_name(name: str) -> bool:
def _validate_version(version: str) -> bool:
but they are not called before the filesystem write.
- Only after
publish()returns does the route compare the manifest values with the URL values:
if result["name"] != name or result["version"] != version:
self.registry.delete(result["name"], result["version"])
return self._error_response(...)
At that point the out-of-root artifact has already been created. The request returns an error, but the write outside the registry root remains on disk.
Verified vulnerable behavior:
- Request path:
/v1/recipes/safe/1.0.0 - Internal manifest name:
../../outside-dir - Server response: HTTP
400 - Leftover artifact:
/tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
This demonstrates that the write occurs before the consistency check and rollback.
PoC
Run the single verification script from the checked-out repository:
cd "/Users/r1zzg0d/Documents/CVE hunting/targets/PraisonAI"
python3 tmp/pocs/poc.py
Expected vulnerable output:
[+] Publish response status: 400
{
"ok": false,
"error": "Bundle name/version (../../[email protected]) doesn't match URL ([email protected])",
"code": "error"
}
[+] Leftover artifact exists: True
[+] Artifact under registry root: False
[+] RESULT: VULNERABLE - upload was rejected, but an out-of-root artifact was still created.
Then verify the artifact manually:
ls -l /tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
find /tmp/praisonai-publish-traversal-poc -maxdepth 2 | sort
What the script does internally:
- Starts a local PraisonAI recipe registry server.
- Builds a malicious
.praisonbundle whose internalmanifest.jsoncontainsname = ../../outside-dir. - Uploads that bundle to the apparently safe route
/v1/recipes/safe/1.0.0. - Receives the expected
400mismatch error. - Confirms that
outside-dir-1.0.0.praisonwas still written outside the configured registry directory.
Impact
This is a path traversal / arbitrary file write vulnerability in the recipe registry publish flow.
Impacted parties:
- Registry operators running the PraisonAI recipe registry service.…
- Record
GHSA-r9x3-wx45-2v7f- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVPYSEC-2026-2922
7.1
PraisonAI recipe registry publish path traversal allows out-of-root file write
Summary
PraisonAI's recipe registry publish endpoint writes uploaded recipe bundles to a filesystem path derived from the bundle's internal manifest.json before it verifies that the manifest name and version match the HTTP route. A malicious publisher can place ../ traversal sequences in the bundle manifest and cause the registry server to create files outside the configured registry root even though the request is ultimately rejected with HTTP 400.
This is an arbitrary file write / path traversal issue on the registry host. It affects deployments that expose the recipe registry publish flow. If the registry is intentionally run without a token, any network client that can reach the service can trigger it. If a token is configured, any user with publish access can still exploit it.
Details
The bug is caused by the order of operations between the HTTP handler and the registry storage layer.
RegistryServer._handle_publish()insrc/praisonai/praisonai/recipe/server.py:370-426parsesPOST /v1/recipes/{name}/{version}, writes the uploaded.praisonfile to a temporary path, and immediately calls:
result = self.registry.publish(tmp_path, force=force)
LocalRegistry.publish()insrc/praisonai/praisonai/recipe/registry.py:214-287opens the uploaded tarball, readsmanifest.json, and trusts the attacker-controllednameandversionfields:
name = manifest.get("name")
version = manifest.get("version")
recipe_dir = self.recipes_path / name / version
recipe_dir.mkdir(parents=True, exist_ok=True)
bundle_name = f"{name}-{version}.praison"
dest_path = recipe_dir / bundle_name
shutil.copy2(bundle_path, dest_path)
- Validation helpers already exist in the same file:
def _validate_name(name: str) -> bool:
def _validate_version(version: str) -> bool:
but they are not called before the filesystem write.
- Only after
publish()returns does the route compare the manifest values with the URL values:
if result["name"] != name or result["version"] != version:
self.registry.delete(result["name"], result["version"])
return self._error_response(...)
At that point the out-of-root artifact has already been created. The request returns an error, but the write outside the registry root remains on disk.
Verified vulnerable behavior:
- Request path:
/v1/recipes/safe/1.0.0 - Internal manifest name:
../../outside-dir - Server response: HTTP
400 - Leftover artifact:
/tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
This demonstrates that the write occurs before the consistency check and rollback.
PoC
Run the single verification script from the checked-out repository:
cd "/Users/r1zzg0d/Documents/CVE hunting/targets/PraisonAI"
python3 tmp/pocs/poc.py
Expected vulnerable output:
[+] Publish response status: 400
{
"ok": false,
"error": "Bundle name/version (../../[email protected]) doesn't match URL ([email protected])",
"code": "error"
}
[+] Leftover artifact exists: True
[+] Artifact under registry root: False
[+] RESULT: VULNERABLE - upload was rejected, but an out-of-root artifact was still created.
Then verify the artifact manually:
ls -l /tmp/praisonai-publish-traversal-poc/outside-dir-1.0.0.praison
find /tmp/praisonai-publish-traversal-poc -maxdepth 2 | sort
What the script does internally:
- Starts a local PraisonAI recipe registry server.
- Builds a malicious
.praisonbundle whose internalmanifest.jsoncontainsname = ../../outside-dir. - Uploads that bundle to the apparently safe route
/v1/recipes/safe/1.0.0. - Receives the expected
400mismatch error. - Confirms that
outside-dir-1.0.0.praisonwas still written outside the configured registry directory.
Impact
This is a path traversal / arbitrary file write vulnerability in the recipe registry publish flow.
Impacted parties:
- Registry operators running the PraisonAI recipe registry service.…
- Record
PYSEC-2026-2922- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:L - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
praisonaiPyPI |
through 4.5.112 | 4.5.113 |
praisonaiPyPI |
before 4.5.113, 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.5.113 |
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-39308 is a high vulnerability (CVSS 7.1) in Mervinpraison Praisonai, published April 6, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.34%, the 27th percentile. Fixed in praisonai 4.5.113.
References
github.com/MervinPraison/PraisonAI/security/advisories/GHSA-r9x3-wx45-2v7f
github.com/MervinPraison/PraisonAI/releases/tag/v4.5.113
nvd.nist.gov/vuln/detail/CVE-2026-39308
github.com/advisories/GHSA-r9x3-wx45-2v7f
github.com/CVEProject/cvelistV5/tree/main/cves/2026/39xxx/CVE-2026-39308.json
github.com/MervinPraison/PraisonAI
pypi.org/project/praisonai
Left out here: 621 versions and the rest of 3 source descriptions. The JSON record has them.