CVE-2026-56832

HIGHPre-NVD 8.88.8
EchelonGraph scoreLOW confidence

This high-severity CVE scores 8.8 under the CNA's CVSS (NVD's own analysis pending). EPSS exploit-prediction score not yet available (the EPSS model rescores nightly; freshly-published CVEs typically appear within 48 hours). 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
8.8EG
EchelonGraph verdictPlan a fixSerious severity, but no confirmed exploitation yet.
  • High severity, but no confirmed exploitation yet
CISA-KEV: Not listedEPSS PROB: CVSS: 8.8Exploit: None knownExposed: 0

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

PraisonAI DiscordApproval accepts unrelated channel messages as dangerous-tool approvals

DiscordApproval accepts unrelated channel messages as dangerous-tool approvals

Summary

praisonai.bots.DiscordApproval approves a pending dangerous tool call when it sees any later non-bot message in the configured Discord channel whose text is classified as approval, such as yes.

The decision is not bound to:

  • a Discord reply to the approval message;
  • a Discord thread created for that request;
  • a Discord interaction/button callback for that request;
  • an explicit approver user allowlist; or
  • an approval nonce visible only to intended approvers.

As a result, any user who can post in the configured approval channel can approve a pending high-risk tool call by sending yes after the approval message appears. The same local PoV also shows that the Slack and Telegram messaging approval backends have no explicit approver allowlist parameter, but the primary report-grade issue is the Discord backend's unthreaded channel cross-talk: the approving message does not need to be a reply or otherwise request-bound.

Affected Product

  • Repository: MervinPraison/PraisonAI
  • Ecosystem: pip
  • Package: praisonai
  • Component: Python messaging approval backends
  • Primary affected file: src/praisonai/praisonai/bots/_discord_approval.py
  • Related sibling files:
  • src/praisonai/praisonai/bots/_slack_approval.py
  • src/praisonai/praisonai/bots/_telegram_approval.py
  • Latest PyPI version validated: 4.6.58
  • Current origin/main validated:
1ad58ca02975ff1398efeda694ea2ab78f20cf3e
  • Current origin/main tag validated: v4.6.58

Suggested affected range:

pip:praisonai >= 4.5.2, <= 4.6.58

Representative local sweep:

4.5.0    Discord approval backend not present
4.5.2    vulnerable
4.5.128  vulnerable
4.6.9    vulnerable
4.6.10   vulnerable
4.6.56   vulnerable
4.6.57   vulnerable
4.6.58   vulnerable

Root Cause

DiscordApproval.request_approval() posts an approval message to the configured channel and records the returned message id.

_poll_for_response() then polls channel history with:

f"/channels/{channel_id}/messages?after={message_id}&limit=10"

For each later non-bot message, it reads content, classifies the text, and returns ApprovalDecision(approved=True) when the text is approve/yes. There is no check that the message is a Discord reply to the approval message, belongs to a request-specific thread, came from an intended approver, or contains a request-specific approval token.

Important source evidence from origin/main:

  • _discord_approval.py lines 57-73: constructor accepts token,
channel_id, timeout, and poll_interval; no approver allowlist.
  • _discord_approval.py line 239: polls all messages after the approval
message in the configured channel.
  • _discord_approval.py lines 252-265: skips bot messages, classifies the
remaining text, and approves when the keyword is approve.

The Slack and Telegram backends are better request-scoped than Discord:

  • Slack uses conversations.replies for the approval message thread.
  • Telegram checks the callback/reply message id.

However, both still lack an explicit approver identity parameter. They are included in the PoV and suggested fix because the authorization model should be consistent across all messaging approval backends.

Local PoV

Run against the latest local checkout:

python3 poc/pov_prai_cand_029_messaging_approval_channel_member_bypass.py \
  --repo ../../artifacts/repos/praisonai-v4.6.58 \
  --json

The PoV is local-only. It mocks Slack, Telegram, and Discord API helpers in-process and does not contact those services.

For Discord, the mock sequence is:

  • DiscordApproval posts a critical execute_command approval request to
D_APPROVAL_CHANNEL.
  • The mocked channel-history endpoint returns a later ordinary non-bot
channel message from D_INTRUDER with content yes.
  • DiscordApproval returns approved=True and approver="D_INTRUDER".

Observed output from evidence/pov-v4.6.58.json:

{
  "approval_from_unconfigured_channel_participant": {
    "discord": true,
    "slack": true,
    "telegram": true
  },
  "backends": [
    {
      "backend": "discord",
      "configured_channel_id": "D_APPROVAL_CHANNEL",
      "decision_approved": true,
      "decision_approver": "D_INTRUDER",
      "decision_reason": "Approved via Discord by intruder",
      "intruder_user": "D_INTRUDER"
    }
  ],
  "no_explicit_approver_allowlist_parameters": true,
  "vulnerable": true
}

