An Array Where a String Should Be: Laravel's TokenGuard Bypass (CVE-2026-114509) and the Read-Only Endpoint That Empties Tables
Laravel published two framework security advisories on 19 October 2026 — one critical, one medium — and the critical one now has a public proof of concept. The flaw is a type-confusion-shaped authentication bypass in the built-in TokenGuard: submit a non-string API credential, and on MySQL or MariaDB the lookup can match somebody else's record. Both GitHub advisories, the CVE.org CNA records and the upstream fix commit were read first-hand for this briefing.
CVE-2026-114509: the guard never asked “is this a string?”
The CNA description, in full: “Prior to 12.68.0 and 13.29.0, TokenGuard configured as a standard token-based API guard does not reject a crafted non-string credential. Under affected MySQL or MariaDB configurations, the authentication lookup can match an unintended existing user, allowing an unauthenticated attacker to bypass authentication and take over an account on routes protected by TokenGuard.”
- CVE-2026-114509, reported by KIKOmanasijev (credited on the GitHub advisory).
- CVSS v4.0 9.2 — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N. Network-reachable, low complexity, no privileges, no interaction; attack requirements present, which is doing real work here — the attacker's database backend must be one of the affected configurations.
- Affected: below 12.68.0, and 13.0.0 up to 13.29.0. Fixed in 12.68.0 and 13.29.0.
- Advisory published 19 October 2026 13:32:50Z, updated 21 October; CVE record published 21 October 2026 21:49:29Z (assigner: GitHub_M).
- Hakai Security has released a public proof of concept, reported 23 October — verified at the article level; the PoC itself was not obtained or run for this briefing.
The fix is two lines, and they are worth showing because they say exactly what the bug was. In src/Illuminate/Auth/TokenGuard.php, the user() method went from if (! empty($token)) to if (is_string($token) && ! empty($token)), and validate() gained the same is_string gate. The regression test feeds ['api_token' => [0]] — an array where the guard assumed a string — and asserts the provider lookup is never even reached. The failure mode this implies is the familiar one for this class: a non-string value survives into the credential comparison, the database coerces or mishandles the comparison under MySQL/MariaDB semantics, and a row that is not the attacker's matches. No token needed; any route behind the guard opens as somebody else.
One timeline fact deserves plain presentation without inference. The fix commit is dated 24 August 2026, and the tags carrying it — v12.68.0 and v13.29.0 — are dated 25 August 2026. The advisory disclosing the flaw is dated 19 October 2026. So the patched releases shipped roughly eight weeks before the disclosure. Anyone who tracks Laravel release notes rather than the security-advisory feed has been protected since August without knowing why; anyone pinning older minors has been exposed for the same period. Either way, the operative question today is not when you heard about it — it is which minor you run, because a public PoC now exists and there is no configuration workaround in the advisory.
CVE-2026-114508: the read endpoint that writes destruction
The same day brought a second advisory, GHSA-5wcm-3v2w-8362: “From 12.45.0 until 12.68.0 and 13.27.0, crafted relationship inclusion on a read-only endpoint can trigger a destructive database operation on a related table instead of retrieving data.” A user with only read access and no write permission can empty related-table data — irreversible loss, plus denial of service.
- CVE-2026-114508, CVSS v3.1 6.5 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L). Note the tension in the published record, carried as-is: the vector claims no privileges required while the description frames the actor as a read-access user. On either reading, a retrieval-shaped request causing table destruction is the finding.
- Affected: 12.45.0 through 12.68.0 and 13.0.0 through 13.27.0. Fixed in 12.68.0 and 13.27.0 (fix PRs #61322/#61323).
- CVE record updated 23 October 2026.
The pairing matters for patch planning: a single upgrade to 12.68.0+ or 13.29.0+ closes both, but the floors differ — 13.27.0 clears the data-destruction flaw while only 13.29.0 clears the auth bypass. Partial upgrades that stop at the first fixed version leave the critical hole open.
Why this lands harder in PHP2Shell week
Context, not coincidence-chasing: this disclosure sits inside a 48-hour window that also delivered PHP2Shell, a Node.js ten-CVE bundle and the eMudhra distrust work — and Laravel is the framework a large share of the affected PHP surface is built on. Framework auth guards and language runtimes failing in the same week is how “patch PHP” turns into “patch PHP and everything that assumed the request was well-typed.” It is also Laravel's second supply-chain-relevant event this year after the laravel-lang credential stealer — different layer (dependency vs. framework guard), same lesson about where trust is assumed.
What to do
- Upgrade to 12.68.0+ or 13.29.0+ — the 13.x floor for both fixes is 13.29.0, not 13.27.0. Current releases (12.70.1, 13.38.0) already include the fixes; pinned minors below the floors are exposed with a public PoC in circulation.
- Audit every route behind TokenGuard, then check access logs for non-string credential shapes. The exploit presents as an
api_token(or configured input key) carrying an array or other non-string type. Log and alert on type anomalies in authentication inputs generally — a guard that assumes string input is a pattern worth grepping for across your own code too. - Review read-only endpoints that accept relationship-inclusion parameters. CVE-2026-114508's trigger is crafted inclusion on a retrieval path; inclusion/expansion parameters are attacker-controlled query builders and should be allow-listed, not passed through.
- Assume account-takeover attempts are already being probed. Neither CVE is in CISA KEV as of 23 October, and no exploitation has been confirmed in the sources read — but the PoC's publication is the point at which “no confirmed exploitation” stops being a planning assumption.
Verification note: the mechanism, affected ranges and fixed versions are taken from the GitHub security advisories GHSA-f9x3-7vq9-cph6 (critical, published 19 October 2026 13:32:50Z, updated 21 October) and GHSA-5wcm-3v2w-8362 (medium, published 19 October 2026 13:33:01Z) and the CVE.org CNA records for CVE-2026-114509 (CVSS v4.0 9.2, published 21 October 2026 21:49:29Z) and CVE-2026-114508 (CVSS v3.1 6.5), all read first-hand — including the upstream fix commit (two-line is_string gate plus regression test with an array credential) and the reporter credit (KIKOmanasijev). The public-PoC claim is verified at the reporting level via SecurityOnline's 23 October writeup (Hakai Security release); the PoC itself was not obtained, examined or run. Fix-commit and tag dates (24–25 August 2026) are from the upstream repository; the eight-week gap to advisory publication is a timeline fact, not a claim about vendor intent. Neither CVE appears in the CISA KEV catalogue (23 October 2026 edition, 1,756 entries). NVD's API presented a bot challenge from this network during this run, so scoring was verified against the authoritative CNA records and vendor advisories, which agree. No application was tested; no exploit was written or run; no third-party system was contacted.
Sources:
- Laravel — GHSA-f9x3-7vq9-cph6 “Token-based API guard Auth Bypass” (CVE-2026-114509; affected/fixed versions, CVSS 4.0 9.2, reporter credit, fix references)
- Laravel — GHSA-5wcm-3v2w-8362 “Unauthorized Data Destruction” (CVE-2026-114508; affected/fixed versions, CVSS 6.5, fix PRs #61322/#61323)
- Laravel — upstream fix commit for CVE-2026-114509 (is_string gate in TokenGuard::user() and validate(), array-credential regression test)
- SecurityOnline — “Laravel Authentication Bypass PoC Released for Critical TokenGuard Flaw CVE-2026-114509” (23 October 2026; Hakai Security public PoC report — reporting verified, PoC not obtained)
- al-ice.ai — PHP2Shell patches released (CVE-2026-109618/109619)
- al-ice.ai — Laravel-Lang supply chain credential stealer