CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-55537

CVE-2026-55537: Webhook Server-Side Request Forgery and TOCTOU Bypass in PraisonAI

Alon Barad
Alon Barad
Software Engineer

Aug 25, 2026·6 min read·5 visits

Executive Summary (TL;DR)

A fail-open DNS resolution handler in PraisonAI's webhook validator enables attackers to bypass SSRF protections via a TOCTOU mechanism, targeting protected internal network endpoints.

CVE-2026-55537 is a server-side request forgery (SSRF) and time-of-check time-of-use (TOCTOU) vulnerability in the PraisonAI multi-agent framework before version 4.6.58. The flaw exists in the job-submission component's webhook URL validation logic. When DNS resolution fails during verification, the application fails open, enabling attackers to register unresolvable URLs. When a completed job triggers the webhook, the application performs a fresh DNS resolution that attackers can manipulate to target internal resources.

Vulnerability Overview

The PraisonAI framework provides coordination capabilities for multi-agent AI teams. To support asynchronous execution, the framework allows clients to submit jobs with an optional callback webhook URL. When a background job completes, the executor sends an HTTP POST request to the specified callback address. This interface exposes a network attack surface that must be restricted to prevent unauthorized requests targeting internal infrastructure.

To secure this callback interface, PraisonAI implements a Pydantic-based validation method named JobSubmitRequest.validate_webhook_url(). The method resolves the target hostname and blocks loopback, private, link-local, or multicast IP addresses. This validation was introduced to address previous SSRF concerns registered under CVE-2026-40114.

However, the validation mechanism contains an exception handling logic flaw. If a DNS lookup fails during the validation phase, the code silences the exception instead of rejecting the input. This design introduces a fail-open state, allowing an attacker to bypass the validation phase and subsequently exploit a time-of-check time-of-use (TOCTOU) condition during execution.

Root Cause Analysis

The root cause of CVE-2026-55537 is an incorrect control flow scope (CWE-705) combined with a TOCTOU race condition (CWE-367). Inside models.py, the validation function resolves hostnames using socket.gethostbyname(). If the hostname does not have an active or valid DNS record during validation, the call raises a socket.gaierror exception.

The validation method handles this exception with an explicit pass statement. By executing pass on a resolution failure, the function accepts the input URL as valid and returns it unmodified. This fail-open logic allows unresolvable domains to bypass the validation step completely.

When the job executor later finishes executing the agent tasks, it invokes JobExecutor._send_webhook(). This subsystem performs a fresh DNS lookup to dispatch the HTTP payload. Since the hostname is resolved a second time, an attacker can manipulate DNS state between the validation phase (check time) and the invocation phase (use time).

Code-Level Technical Comparison

The flaw resides within src/praisonai/praisonai/jobs/models.py. The vulnerable code executes a silent pass when resolving the hostname of the webhook URL fails. Below is the technical comparison showing the vulnerable validation pattern versus the hardened implementation.

Vulnerable Implementation (Before v4.6.58)

# Vulnerable code in models.py
def validate_webhook_url(cls, v: Optional[str]) -> Optional[str]:
    if not v:
        return v
    import urllib.parse
    import socket
    import ipaddress
 
    try:
        parsed = urllib.parse.urlparse(v)
        hostname = parsed.hostname
        if not hostname:
            return v
        
        # Resolve hostname to check CIDR ranges
        ip_str = socket.gethostbyname(hostname)
        ip_obj = ipaddress.ip_address(ip_str)
        
        if ip_obj.is_private or ip_obj.is_loopback or ip_obj.is_link_local or ip_obj.is_multicast:
            raise ValueError("Webhook URL resolves to a private network address")
            
    except socket.gaierror:
        # BUG: Fails open if DNS resolution fails
        pass
        
    return v

Patched Implementation (v4.6.58)

