Skip to main content

Cotonti Comments Plugin CVE-2026-91939

| EUVDEUVD-2026-80000 CRITICAL
Deserialization of Untrusted Data (CWE-502)
2026-09-15 disclosure@vulncheck.com GHSA-xv9c-9hwm-jp8g
9.3
CVSS 4.0 · Vendor: vulncheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Craft malicious serialized PHP object
  2. Delivery
    Base64-encode into ci GET parameter
  3. Exploit
    Send request to Comments widget page
  4. Execution
    unserialize() instantiates arbitrary class
  5. Persist
    POP gadget chain fires via magic methods
  6. Impact
    Achieve code execution or DB manipulation

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V1 - Encoding and Sanitization Safe deserialization, type allowlists
MITRE ATT&CK

2 techniques across 2 tactics: Execution, Initial Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that the target Cotonti 1.0.0 installation has the Comments plugin enabled and rendering the Comments widget, which reads the ci GET parameter and passes it through base64_decode() into unserialize() without an allowed_classes restriction. No authentication, privileges, or user interaction are needed (PR:N/UI:N) against a default deployment that includes the Comments plugin. The practical limiting factor is the availability of a usable PHP POP gadget chain in Cotonti's codebase or bundled libraries to convert object instantiation into concrete code execution or database manipulation; the deserialization sink itself is unconditionally reachable, but full RCE depends on such a chain existing.

Impact

The CVSS 4.0 base score of 9.3 (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) reflects a genuinely severe pre-authentication vulnerability: PHP object injection (CWE-502) reachable over the network with no privileges or user interaction, driven by the Comments plugin passing the base64-decoded ci GET parameter straight into unserialize() with no allowed_classes restriction. The vendor-confirmed fix in PR #1889 (adding ['allowed_classes' => false] plus strict structural validation) directly corroborates the described root cause, so the technical claim is well-supported by primary source code evidence. However, the practical impact hinges on the availability of a usable POP gadget chain within Cotonti or its bundled libraries - the raw unserialize() sink is confirmed, but 'database manipulation or code execution' is the described potential, not an independently verified end-to-end exploit. No EPSS score, no CISA KEV listing, and no public exploit code are present in the input, so there is no public exploit identified at time of analysis and no evidence of active exploitation; treat 'in the wild' claims as unsupported. Net: a real, high-severity, easily-reachable bug in a low-prevalence CMS - prioritize patching for any Cotonti operator, but the aggregate internet-wide risk is tempered by the product's small deployment footprint and the absence of a published weaponized chain.

Exploit ScenarioDerived

An unauthenticated attacker crafts a malicious serialized PHP object, base64-encodes it, and supplies it as the ci GET parameter to a page rendering the Comments widget. Cotonti unserializes it without class restrictions, instantiating an attacker-controlled object whose magic methods (e.g. __destruct/__wakeup) trigger a gadget chain leading to database manipulation or code execution. No public exploit is identified at time of analysis, though the sink and fix are confirmed in the vendor PR.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
No patch listed yet 0.6% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 16, 2026

PHP object injection in the Cotonti 1.0.0 Comments plugin allows unauthenticated, network-reachable attackers to instantiate arbitrary PHP classes with attacker-controlled properties by feeding a crafted base64-encoded payload through the ci GET parameter, which is passed to unserialize() without an allowed_classes restriction. Any default Cotonti 1.0.0 deployment with the Comments plugin enabled and its widget rendering is exposed; no credentials or user interaction are required, and successful gadget-chain abuse can lead to database manipulation or remote code execution. No public exploit code was identified at time of analysis, and there is no confirmed active exploitation (CISA KEV), though the vendor has published an upstream fix via pull request #1889 that hardens the deserialization call.

RemediationAI

The primary fix is the upstream change delivered in Cotonti pull request #1889 (https://github.com/Cotonti/Cotonti/pull/1889): the @unserialize(base64_decode($ci)) call in plugins/comments/inc/CommentsWidget.php must be replaced with @unserialize(base64_decode($ci), ['allowed_classes' => false]) plus the added validation that the decoded value is an array with a string at index 0 and an array at index 1. Because the PR/commit is the confirmed fix artifact and a tagged patched release was not independently confirmed, treat this as "Upstream fix available (PR/commit); released patched version not independently confirmed" - verify whether a tagged Cotonti release containing it exists and deploy it, or apply the one-line hardening manually. Where patching must be deferred, the most reliable compensating control is to disable the Comments plugin entirely, which removes the reachable sink at the cost of losing comment functionality on the site. A narrower alternative is to block or filter requests carrying the ci GET parameter at the WAF/reverse-proxy layer (for example, reject requests to comments endpoints where ci decodes to a serialized object string, i.e. base64 output beginning with Tz/Qz/YT patterns or containing O: class markers); this preserves comments but is bypass-prone and depends on complete coverage of every route that reaches the widget. Disabling the widget rendering specifically is a middle ground but must be validated against plugins/comments/controllers/actions/DisplayAction.php to ensure no alternate path still reaches the unserialize() sink.

Affected VersionsENISA

Cotonti 1.0.0 ≤1.0.0

