CVE-2026-47393

CRITICALPre-NVD 9.89.8
EchelonGraph scoreLOW confidence

This critical-severity CVE scores 9.8 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit probability: 0.1%, top 76% of all CVEs by exploit prediction. GitHub Security Advisory data not yet ingested — confidence will rise once GHSA publishes (typical lag: hours to days for open-source ecosystem CVEs; never for infrastructure-only CVEs).

Triggered by: NVD CVSS baseline
Sources: cna:github_m, epss
9.8
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS: 0%CVSS: 9.8Exploit: NoneExposed: 0

No vendor fix yet — apply a workaround or compensating control (WAF / firewall / segmentation) and watch for a patch.

PraisonAI deploy --type api emits a Flask server with authentication disabled by default

Summary

CVE-2026-44338 (GHSA-6rmh-7xcm-cpxj) documents that PraisonAI ships a code-generator (praisonai.deploy.api.generate_api_server_code) that emits a Flask API server with authentication disabled by default. Users who follow the documented quickstart (praisonai deploy --type api) get a server that:

  • binds to 0.0.0.0 per the recommended sample YAML
  • exposes /chat and /agents endpoints
  • runs praisonai.run() on user-supplied JSON input — LLM orchestration with the API key materials present in the process environment
  • does not require any authentication

The PyPI wheel praisonai==4.6.33 (current @latest) still ships the generator with auth_enabled defaulting to False. The fix shape is opt-in via APIConfig(auth_enabled=True, auth_token=...).

Details

Anchor (file:line:symbol)

  • Vulnerable artifact: praisonai==4.6.33 on PyPI.
  • Defaults: praisonai/deploy/models.py:29auth_enabled: bool = Field(default=False, ...); praisonai/deploy/models.py:30auth_token: Optional[str] = Field(default=None, ...).
  • Generator: praisonai/deploy/api.py:40AUTH_ENABLED = {config.auth_enabled}; api.py:41AUTH_TOKEN = {repr(config.auth_token)}; api.py:43-49def check_auth(): if not AUTH_ENABLED: return True.
  • CLI entry: documented as praisonai deploy --type api (vendor README); produces the generator output above with no flag required to suppress the warning, because no warning is emitted.

Vulnerable code (verbatim from installed wheel)

# praisonai/deploy/models.py (praisonai==4.6.33)
class APIConfig(BaseModel):
    host: str = Field(default="127.0.0.1", description="Server host")
    port: int = Field(default=8005, description="Server port")
    cors_enabled: bool = Field(default=True, description="Enable CORS")
    auth_enabled: bool = Field(default=False, description="Enable authentication")     # line 29
    auth_token: Optional[str] = Field(default=None, description="Authentication token") # line 30

# praisonai/deploy/api.py (praisonai==4.6.33)
code = f\'\'\'...

Authentication

AUTH_ENABLED = {config.auth_enabled} # False by default AUTH_TOKEN = {repr(config.auth_token)} # None by default

def check_auth(): if not AUTH_ENABLED: return True # short-circuit, accept all token = request.headers.get(\'Authorization\', \'\').replace(\'Bearer \', \'\') return token == AUTH_TOKEN ... \'\'\'

A default invocation of the deploy command emits a server whose check_auth() short-circuits to True and accepts unauthenticated /chat, /agents POSTs.

PoC

#!/usr/bin/env python3
"""
legend-c420 PoC - PraisonAI 4.6.33 generates Flask API server with auth
disabled by default. Class H sibling of CVE-2026-44338.

Phase 1: reflect on praisonai.deploy.models.APIConfig defaults. Phase 2: call generate_api_server_code(default config) and assert the emitted source contains AUTH_ENABLED = False and the short-circuit return. Phase 3: re-run with auth_enabled=True, auth_token='s3cret-bearer-value' and confirm the emitted source flips to the secure shape.

Exit code 0 = PASS = vulnerable defaults confirmed. """ import sys, traceback

def phase1_dataclass_defaults(): print("PHASE 1 - praisonai.deploy.models.APIConfig default values") from praisonai.deploy.models import APIConfig cfg = APIConfig() checks = [ ("auth_enabled", cfg.auth_enabled, False), ("auth_token", cfg.auth_token, None), ] for name, observed, expected in checks: ok = observed == expected mark = "VULNERABLE" if name in ("auth_enabled","auth_token") and ok else "ok" print(f" {name:14s} = {observed!r:18s} (expected {expected!r}) [{mark}]") assert ok print(" >> APIConfig defaults reproduce the CVE-2026-44338 shape.")

def phase2_default_generator_emits_unauth(): print("PHASE 2 - generate_api_server_code(default config) emits unauth server") from praisonai.deploy.models import APIConfig from praisonai.deploy.api import generate_api_server_code src = generate_api_server_code("agents.yaml", config=APIConfig()) for needle in ["AUTH_ENABLED = False","AUTH_TOKEN = None","if not AUTH_ENABLED:","return True"]: assert needle in src, f"missing: {needle!r}" print(f" [FOUND] {needle!r}") print(" >> Default-config generator emits Flask server with check_auth() short-circuit.")

def phase3_fix_shape_available(): print("PHASE 3 - auth_enabled=True flips to secure shape") from praisonai.deploy.models import APIConfig from praisonai.deploy.api import generate_api_server_code cfg = APIConfig(auth_enabled=True, auth_token="s3cret-bearer-value") src = generate_api_server_code("agents.yaml", config=cfg) assert "AUTH_ENABLED = True" in src assert "AUTH_ENABLED = False" not in src print(" >> Fix shape works when toggled. Class H confirmed: default is insecure.")

def main(): print("=" * 64) print("legend-c420 PoC - PraisonAI default-config AUTH_ENABLED=False") print("=" * 64) try: phase1_dataclass_defaults() phase2_default_generator_emits_unauth() phase3_fix_shape_available() except Exception: traceback.print_exc() print("FAIL"); sys.exit(2) print("PASS 3/3 phases. EXIT 0.") sys.exit(0)

if __name__ == "__main__": main()

PoC dependencies: praisonai==4.6.33 from PyPI. Tested on Python 3.11.

Run log verdict: PASS 3/3 phases. EXIT 0. — vulnerable-default shape confirmed. auth_enabled=False by default, check_auth() short-circuits to True, fix toggle exists but is opt-in.

Impact

An operator who runs the vendor-documented quickstart (pip install praisonai && praisonai deploy --type api) gets a network-reachable Flask server that invokes praisonai.run() on attacker-supplied JSON with the user's LLM API keys in the process environment. The attacker reaches arbitrary LLM-orchestration (including any tool-use the agents define, which in PraisonAI commonly includes python_repl, bash, file I/O, and HTTP calls), with the host's API-key credit billed to the operator.

  • Belief: CVE-2026-44338 was filed and triaged.
  • Reality: praisonai==4.6.33 is current @latest on PyPI (2026-05-16). The generator still defaults to auth_enabled=False.
  • Gap: The CVE acknowledges the fix shape exists. The fix is opt-in. The default-config consumer remains vulnerable.

Parent CVE: CVE-2026-44338 / GHSA-6rmh-7xcm-cpxj

CVSS v3
9.8
EG Score
9.8(low)
EPSS
23.9%
KEV
Not listed

Published

May 29, 2026

Last Modified

May 29, 2026

Vendor Advisories for CVE-2026-47393(1)

These vendors published their own advisory mentioning this CVE — often with vendor-specific remediation steps + affected product lists not in NVD.

Affected Packages

(1 across 1 ecosystem)
PyPI(1)
PackageVulnerable rangeFixed inDependents
praisonai0.0.1 ... 4.6.9 (731 versions)4.6.40

Data Freshness Timeline

(refreshed 8× in last 7d / 63× in last 30d)

Each row is a source pipeline that fetched or updated this CVE on that date, with what changed. For example, "NVD update" means NVD published or revised its analysis for this CVE; "MITRE cvelistV5" means we ingested or refreshed it from the CNA feed. Most recent first.