# Corrected code in models.py (Commit: 2f9677abb2ea68eab864ee8b6a828fd0141612e1)
def validate_webhook_url(cls, v: Optional[str]) -> Optional[str]:
    if not v:
        return v
    import urllib.parse
    import socket
    import ipaddress
 
    try:
        parsed = urllib.parse.urlparse(v)
        hostname = parsed.hostname
        if not hostname:
            return v
        
        ip_str = socket.gethostbyname(hostname)
        ip_obj = ipaddress.ip_address(ip_str)
        
        if ip_obj.is_private or ip_obj.is_loopback or ip_obj.is_link_local or ip_obj.is_multicast:
            raise ValueError("Webhook URL resolves to a private network address")
            
    except socket.gaierror:
        # FIX: Fail-closed logic. Reject unresolvable hostnames.
        raise ValueError("Webhook URL hostname could not be resolved")
        
    return v

The patch replaces the passive pass handler with an explicit ValueError. This change ensures that any hostname that cannot be resolved immediately at registration is rejected, preventing the insertion of dynamic DNS bypass payloads.

Exploitation Methodology

To exploit this vulnerability, an attacker must control an authoritative DNS server and have job submission privileges on the PraisonAI server. The attack requires precise timing to control the response of the DNS resolver.

First, the attacker registers a domain name and configures their DNS server to return a failure status, such as a timeout or an empty NXDOMAIN response, for a specific subdomain like trigger.attacker.com.

Second, the attacker submits a job request payload containing the unresolvable webhook target:

POST /jobs HTTP/1.1
Host: praisonai-server:8000
Content-Type: application/json
Authorization: Bearer <valid_token>
 
{
  "agent_file": "agents.yaml",
  "webhook_url": "http://trigger.attacker.com/api/callback"
}

Third, the validation check executes. Because the DNS server returns an error, socket.gethostbyname() raises a socket.gaierror, the code triggers pass, and the system registers the job successfully.

Fourth, immediately after registration, the attacker updates the DNS records on their server to point to an internal resource, such as 127.0.0.1 or the AWS metadata endpoint 169.254.169.254. When the job completes, the background executor performs a new DNS request, resolves the domain to the internal IP, and sends the HTTP POST request, successfully achieving Server-Side Request Forgery.

Impact Assessment

A successful exploit allows authenticated attackers to make arbitrary HTTP requests originating from the PraisonAI container or host. This access bypasses boundary protections and allows communication with internal resources that are otherwise isolated from external networks.

The target systems can include local host admin panels, internal microservices, databases, and container metadata endpoints. On cloud systems, access to endpoints like 169.254.169.254 can allow the attacker to retrieve temporary IAM security credentials, leading to broader environment compromise.

The CVSS v3.1 score is 7.1 (High). The high complexity modifier reflects the requirement to orchestrate DNS server states during the timing gap between check and use. The modified scope parameter (S:C) indicates that the vulnerability allows an attacker to pivot from the application container to adjacent network services.

Remediation and Mitigation

To fully remediate CVE-2026-55537, upgrade PraisonAI to version 4.6.58 or higher. The update implements a fail-closed policy that prevents the registration of unresolvable webhooks.

If immediate software upgrades are not possible, administrators should implement local mitigations:

  1. Egress Filtering: Configure the firewall or security group on the PraisonAI host to drop outbound traffic originating from the server process that targets private IP ranges, specifically RFC 1918 subnets (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) and cloud metadata endpoints (169.254.169.254).

  2. DNS Cache Pinning: Configure a local recursive resolver that enforces a minimum Time-to-Live (TTL) for resolved queries. This configuration prevents rapid DNS record changes and neutralizes DNS rebinding techniques.

Official Patches

MervinPraisonValidation and exception handling correction patch commit

Fix Analysis (1)

Technical Appendix

CVSS Score
7.1/ 10
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:N

Affected Systems

PraisonAI Multi-Agent Framework

Affected Versions Detail

Product
Affected Versions
Fixed Version
PraisonAI
MervinPraison
< 4.6.584.6.58
AttributeDetail
CWE IDCWE-918, CWE-367, CWE-705
Attack VectorNetwork (AV:N)
CVSS v3.1 Score7.1 (High)
Exploit Statuspoc
KEV StatusNot Listed
Scope ImpactChanged (S:C)

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-918
Server-Side Request Forgery (SSRF)

