Summary
CVE-2026-91939 is a critical PHP object injection (deserialization) vulnerability in the Comments plugin bundled with Cotonti (Cotonti Siena) 1.0.0. The plugin passes the ci GET parameter to PHP’s unserialize() without an allowed_classes restriction, allowing an unauthenticated attacker to instantiate arbitrary PHP classes with attacker-controlled properties and potentially trigger gadget chains for database manipulation or remote code execution. The flaw carries a CVSS v3.1 score of 9.8 and a CVSS v4.0 score of 9.3, both Critical.
Technical details
- Root cause:
CommentsWidget::run()inplugins/comments/inc/CommentsWidget.phpimports theciGET parameter, base64-decodes it, and passes the result directly tounserialize()without restricting which PHP classes may be instantiated (CWE-502: Deserialization of Untrusted Data). - Trigger conditions: The vulnerable code path is reached via the AJAX comments-display action, which only requires comments read permission. Under Cotonti’s default configuration, guest access is enabled, making the endpoint reachable without authentication.
- Attack vector: Network — a remote attacker crafts a malicious base64-encoded serialized PHP object and submits it as the
ciGET parameter. - Impact: Successful exploitation enables PHP object injection, which can be chained with available "gadget" classes present in the application to manipulate database contents or achieve remote code execution.
Affected software
- Cotonti (Cotonti Siena) version 1.0.0, specifically the bundled Comments plugin (
plugins/comments/inc/CommentsWidget.php)
Severity
- CVSS v3.1 Base Score: 9.8 (Critical) —
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - CVSS v4.0 Base Score: 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
Mitigation and recommended actions
- Immediate: No official patched release has been published at the time of this writing; a fix has been proposed in an unmerged pull request against the Cotonti repository. Security teams should track the upstream project for a released version that restricts
unserialize()toallowed_classes => falsewith explicit validation of the deserialized data. - Workarounds: Disable or restrict guest access to the Comments plugin (avoid
Auth_guests=Rfor the comments module), disable the Comments plugin entirely if not required, or deploy a web application firewall rule to block requests containing suspicious base64-encoded serialized PHP payloads in theciparameter until an official patch is available.