The command in the approval request is a harmless local sentinel: touch /tmp/prai-cand-029. The PoV stops at the approval decision; it does not execute the tool.

Why This Is Not Intended Behavior

This report does not claim that a deliberately private approval channel with only trusted approvers is unsafe by itself. The narrower issue is that the Discord backend treats an unrelated later channel message as the approval decision for a specific dangerous tool request.

PraisonAI's approval documentation describes approval as a safety control that pauses before dangerous tools and asks a human or channel to allow or deny the specific request. A random later yes in the channel is not evidence that an intended approver reviewed that request.

The existing Slack and Telegram implementations already show request-binding patterns that Discord lacks:

  • Slack scopes to replies for the approval message timestamp.
  • Telegram checks the callback/reply message_id.

The Discord backend should provide at least the same request binding and should also support explicit approver identity checks for deployments where channel membership is broader than approval authority.

Impact

If an application uses DiscordApproval for dangerous tools such as shell commands, file writes, deletes, deployments, or other privileged operations, a low-privileged Discord user with write access to the configured approval channel can approve pending dangerous tool executions.

This can lead to code execution, file modification, deployment changes, or data access with the privileges of the PraisonAI process, depending on which tools the agent exposes behind approval.

The attacker does not need the LLM API key, shell access, repository access, or PraisonAI process access. They only need to be able to post an approval-looking message in the configured approval channel after the approval prompt appears.

Severity

Suggested severity: High.

Rationale:

  • AV: the attacker interacts through a networked Discord channel.
  • AC: sending yes after an approval prompt is enough.
  • PR: the attacker needs permission to post in the configured approval
channel, but no approver-specific permission.
  • UI: no separate victim interaction is needed after the prompt exists.
  • S: the vulnerable approval backend and approved tool run in the PraisonAI
application's security scope.
  • C/I/A: approved dangerous tools can disclose, modify, or destroy data
depending on the configured agent tools.

Remediation

Recommended fixes:

  • For Discord, require approvals to be tied to the request, not merely any
later channel message. Use Discord interactions/buttons with opaque server-side request ids, or require a Discord reply whose message_reference.message_id matches the approval message.
  • Add explicit approver identity configuration to all messaging approval
backends, for example approver_user_ids or allowed_approvers.
  • Reject approvals from users outside the configured approver set, even if the
message appears in the configured channel.
  • Include a per-request nonce or opaque approval id in callbacks and verify it
server side before returning ApprovalDecision(approved=True).
  • Add regression tests for Discord where:
  • an unrelated later yes in the channel is ignored;
  • a reply from a non-approver is ignored;
  • a request-bound reply/callback from an allowed approver succeeds.

CVSS v3
8.8
EG Score
8.8(low)
EG Risk
44(Track)
EG Risk 44/100SSVC: Track

EG Risk is EchelonGraph's 0–100 priority score: it fuses intrinsic severity with real-world exploitation and automatability so you can rank equal-severity CVEs and fix the most dangerous first. Higher = act sooner. Distinct from the 0–10 EG Score (severity).

How it’s computed
Severity88% × 45%
Exploitation0% × 40%
Automatability30% × 15%
Action: Routine — remediate on your standard cadence.
EPSS PROB
EPSS %ILE
KEV
Not listed

Published

June 18, 2026

Last Modified

June 18, 2026

Vendor Advisories for CVE-2026-56832(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
praisonai4.5.10 ... 4.6.9 (176 versions)4.6.59

Data Freshness Timeline

(refreshed 3× in last 7d / 3× 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.

  1. 2026-07-26 18:46 UTCEG score recompute
  2. 2026-07-23 03:20 UTCEG score recompute
  3. 2026-07-20 21:35 UTCEG score recompute

Frequently asked(4)

What is CVE-2026-56832?
CVE-2026-56832 is a high vulnerability published on June 18, 2026. PraisonAI DiscordApproval accepts unrelated channel messages as dangerous-tool approvals DiscordApproval accepts unrelated channel messages as dangerous-tool approvals Summary praisonai.bots.DiscordApproval approves a pending dangerous tool call when it sees any later non-bot message in the…
When was CVE-2026-56832 disclosed?
CVE-2026-56832 was first published in the National Vulnerability Database on June 18, 2026. EchelonGraph re-ingests CVE updates from NVD on a 2-hour cycle, so this page reflects the latest published state.
What is the CVSS score of CVE-2026-56832?
CVE-2026-56832 has a CVSS v4.0 base score of 8.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-56832?
Patch to the fixed version published by the affected vendor. Where vendor advisories exist for CVE-2026-56832, 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-56832

Explore →

Is Your Infrastructure Affected by CVE-2026-56832?

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