Showing the most recent 100 of 164 total refreshes for this CVE.

  1. 2026-07-16 10:00 UTCEG score recompute
  2. 2026-07-16 01:46 UTCEG score recompute
  3. 2026-07-14 21:56 UTCEG score recompute
  4. 2026-07-14 17:34 UTCEG score recompute
  5. 2026-07-14 13:45 UTCEG score recompute
  6. 2026-07-12 00:56 UTCEG score recompute
  7. 2026-07-11 20:46 UTCEG score recompute
  8. 2026-07-11 16:55 UTCEG score recompute
  9. 2026-07-08 22:42 UTCEG score recompute
  10. 2026-07-08 17:15 UTCEG score recompute
  11. 2026-07-02 23:01 UTCEG score recompute
  12. 2026-07-02 18:55 UTCEG score recompute
  13. 2026-07-02 12:49 UTCEG score recompute
  14. 2026-07-02 08:09 UTCEG score recompute
  15. 2026-07-02 03:42 UTCEG score recompute
  16. 2026-07-01 20:33 UTCEG score recompute
  17. 2026-07-01 16:43 UTCEG score recompute
  18. 2026-07-01 12:27 UTCEG score recompute
  19. 2026-07-01 08:37 UTCEG score recompute
  20. 2026-07-01 01:17 UTCEG score recompute
  21. 2026-06-30 09:27 UTCEG score recompute
  22. 2026-06-30 05:36 UTCEG score recompute
  23. 2026-06-30 00:52 UTCEG score recompute
  24. 2026-06-29 20:09 UTCEG score recompute
  25. 2026-06-29 16:18 UTCEG score recompute