The web application server receives a URL or similar request from an upstream component and retrieves the contents of this URL, but does not sufficiently prevent unauthorized requests to internal resources.

Vulnerability Timeline

Developer merged commit 2f9677abb2ea68eab864ee8b6a828fd0141612e1 fixing input validation
2026-06-13
GitHub Security Advisory published advisory GHSA-rg5q-pp8p-f7jm
2026-08-25

References & Sources

  • [1]GitHub Security Advisory GHSA-rg5q-pp8p-f7jm
  • [2]Fix Patch Commit on GitHub
  • [3]PraisonAI v4.6.58 Release Changelog
  • [4]Official CVE Registry Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•21 minutes ago•GHSA-8QX3-8GM5-9CJ2
7.8

GHSA-8QX3-8GM5-9CJ2: Terminal Escape-Sequence Injection in pickem

The npm package 'pickem' is vulnerable to a terminal escape-sequence injection (CWE-150). Unsanitized terminal outputs allow attackers to execute arbitrary shell commands via clipboard hijacking (OSC 52) or manipulate terminal displays through Control Sequence Introducers (CSI).

Alon Barad
Alon Barad
0 views•6 min read
•about 2 hours ago•CVE-2026-54625
4.8

CVE-2026-54625: Server-Side Page Cache Bypass and Cache Poisoning in django CMS

Prior to version 5.0.8, django CMS fails to respect dynamically declared Vary HTTP headers in its internal page cache. This allows remote attackers to bypass authorization, leak sensitive information across user sessions, or poison the page cache by sending requests with custom headers.

Alon Barad
Alon Barad
4 views•7 min read
•about 3 hours ago•GHSA-W67G-5RQW-F597
6.9

GHSA-W67G-5RQW-F597: Cryptographically Weak PRNG for WebSocket Frame Masking in Gorilla WebSocket

A security vulnerability in the github.com/gorilla/websocket Go library allows remote attackers to predict client-to-server frame masking keys. This occurs because the library generates 32-bit mask keys using Go's non-cryptographically secure pseudo-random number generator (math/rand). Predicting these keys enables adversaries to bypass proxy-based security protections, facilitating HTTP request smuggling and cache poisoning attacks.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 4 hours ago•CVE-2026-55477
7.2

CVE-2026-55477: Authenticated Arbitrary File Write in MHSanaei 3X-UI via Database Import

MHSanaei 3X-UI is a web control panel for managing Xray-core servers. In versions prior to 3.3.1, an authenticated administrator can abuse database import functions or raw template config fields to overwrite or append to arbitrary files on the host filesystem. This is achieved by altering the Xray log configuration variables to target system files, leveraging logging components to inject payloads.

Alon Barad
Alon Barad
5 views•6 min read
•about 5 hours ago•GHSA-VX2M-JPXR-XV7W
5.3

GHSA-vx2m-jpxr-xv7w: Incorrect Authorization Bypass via Context Hint Cache Replay in Cloudreve

Cloudreve is vulnerable to an incorrect authorization bypass. When listing files, Cloudreve returns a context_hint (represented as a UUID) to the client. If this context hint is replayed on the /file/url or /file/thumb routes, Cloudreve's database file system caches the shareNavigatorState containing the loaded share root. Within the cache lifetime (TTL of 300 seconds), if the user re-requests the same file with the cached hint, the system restores the state and completely bypasses the root security checks (which validate share expiration, remaining download limits, owner status, and passwords). This allows unauthorized users to continue generating signed file URLs and downloading files even after a share has been deleted, has expired, or has reached its download limit.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 6 hours ago•GHSA-W8J7-39HP-8X59
5.5

GHSA-W8J7-39HP-8X59: Path Traversal Vulnerability in Cloudreve Remote Downloader Workflow

A path traversal vulnerability exists in Cloudreve's remote download workflow, where improper sanitization of file paths returned by configured remote downloaders (such as aria2) allows authenticated users to write files outside the designated target folder.

Alon Barad
Alon Barad
4 views•7 min read