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-0859

TYPO3's Fatal Typo: How One CamelCase Character Allowed RCE

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 20, 2026·6 min read·58 visits

Executive Summary (TL;DR)

TYPO3 developers made a typo in the `unserialize()` options, writing `allowedClasses` (camelCase) instead of `allowed_classes` (snake_case). PHP silently ignored the restriction, turning a hardened deserialization call into an open door for RCE. Attackers with local file write access to the mail spool can execute arbitrary code.

A critical insecure deserialization vulnerability in TYPO3 CMS caused by a simple syntax error. Developers attempted to secure PHP's `unserialize` function using an allow-list, but used the wrong configuration key ('allowedClasses' instead of 'allowed_classes'). This typo caused PHP to silently ignore the security restriction, allowing full object instantiation and Remote Code Execution (RCE) via the Mailer component.

The Hook: The CamelCase Catastrophe

In the world of secure coding, intent means nothing. Implementation is everything. The developers behind TYPO3, one of the enterprise world's favorite Content Management Systems, intended to write secure code. They knew that PHP's unserialize() function is a loaded gun pointed at the foot of any application that uses it. They tried to use the safety mechanism introduced way back in PHP 7.0: the allowed_classes filter.

But they made one fatal mistake: they respected the variable naming conventions of their own codebase (camelCase) rather than the snake_case requirements of the PHP interpreter. They wrote 'allowedClasses' instead of 'allowed_classes'.

This is the story of CVE-2026-0859, a vulnerability that proves that in PHP, a single capital letter can be the difference between a rejected packet and a root shell. It highlights a terrifying behavior in PHP: when you pass an invalid option to a security function, it often doesn't throw an error—it just silently ignores you and proceeds as if you hadn't tried to secure it at all.

The Flaw: A Silent Failure

To understand this vulnerability, you have to appreciate the awkward evolution of PHP object injection. For years, unserialize() was simply unsafe. Then, PHP 7 introduced a chaotic-good feature: the options array. This allows developers to pass a whitelist of classes that are allowed to be instantiated. If an attacker tries to inject a GuzzleHttp\Client object to trigger a destructor gadget, but the whitelist only allows stdClass, the exploit fails.

Here is where the logic flaw occurred. The TYPO3 FileSpool class manages queued emails by saving them to disk and reading them back later. To read them back, it uses unserialize. The developers passed an array of safe mail-related classes (like RawMessage, Email, etc.) to the function.

However, because they used the key allowedClasses (notice the capital 'C'), PHP's internal engine looked at the options array, didn't see the expected allowed_classes key, and shrugged. It defaulted to allowed_classes => true, which means "allow everything." The filter was effectively nonexistent. The code looked secure during code review, but it was functionally wide open.

The Code: The Smoking Gun

Let's look at the diff. It is rare to see a vulnerability so starkly defined by a syntax error. This isn't a complex logic race condition; it's a typo.

The Vulnerable Code (Simplified):

// TYPO3/CMS/Core/Mail/FileSpool.php
$message = unserialize((string)file_get_contents($file), [
    // The fatal mistake: CamelCase key is ignored by PHP
    'allowedClasses' => [
        RawMessage::class,
        Message::class,
        Email::class,
        // ... list of safe classes
    ],
]);

The Patch (Commit 3225d705...):

In the fix, the developers didn't just correct the typo; they completely overhauled the deserialization logic. They realized that trusting unserialize with a simple list might be fragile given the complexity of Symfony Mailer objects. They introduced a PolymorphicDeserializer that pre-scans the string.

// The Fix: Using a wrapper and correct keys
$message = $this->deserializer->deserialize(
    (string)file_get_contents($file),
    [
        SentMessage::class,
        RawMessage::class,
        // ...
    ]
);

Internally, that deserializer ensures the payload doesn't contain dangerous object markers before even letting PHP touch it. They went from "oops, typo" to "defense-in-depth."

The Exploit: Weaponizing the Spool

So, we have an insecure deserialization sink. How do we reach it? This vulnerability is classified as AV:L (Local) because the input vector comes from a file on disk: the mail spool.

Step 1: The Gadget Chain TYPO3 is built on top of Symfony components and includes a massive amount of dependencies (Guzzle, Doctrine, etc.). This is a playground for tools like PHPGGC. An attacker would generate a payload using a standard chain, for example, Monolog/RCE1 or a generic Symfony/RCE chain, wrapping a command like id or a reverse shell.

Step 2: The Delivery The attacker needs to write this payload to the configured transport_spool_filepath. If the attacker has compromised a low-privileged account (e.g., via an unrestricted file upload or a separate LFI), they can drop a file named payload.sending into the spool directory.

Step 3: The Trigger The beauty (and horror) of this exploit is that the attacker doesn't need to trigger it manually. TYPO3 relies on a scheduler (cron job) to flush the mail queue. The attacker plants the bomb and walks away. When the system administrator's cron job runs typo3 mailer:spool:send, the script iterates over the directory, reads payload.sending, and deserializes it. Boom—code execution running as the user invoking the scheduler (often the web user or even root/cron user).

The Impact: Delayed RCE

While the requirement for local file write lowers the CVSS score to a 7.8, the impact is undeniably critical. This acts as a privilege escalation or persistence mechanism. If an attacker can write to the spool but cannot execute PHP directly (perhaps due to disable_functions or WAF rules blocking direct execution), this vulnerability bypasses those restrictions.

The deserialization happens deep within the core framework logic, often outside the context of the web request, meaning it might bypass web-based intrusion detection systems (WAFs) entirely. Furthermore, because it executes during the scheduler run, it could potentially escalate privileges if the scheduler is run by a user with higher permissions than the web server itself.

The Fix & Mitigation

The remediation is straightforward: Update. The patch versions (10.4.55, 11.5.49, 12.4.41, 13.4.23, 14.0.2) contain the fix. The fix is robust; it moves away from the fragile unserialize allow-list and implements a rigorous check on the serialized string content before processing.

Defensive Strategy:

  1. Update Immediately: This is the only sure fix.
  2. Disable File Spooling: If you don't need to queue emails to disk, don't. Configure TYPO3 to send emails immediately (transport_spool_type = memory) or use a proper SMTP server without local spooling. This removes the attack surface entirely.
  3. Check Permissions: Ensure your var/spool or fileadmin directories are not writable by untrusted users. If an attacker can't write the file, they can't trigger the deserialization.

Official Patches

TYPO3TYPO3-CORE-SA-2026-004 Advisory
GitHubPatch Commit (Main)

Fix Analysis (1)

Technical Appendix

CVSS Score
7.8/ 10
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
0.03%
Top 92% most exploited

Affected Systems

TYPO3 CMS 10.0.0 - 10.4.54TYPO3 CMS 11.0.0 - 11.5.48TYPO3 CMS 12.0.0 - 12.4.40TYPO3 CMS 13.0.0 - 13.4.22TYPO3 CMS 14.0.0 - 14.0.1

Affected Versions Detail

Product
Affected Versions
Fixed Version
TYPO3 CMS
TYPO3
>= 10.0.0, <= 10.4.5410.4.55 ELTS
TYPO3 CMS
TYPO3
>= 11.0.0, <= 11.5.4811.5.49 ELTS
TYPO3 CMS
TYPO3
>= 12.0.0, <= 12.4.4012.4.41 LTS
TYPO3 CMS
TYPO3
>= 13.0.0, <= 13.4.2213.4.23 LTS
TYPO3 CMS
TYPO3
>= 14.0.0, <= 14.0.114.0.2
AttributeDetail
Vulnerability TypeInsecure Deserialization (CWE-502)
CVSS v3.17.8 (High)
Attack VectorLocal (File Write required)
Root CauseTypo in API option key ('allowedClasses' vs 'allowed_classes')
EPSS Score0.03% (Low probability of mass exploitation)
Patch StatusReleased (2026-01-13)

MITRE ATT&CK Mapping

T1059.003Command and Scripting Interpreter: Windows Command Shell
Execution
T1204.002User Execution: Malicious File
Execution
T1574Hijack Execution Flow
Persistence
CWE-502
Deserialization of Untrusted Data

The application deserializes untrusted data without sufficiently verifying that the resulting data will be valid.

Known Exploits & Detection

TheoryStandard PHPGGC gadget chains for Symfony/Monolog applicable via FileSpool injection.

Vulnerability Timeline

Vendor Advisory Published
2026-01-13
Patch Released
2026-01-13
NVD Analysis Completed
2026-01-14

References & Sources

  • [1]Vendor Advisory
  • [2]CWE-502: Insecure Deserialization

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

•about 12 hours ago•CVE-2026-39922
6.3

CVE-2026-39922: Server-Side Request Forgery in GeoNode Service Registration Endpoint

GeoNode versions prior to 4.4.5 and 5.0.2 are vulnerable to Server-Side Request Forgery (SSRF) in the service registration endpoint. Authenticated attackers with low privileges can exploit insufficient input validation in the Web Map Service (WMS) registration module to force the application server to make outbound network queries to loopback addresses, private RFC1918 subnets, link-local scopes, and cloud metadata endpoints. This technical report details the mechanics of the vulnerability, the underlying architectural flaw, and how to effectively remediate and mitigate the associated security risks.

Alon Barad
Alon Barad
4 views•7 min read
•about 22 hours ago•CVE-2022-0492
7.8

CVE-2022-0492: Privilege Escalation and Container Escape via cgroups v1 release_agent

CVE-2022-0492 is a high-severity missing authorization vulnerability in the Linux kernel's Control Groups (cgroups) v1 implementation. The flaw resides within the cgroup_release_agent_write function in kernel/cgroup/cgroup-v1.c, where the kernel fails to validate if the process writing to the release_agent file possesses administrative capabilities in the initial user namespace. This allows a local attacker inside a container with root privileges (UID 0) to abuse user namespaces, mount a cgroups v1 directory, modify the release_agent parameter, and execute arbitrary commands on the host system as host root, effectively achieving a complete container escape.

Amit Schendel
Amit Schendel
8 views•7 min read
•3 days ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
12 views•6 min read
•3 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•3 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•3 days ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
30 views•7 min read