Show 75 more
  1. 2026-06-29 12:27 UTCEG score recompute
  2. 2026-06-29 03:29 UTCEG score recompute
  3. 2026-06-28 23:37 UTCEG score recompute
  4. 2026-06-28 19:46 UTCEG score recompute
  5. 2026-06-28 15:54 UTCEG score recompute
  6. 2026-06-28 11:09 UTCEG score recompute
  7. 2026-06-28 07:18 UTCEG score recompute
  8. 2026-06-28 03:27 UTCEG score recompute
  9. 2026-06-27 23:37 UTCEG score recompute
  10. 2026-06-27 19:47 UTCEG score recompute
  11. 2026-06-27 15:53 UTCEG score recompute
  12. 2026-06-27 12:03 UTCEG score recompute
  13. 2026-06-27 08:01 UTCEG score recompute
  14. 2026-06-27 04:11 UTCEG score recompute
  15. 2026-06-27 00:02 UTCEG score recompute
  16. 2026-06-26 20:00 UTCEG score recompute
  17. 2026-06-26 16:10 UTCEG score recompute
  18. 2026-06-26 02:26 UTCEG score recompute
  19. 2026-06-25 22:36 UTCEG score recompute
  20. 2026-06-25 18:38 UTCEG score recompute
  21. 2026-06-25 14:48 UTCEG score recompute
  22. 2026-06-25 10:58 UTCEG score recompute
  23. 2026-06-25 06:18 UTCEG score recompute
  24. 2026-06-25 02:23 UTCEG score recompute
  25. 2026-06-24 22:32 UTCEG score recompute
  26. 2026-06-24 15:10 UTCEG score recompute
  27. 2026-06-24 02:44 UTCEG score recompute
  28. 2026-06-18 22:20 UTCEG score recompute
  29. 2026-06-18 10:16 UTCEG score recompute
  30. 2026-06-18 02:53 UTCEG score recompute
  31. 2026-06-17 23:04 UTCEG score recompute
  32. 2026-06-17 19:13 UTCEG score recompute
  33. 2026-06-17 15:24 UTCEG score recompute
  34. 2026-06-17 11:32 UTCEG score recompute
  35. 2026-06-17 07:41 UTCEG score recompute
  36. 2026-06-17 03:14 UTCEG score recompute
  37. 2026-06-16 23:24 UTCEG score recompute
  38. 2026-06-16 19:34 UTCEG score recompute
  39. 2026-06-16 15:41 UTCEG score recompute
  40. 2026-06-16 11:51 UTCEG score recompute
  41. 2026-06-16 08:01 UTCEG score recompute
  42. 2026-06-16 04:10 UTCEG score recompute
  43. 2026-06-16 00:17 UTCEG score recompute
  44. 2026-06-15 20:27 UTCEG score recompute
  45. 2026-06-15 13:12 UTCEG score recompute
  46. 2026-06-15 09:20 UTCEG score recompute
  47. 2026-06-15 04:42 UTCEG score recompute
  48. 2026-06-15 00:52 UTCEG score recompute
  49. 2026-06-14 23:18 UTCEPSS rescore
  50. 2026-06-14 21:02 UTCEG score recompute
  51. 2026-06-14 17:12 UTCEG score recompute
  52. 2026-06-14 13:20 UTCEG score recompute
  53. 2026-06-14 09:29 UTCEG score recompute
  54. 2026-06-14 05:39 UTCEG score recompute
  55. 2026-06-14 01:46 UTCEG score recompute
  56. 2026-06-13 23:00 UTCEPSS rescore
  57. 2026-06-13 21:56 UTCEG score recompute
  58. 2026-06-13 18:06 UTCEG score recompute
  59. 2026-06-13 13:56 UTCEG score recompute
  60. 2026-06-13 10:06 UTCEG score recompute
  61. 2026-06-13 06:16 UTCEG score recompute
  62. 2026-06-13 02:14 UTCEG score recompute
  63. 2026-06-12 23:12 UTCEPSS rescore
  64. 2026-06-12 22:22 UTCEG score recompute
  65. 2026-06-12 18:30 UTCEG score recompute
  66. 2026-06-12 14:40 UTCEG score recompute
  67. 2026-06-12 10:49 UTCEG score recompute
  68. 2026-06-12 06:59 UTCEG score recompute
  69. 2026-06-12 03:09 UTCEG score recompute
  70. 2026-06-11 23:19 UTCEG score recompute
  71. 2026-06-11 19:29 UTCEG score recompute
  72. 2026-06-11 15:39 UTCEG score recompute
  73. 2026-06-11 11:36 UTCEG score recompute
  74. 2026-06-11 07:45 UTCEG score recompute
  75. 2026-06-11 03:55 UTCEG score recompute

Frequently asked(5)

What is CVE-2026-47393?
CVE-2026-47393 is a critical vulnerability published on May 29, 2026. PraisonAI deploy --type api emits a Flask server with authentication disabled by default Summary CVE-2026-44338 (GHSA-6rmh-7xcm-cpxj) documents that PraisonAI ships a code-generator (praisonai.deploy.api.generateapiserver_code) that emits a Flask API server with authentication disabled by default.…
When was CVE-2026-47393 disclosed?
CVE-2026-47393 was first published in the National Vulnerability Database on May 29, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
Is CVE-2026-47393 actively exploited?
CVE-2026-47393 is not currently on CISA's Known Exploited Vulnerabilities catalog. FIRST EPSS estimates a 23.9% percentile likelihood of exploitation in the next 30 days — higher percentiles indicate greater predicted risk.
What is the CVSS score of CVE-2026-47393?
CVE-2026-47393 has a CVSS v4.0 base score of 9.8 (CNA self-assessment; NVD's own analysis pending). The EG score is currently aggregating — additional source signals are being incorporated as they become available..
How do I remediate CVE-2026-47393?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-47393, EchelonGraph cross-links them in the Vendor Advisories panel below — those typically contain the canonical remediation steps, fixed version numbers, and any vendor-specific mitigations.

Dependency Blast Radius

See which npm, PyPI, Go, and Maven packages are affected by CVE-2026-47393

Explore →

Is Your Infrastructure Affected by CVE-2026-47393?

EchelonGraph automatically scans your cloud infrastructure and maps CVE exposure using blast radius analysis.