CVE-2026-39306: PraisonAI: recipe path traversal allows arbitrary file write

GHSA-4rx4-4r3x-6534 HIGH PoC AVAILABLE CISA: TRACK*
Published April 6, 2026
CISO Take

PraisonAI's recipe registry pull flow uses Python's tar.extractall() without validating archive member paths, allowing any publisher with registry access to craft a malicious recipe bundle that writes files anywhere on a victim's filesystem upon pull. This is a classic supply chain attack — the attacker publishes once and every downstream user who pulls that recipe is compromised; CI/CD pipelines that automate recipe pulls are especially exposed since they typically run with elevated privileges near sensitive project files and credentials. The PoC is public and the technique (tar/zip slip) is trivially weaponizable at script-kiddie level, making exploitation realistic despite no active KEV listing or confirmed in-the-wild exploitation. Patch immediately to PraisonAI 4.5.113; if patching is delayed, lock down publish access on any shared registry and treat untrusted recipe sources as hostile.

Sources: GitHub Advisory NVD ATLAS

What is the risk?

High risk for any team using PraisonAI's recipe workflow in shared or automated environments. Exploitation requires publish access to a registry that victims pull from — a realistic bar in team settings or if a shared registry is compromised. CVSS 7.3 reflects high integrity and availability impact with a network attack vector and low attack complexity. The technique is well-understood and the public PoC lowers exploitation to trivial. Risk is elevated by automation exposure in CI/CD contexts where pulls may be unsupervised and run with broad filesystem access. No active exploitation confirmed and no KEV listing, but the low sophistication bar warrants prompt remediation.

What systems are affected?

Package Ecosystem Vulnerable Range Patched
PraisonAI pip <= 4.5.112 4.5.113
1 dependents 84% patched ~0d to patch Full package profile →

Do you use PraisonAI? You're affected.

Severity & Risk

CVSS 3.1
7.3 / 10
EPSS
0.1%
chance of exploitation in 30 days
Higher than 16% of all CVEs
Exploitation Status
Exploit Available
Exploitation: MEDIUM
Sophistication
Trivial
Exploitation Confidence
medium
CISA SSVC: Public PoC
Public PoC indexed (trickest/cve)
Composite signal derived from CISA KEV, CISA SSVC, EPSS, trickest/cve, and Nuclei templates.

Attack Surface

AV AC PR UI S C I A
AV Network
AC Low
PR Low
UI Required
S Unchanged
C None
I High
A High

What should I do?

5 steps
  1. Patch: upgrade PraisonAI to 4.5.113 immediately — the fix replaces raw tar.extractall() with path-validated extraction that rejects absolute paths and traversal sequences.

  2. Audit: search for unexpected files in parent directories of typical recipe output locations; cross-reference filesystem mtimes against recent pull operations.

  3. Restrict: if patching is delayed, limit registry publish access to verified publishers only and treat any recipe from an external or unverified registry as untrusted.

  4. CI/CD hardening: run recipe pull steps in isolated containers or restricted chroots with a minimal filesystem to contain traversal blast radius.

  5. Detection: monitor for file creation events outside expected recipe extraction directories during pull operations; alert on processes spawning tar/extractall that create files in parent directory paths.

CISA SSVC Assessment

Decision Track*
Exploitation poc
Automatable No
Technical Impact partial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

Classification

Compliance Impact

This CVE is relevant to:

EU AI Act
Article 15 - Accuracy, robustness and cybersecurity
ISO 42001
A.6.2.5 - AI supply chain security
NIST AI RMF
GOVERN 6.1 - Policies and procedures for AI supply chain risk management
OWASP LLM Top 10
LLM03:2025 - Supply Chain

Frequently Asked Questions

What is CVE-2026-39306?

PraisonAI's recipe registry pull flow uses Python's tar.extractall() without validating archive member paths, allowing any publisher with registry access to craft a malicious recipe bundle that writes files anywhere on a victim's filesystem upon pull. This is a classic supply chain attack — the attacker publishes once and every downstream user who pulls that recipe is compromised; CI/CD pipelines that automate recipe pulls are especially exposed since they typically run with elevated privileges near sensitive project files and credentials. The PoC is public and the technique (tar/zip slip) is trivially weaponizable at script-kiddie level, making exploitation realistic despite no active KEV listing or confirmed in-the-wild exploitation. Patch immediately to PraisonAI 4.5.113; if patching is delayed, lock down publish access on any shared registry and treat untrusted recipe sources as hostile.

Is CVE-2026-39306 actively exploited?

Proof-of-concept exploit code is publicly available for CVE-2026-39306, increasing the risk of exploitation.

How to fix CVE-2026-39306?

1. Patch: upgrade PraisonAI to 4.5.113 immediately — the fix replaces raw tar.extractall() with path-validated extraction that rejects absolute paths and traversal sequences. 2. Audit: search for unexpected files in parent directories of typical recipe output locations; cross-reference filesystem mtimes against recent pull operations. 3. Restrict: if patching is delayed, limit registry publish access to verified publishers only and treat any recipe from an external or unverified registry as untrusted. 4. CI/CD hardening: run recipe pull steps in isolated containers or restricted chroots with a minimal filesystem to contain traversal blast radius. 5. Detection: monitor for file creation events outside expected recipe extraction directories during pull operations; alert on processes spawning tar/extractall that create files in parent directory paths.

What systems are affected by CVE-2026-39306?

This vulnerability affects the following AI/ML architecture patterns: agent frameworks, CI/CD pipelines, development environments, AI orchestration platforms.

What is the CVSS score for CVE-2026-39306?

CVE-2026-39306 has a CVSS v3.1 base score of 7.3 (HIGH). The EPSS exploitation probability is 0.05%.