Affected Packages

euvd cotonti no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The root cause is CWE-502 (Deserialization of Untrusted Data): the Comments widget in plugins/comments/inc/CommentsWidget.php takes the ci GET parameter, base64-decodes it, and passes the result directly into PHP's unserialize(). Because no allowed_classes option is supplied, PHP will reconstruct objects of any class available in the autoloadable codebase, letting an attacker set arbitrary properties on those objects. This is classic PHP object injection (POI); the immediate primitive is controlled object instantiation, which becomes code execution, file manipulation, or database tampering only when a usable POP gadget chain exists in Cotonti's core code or its bundled third-party libraries - that gadget availability is the practical limiting factor on full RCE, though the vulnerable sink itself is unconditionally reachable. The upstream patch in PR #1889 confirms the mechanism by changing the call to @unserialize(base64_decode($ci), ['allowed_classes' => false]) and adding strict post-decode validation requiring an array whose element 0 is a string and element 1 is an array, which both blocks class instantiation and constrains the accepted data shape. The disclosure is tracked under ENISA EUVD-2026-80000.

Know when Cotonti 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

Vendor (vulncheck) PRIMARY 9.3 CRITICAL
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 9.8 CRITICAL

Unauthenticated network-reachable unserialize() sink with no user interaction (AV:N/AC:L/PR:N/UI:N); object injection to gadget-chain RCE yields full C/I/A impact on the application host.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (vulncheck).

CVSS VectorVendor: vulncheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Cotonti 1.0.0 Comments plugin passes the ci GET parameter to unserialize() without allowed_classes restriction, allowing unauthenticated attackers to instantiate arbitrary PHP classes with attacker-controlled properties. Attackers can exploit PHP object injection through crafted serialized payloads to trigger gadget chains and achieve database manipulation or code execution.

Executive ViewAI

Why It Matters

Cotonti 1.0.0 deployments with the Comments plugin enabled and widget rendering active are exposed to a critical vulnerability that could allow attackers to take control of the application or alter its data. This affects default installations and the attack surface is broad because the vulnerability is network-reachable; no public exploit identified at time of analysis. Leadership should prioritize remediation because there is no vendor-released patch identified at time of analysis and successful exploitation could compromise application data and systems.

Business Impact: Severe
Compensating Controls

Disable the Comments plugin or its widget rendering; block or sanitize the ci GET parameter to reject base64-encoded serialized data; restrict network access to Cotonti 1.0.0 instances; deploy WAF rules; monitor logs for object injection attempts; apply upstream PR #1889 hardening if validated.

Threat Intelligence Overview

EPSS Score
0.6%
Top 53% exploitable
Prevalence
Low
Cotonti is a niche open-source PHP CMS with small production footprint
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.6%
Patch available No
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
Very High

Priority Score

47
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

CVE-2013-4789 HIGH POC
7.5 Aug 09

SQL injection vulnerability in modules/rss/rss.php in Cotonti before 0.9.14 allows remote attackers to execute arbitrary

CVE-2026-55742 CRITICAL
9.4 Jun 18

Cross-site request forgery in Cotonti 1.0.0 (commit f43f1fc3) lets a remote attacker escalate privileges to administrato

CVE-2025-44115 MEDIUM POC
5.4 Jun 02

A vulnerability has been found in Cotonti Siena v0.9.25. Affected by this vulnerability is the file /admin.php?m=config&

CVE-2021-47808 MEDIUM POC
5.4 Jan 16

Cotonti Siena 0.9.19 contains a stored cross-site scripting vulnerability in the admin configuration panel's site title

CVE-2024-24115 MEDIUM POC
5.4 Feb 08

A stored cross-site scripting (XSS) vulnerability in the Edit Page function of Cotonti CMS v0.9.24 allows authenticated

CVE-2026-93868 CRITICAL
9.2 Sep 18

Unauthenticated attackers can reset the password of any Cotonti account, including administrator accounts, because passw

CVE-2022-39840 MEDIUM POC
4.8 Sep 05

Cotonti Siena 0.9.20 allows admins to conduct stored XSS attacks via a direct message (DM). Rated medium severity (CVSS

CVE-2022-39839 MEDIUM POC
4.8 Sep 05

Cotonti Siena 0.9.20 allows admins to conduct stored XSS attacks via a forum post. Rated medium severity (CVSS 4.8), thi

CVE-2026-55741 HIGH
8.7 Jun 18

Cross-site request forgery in Cotonti 1.0.0 (commit f43f1fc3) administration configuration handler allows a remote attac

CVE-2026-55744 HIGH
8.6 Jun 18

Cross-Site Request Forgery in the Personal File Storage (PFS) module of Cotonti 1.0.0 (commit f43f1fc3) allows remote at

CVE-2026-93872 HIGH
7.7 Sep 18

PHP object injection in Cotonti 1.0.0 allows authenticated users with comment-write permissions to pass attacker-control

CVE-2026-71294 HIGH
7.6 Aug 05

PHP Object Injection in Cotonti CMS's Comments plugin grants any authenticated member a deserialization primitive reacha

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy