spatie url-signer CVE-2026-121589
MEDIUMAttack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft URL with malformed expires parameter
-
ExploitSubmit to application using url-signer validate()
-
ExecutionTrigger incorrect type conversion in AbstractUrlSigner::validate
-
ImpactCause validation error / availability impact
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Correct type conversion
|
| Exploitation Conditions | The application must use spatie/url-signer at version 2.1.3 or earlier AND pass an attacker-controllable URL (including its query string) to AbstractUrlSigner::validate() or BaseUrlSigner::validate(). The attacker supplies a malformed |
| Impact | This is a medium-severity, low-real-priority issue. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) describes a remotely reachable, unauthenticated, low-complexity flaw, but the impact metrics tell the real story: VC:N/VI:N/VA:L - no confidentiality or integrity impact and only LOW availability impact, scoring 5.5 (medium). The source code confirms the mechanism: AbstractUrlSigner::validate() (and BaseUrlSigner::validate()) read the attacker-controllable |
| Exploit ScenarioDerived | An application uses spatie/url-signer ≤2.1.3 to validate signed URLs and passes an attacker-supplied URL/query string to validate(). The attacker appends or alters the |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 04, 2026
The PHP library spatie/url-signer up to 2.1.3 fails to type-check the expires query parameter in AbstractUrlSigner::validate() and BaseUrlSigner::validate() before comparing it against the current time, so malformed values (arrays, empty strings, alphanumeric, decimal, scientific-notation or oversized numeric strings) reach the expiration check without being normalized through FILTER_VALIDATE_INT. Applications that pass attacker-influenced URLs to the signer are affected; unauthenticated remote attackers can supply crafted query strings (PR:N, UI:N). Impact is limited to availability (A:L) with no confidentiality or integrity effect, and processing such input yields a failed validation rather than a bypass; a public PoC reference exists (the upstream commit adds regression tests for these malformed inputs), but it is not verified as working exploit code, and there is no CISA KEV listing. Upgrading to 2.1.4 resolves the issue.
RemediationAI
Vendor-released patch: upgrade spatie/url-signer to version 2.1.4, which is published at https://github.com/spatie/url-signer/releases/tag/2.1.4 and corresponds to commit 86af3355388210668f6bfbe9007bd6545d4942ad; run composer require spatie/url-signer:^2.1.4 (or bump the constraint in composer.json) and confirm the lock file resolves to 2.1.4 or later. The 2.1.4 code rejects non-string and non-integer expires and signature values with a false return, so no application-side changes are required once upgraded. If immediate upgrade is not possible, the actionable compensating control is to stop passing untrusted query strings directly into AbstractUrlSigner::validate()/BaseUrlSigner::validate(): in the calling code, reject requests where the expires or signature parameter is not a scalar string (PHP yields an array for expires[]=...) and reject values that are not purely numeric before calling validate(), with the trade-off that this duplicates the library's validation in every call site and will be silently bypassed by any code path that forgets the guard. Applications that only validate URLs they generated themselves are not meaningfully exposed and can schedule the upgrade normally; the vendor advisory at https://vuldb.com/vuln/430430 should be tracked for any additional guidance.
Affected ProductsAI
spatie/url-signer (PHP Composer package, GitHub spatie/url-signer) versions up to and including 2.1.3 are affected, specifically the URL Validation component implemented in src/AbstractUrlSigner.php (AbstractUrlSigner::validate) and the equivalent logic in src/BaseUrlSigner.php; the MD5 and SHA-256 signer implementations inherit this behavior. The problem is fixed in release 2.1.4 (https://github.com/spatie/url-signer/releases/tag/2.1.4), whose patch commit is https://github.com/spatie/url-signer/commit/86af3355388210668f6bfbe9007bd6545d4942ad; the project repository is https://github.com/spatie/url-signer/ and the vendor-credited advisory is https://vuldb.com/vuln/430430 with the CVE record at https://vuldb.com/cve/CVE-2026-121589. Exposure only materializes in host applications that route externally supplied query strings into the signer's validate() method.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
spatie/url-signer generates and validates signed URLs (MD5 and SHA-256/HMAC signers) for Laravel/PHP applications. In versions up to 2.1.3, both AbstractUrlSigner and BaseUrlSigner read the signature and expires values straight out of the parsed query string and pass the expiration to an isFuture() helper, which casts the value to a Unix timestamp and compares it with the current time; because PHP's parse of expires[]=... produces an array and other malformed strings are loosely coerced, the comparison operated on data that had not been constrained to an integer. This is CWE-704 (Incorrect Type Conversion or Cast): the root cause is the absence of an explicit type/normalization step before the numeric comparison, not a weakness in the signature algorithm itself. The 2.1.4 commit 86af3355388210668f6bfbe9007bd6545d4942ad adds is_string() guards on both the expiration and the provided signature, runs the expiration through filter_var(..., FILTER_VALIDATE_INT) and returns false when that fails, and adds test cases covering array, nested-array, empty, non-numeric, partially numeric, decimal, excessive-length and scientific-notation (1e10) expiration values, plus an array-valued signature. The affected components are the URL validation paths of the library rather than any signing primitive, and the impact assessed is availability-only.
Know when PHP gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:P
Remote, unauthenticated, low-complexity manipulation of the expires query value (AV:N/AC:L/PR:N/UI:N); impact is availability-only (A:L) with no confidentiality or integrity effect per the evidence.
Primary rating from Vendor (vuldb).
CVSS VectorVendor: vuldb
DescriptionCVE.org
A weakness has been identified in spatie url-signer up to 2.1.3. Affected is the function AbstractUrlSigner::validate of the file AbstractUrlSigner.php of the component URL Validation. This manipulation of the argument expires causes incorrect type conversion. It is possible to initiate the attack remotely. The exploit has been made available to the public and could be used for attacks. Upgrading to version 2.1.4 is able to address this issue. Patch name: 86af3355388210668f6bfbe9007bd6545d4942ad. It is recommended to upgrade the affected component.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
NVD
CVE.org
GitHub
VulDB
Exploit-DB