Technical Details

NVD Description

### Summary PraisonAI's recipe registry pull flow extracts attacker-controlled `.praison` tar archives with `tar.extractall()` and does not validate archive member paths before extraction. A malicious publisher can upload a recipe bundle that contains `../` traversal entries and any user who later pulls that recipe will write files outside the output directory they selected. This is a path traversal / arbitrary file write vulnerability on the client side of the recipe registry workflow. It affects both the local registry pull path and the HTTP registry pull path. The checksum verification does not prevent exploitation because the malicious traversal payload is part of the signed bundle itself. ### Details The issue is caused by unsafe extraction of tar archive contents during recipe pull. 1. A malicious publisher creates a valid `.praison` bundle whose `manifest.json` is benign enough to pass publish, but whose tar members include traversal entries such as: ```text ../../escape-http.txt ``` 2. `LocalRegistry.publish()` in `src/praisonai/praisonai/recipe/registry.py:214-287` only reads `manifest.json`, calculates a checksum, and stores the uploaded bundle. It does not inspect or sanitize the rest of the tar members before saving the archive. 3. When a victim later pulls the recipe from a local registry, `LocalRegistry.pull()` in `src/praisonai/praisonai/recipe/registry.py:289-345` extracts the tarball directly: ```python recipe_dir = output_dir / name recipe_dir.mkdir(parents=True, exist_ok=True) with tarfile.open(bundle_path, "r:gz") as tar: tar.extractall(recipe_dir) ``` 4. The HTTP client path is also vulnerable. `HttpRegistry.pull()` in `src/praisonai/praisonai/recipe/registry.py:691-739` downloads the bundle and then performs the same unsafe extraction: ```python recipe_dir = output_dir / name recipe_dir.mkdir(parents=True, exist_ok=True) with tarfile.open(bundle_path, "r:gz") as tar: tar.extractall(recipe_dir) ``` 5. Because no archive member validation is performed, traversal entries escape `recipe_dir` and create files elsewhere on disk. Verified vulnerable behavior: - Published recipe name: `evil-http` - Victim-selected output directory: `/tmp/praisonai-pull-traversal-poc/victim-output` - Artifact created outside that directory: `/tmp/praisonai-pull-traversal-poc/escape-http.txt` - Artifact contents: `owned over http` This demonstrates that a remote publisher can cause filesystem writes outside the pull destination chosen by another user. ### PoC Run the single verification script from the checked-out repository: ```bash cd "/Users/r1zzg0d/Documents/CVE hunting/targets/PraisonAI" python3 tmp/pocs/poc2.py ``` Expected vulnerable output: ```text [+] Publish result: {'ok': True, 'name': 'evil-http', 'version': '1.0.0', ...} [+] Pull result: {'name': 'evil-http', 'version': '1.0.0', ...} [+] Outside artifact exists: True [+] Artifact also inside output dir: False [+] Outside artifact content: 'owned over http\n' [+] RESULT: VULNERABLE - pulling the recipe created a file outside the chosen output directory. ``` Then verify the created file manually: ```bash ls -l /tmp/praisonai-pull-traversal-poc/escape-http.txt cat /tmp/praisonai-pull-traversal-poc/escape-http.txt find /tmp/praisonai-pull-traversal-poc -maxdepth 3 | sort ``` What the script does internally: 1. Starts a local PraisonAI recipe registry server. 2. Builds a malicious `.praison` bundle containing the tar entry `../../escape-http.txt`. 3. Publishes the malicious bundle to the local HTTP registry. 4. Simulates a victim pulling that recipe into `/tmp/praisonai-pull-traversal-poc/victim-output`. 5. Confirms that the file is created outside the chosen output directory. ### Impact This is a path traversal / arbitrary file write vulnerability in the recipe pull workflow. Impacted parties: - Users who pull recipes from an untrusted or shared PraisonAI registry. - Teams running internal registries where one publisher can influence what other users pull. - Automated systems or CI jobs that fetch recipes into working directories near sensitive project files. Security impact: - Integrity impact is high because an attacker can create or overwrite files outside the expected extraction directory. - Availability impact is significant if the overwritten target is a config file, project file, startup script, or another operational artifact. - The issue crosses a real security boundary because the attacker only needs to publish a malicious recipe, while the victim triggers the write by pulling it. ### Remediation 1. Replace raw `tar.extractall()` with a safe extraction routine that validates every `TarInfo` member before extraction. Reject absolute paths, `..` segments, and any resolved path that escapes the intended extraction directory. 2. Apply the same archive member validation in both `LocalRegistry.pull()` and `HttpRegistry.pull()` so that local and remote registry clients share the same safety guarantees. 3. Consider validating tar contents during publish as well, so malicious bundles are rejected before they ever enter the registry and cannot be served to downstream users.

Exploitation Scenario

An attacker registers as a publisher on a shared internal PraisonAI registry used by a development team. They craft a .praison bundle whose manifest.json passes publish checks, but whose tar members include traversal entries targeting high-value files — for example ../../.ssh/authorized_keys to inject their own SSH public key, or ../../.github/workflows/deploy.yml to backdoor the CI/CD pipeline. They publish the recipe under an innocuous name. When a developer or automated CI job pulls the recipe as part of normal AI agent development workflow, the malicious tar entries escape the extraction directory and overwrite the targeted files silently. The attacker gains persistent access or arbitrary code execution within the CI/CD environment, enabling downstream supply chain compromise of any artifact the pipeline builds and deploys.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:H

Timeline

Published
April 6, 2026
Last Modified
April 6, 2026
First Seen
April 7, 2026

Related Vulnerabilities