☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Cotonti logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 9.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H 🐛 CWE-502
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2026-91939

CVE-2026-91939 Code Execution in Cotonti
📅 PUBLISHED: 2026-09-15 00:00 UTC 🔄 UPDATED: 2026-10-11 17:42 UTC
[ ZERO-DAY / UNPATCHED ] [ DEFENSE PATCH ↓ ]
💣 PoC: Public
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.98%
👁️
0.98% probability
24.4× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
Country: Global License: Open Source
VULNERABLE: UNKNOWN / CHECK VENDOR
CVSS VECTOR BREAKDOWN 9.8
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: N Privileges Required None
UI: N User Interaction None
S: U Scope Unchanged
C: H Confidentiality High
I: H Integrity High
A: H Availability High
9.8
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2026-91939 is a critical (CVSS 9.8) PHP Object Injection vulnerability in the Cotonti 1.0.0 Comments plugin. The plugin passes the ci GET parameter directly to PHP's unserialize() without an allowed_classes restriction, allowing any unauthenticated remote attacker to instantiate arbitrary PHP classes with attacker-controlled properties. Successful exploitation can lead to database manipulation and, through available gadget chains, remote code execution — with no authentication, no user interaction, and no known patch at the time of writing.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Technical Analysis

The vulnerability is a textbook instance of CWE-502 (Deserialization of Untrusted Data) in a PHP application. PHP's unserialize() function transforms a serialized string into live PHP objects. When the caller does not constrain the operation — specifically by omitting the allowed_classes option (or by passing allowed_classes => true) — any class name embedded in the attacker-supplied serialized payload is instantiated, and its object properties are set to attacker-controlled values.

The specific attack surface here is the ci GET parameter handled by the Cotonti 1.0.0 Comments plugin. Because the parameter is read from the query string (HTTP GET), the vulnerable code path is reachable by any unauthenticated remote client that can reach the web endpoint. There is no indication in the source description of an authentication check, CSRF token, or input validation gate in front of the deserialization call — the CVSS vector (PR:N, UI:N) corroborates that the flaw is exploitable pre-authentication and without user interaction.

The core danger of unconstrained unserialize() is that it does not merely reconstruct plain data; it invokes PHP's object lifecycle. During deserialization, magic methods such as __wakeup(), __destruct(), __toString(), __get(), and __call() are automatically triggered on the instantiated objects. An attacker who identifies a "gadget chain" — a sequence of classes present in the application or its loaded dependencies whose magic methods call each other — can drive execution from the deserialization sink to a dangerous operation such as writing to a database, deleting files, or invoking a system-level function. The NVD description explicitly states that these gadget chains allow the attacker to "achieve database manipulation or code execution."

Two technical details sharpen the risk profile. First, SQL injection via object injection is a common and well-understood outcome when a gadget chain reaches a code layer that concatenates attacker-controlled properties into a query — which aligns directly with the "database manipulation" impact described. Second, the description distinguishes "database manipulation" from "code execution," implying that at least one reliable chain terminates at the database layer, while code execution is a further, potentially dependency-conditioned outcome.

Because the description does not disclose specific class names, method names, file paths, or the exact gadget chain, the exploit must be treated as vulnerability-class driven: an unauthenticated attacker sends a crafted serialized PHP object through the ci parameter and relies on whatever magic-method chains the deployed Cotonti installation and its PHP dependencies expose. The severity is nonetheless unambiguous — a network-reachable deserialization sink with an attacker-controlled payload is among the highest-impact classes of PHP flaws.

Exploitation Scenarios

No public PoC or exploit code is available for CVE-2026-91939; the attack chain below is inferred from the vulnerability class (CWE-502) and the technical facts stated in the description.

  1. Reconnaissance / target identification. An attacker scans the internet for Cotonti 1.0.0 installations with the Comments plugin enabled, using fingerprinting dorks such as http.html:"Cotonti" or by probing comment-related endpoints. Because the vulnerable parameter is a GET parameter, the entry point is directly reachable in a browser or via a scripted HTTP client.

  2. Triggering the flaw class. The attacker crafts a serialized PHP payload and delivers it as the value of the ci GET parameter. The Comments plugin reads the parameter and passes it to unserialize() without allowed_classes restrictions. PHP then instantiates whatever class the attacker names inside the payload and assigns the attacker-chosen properties.

  3. Payload / execution method (class level). The payload is a serialized object graph selecting a class (or chain of classes) whose magic methods fire on deserialization — for example, a __destruct() that routes into a query builder or a __wakeup() that resolves a stored property. The attacker's object properties control the arguments that flow into the chained operation. At this level of description, the concrete class and method names are not published, so the attacker must enumerate installed classes and their magic methods (a standard gadget-hunting exercise in PHP object injection) to assemble a working chain. The result, per the description, is either database manipulation (e.g., injecting attacker-controlled values into SQL) or code execution.

  4. Post-exploitation impact. Because the request is unauthenticated, success grants the attacker the privileges of the web server process: the ability to read, modify, or delete database records (including user and administrative tables) and, if a suitable code-execution gadget is available, to run arbitrary operating-system commands under the web account. From there, lateral movement, persistence, and full compromise of the host or backend database are realistic.

Impact Assessment

The CVSS 3.1 base score of 9.8 reflects the worst-case combination of factors: attack vector Network (AV:N) — remotely exploitable; attack complexity Low (AC:L) — no special conditions must be met; privileges required None (PR:N) — no authentication; user interaction None (UI:N) — no victim action. The confidentiality, integrity, and availability subscores are all High (C:H/I:H/A:H). Confidentiality impact is High because attackers may read arbitrary database contents; integrity impact is High because they can manipulate data or execute code; availability impact is High because database manipulation or code execution can destroy or disable services.

The scope is Unchanged (S:U), meaning the vulnerable component and the impacted component are the same security authority — the web application environment. Business impact for an organization running Cotonti 1.0.0 includes potential breach of all data stored in the application database (CMS content, comments, registered users, and administrative credentials), integrity loss of that data, and, where code execution is achieved, complete server compromise. Affected systems are any internet-facing Cotonti 1.0.0 deployments with the Comments plugin active. Given that Cotonti is a PHP content management framework often used for community and portal sites, the blast radius commonly includes a shared hosting database and, through it, any co-located application data reachable by the same database credentials. No EPSS score has been published by FIRST.org, and the CVE is not in the CISA KEV catalog, so there is no confirmed in-the-wild exploitation evidence at this time — but the absence of a patch and the trivial pre-auth reachability make it a high-priority exposure.

Detection Guidance

Sigma Rule

title: Cotonti Comments Plugin PHP Object Injection via ci Parameter
id: 8f4c2e91-7b3a-4d1e-9c6f-a2e5d0b7c413
status: experimental
description: Detects requests passing a PHP-serialized object payload through the ci GET parameter to the Cotonti 1.0.0 Comments plugin (CVE-2026-91939).
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-91939
author: Valters IT Threat Intelligence
logsource:
  category: webserver
detection:
  selection_param:
    cs-uri-query|contains: 'ci='
  selection_serialized:
    cs-uri-query|contains:
      - 'O:'
      - '%4F%3A'
      - 'a:'
  condition: selection_param and selection_serialized
fields:
  - c-ip
  - cs-uri-query
  - cs-user-agent
falsepositives:
  - Legitimate applications that pass serialized data in the ci parameter (unlikely)
level: critical

YARA Rule

rule CVE_2026_91939_Cotonti_PHP_Object_Injection
{
    meta:
        author = "Valters IT Threat Intelligence"
        description = "Detects PHP serialized object payloads targeting Cotonti Comments plugin ci parameter (CVE-2026-91939)"
        reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-91939"
        date = "2026-01-01"
        severity = "critical"

    strings:
        $php_obj = /O:[0-9]+:"[a-zA-Z_\\][a-zA-Z0-9_\\]*":[0-9]+:\{/
        $ci_param = "ci="
        $unser = "unserialize"
        $ci_enc = "%63%69%3D"

    condition:
        uint16(0) == 0x3C3F or true
        and $php_obj
        and ( $ci_param or $ci_enc or $unser )
}

Suricata IDS Rule

alert http any any -> any any (msg:"CVE-2026-91939 Cotonti Comments Plugin PHP Object Injection via ci parameter"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"ci="; nocase; http.uri; pcre:"/ci=[^&]*(%3A|:)\d+(%3A|:)/i"; http.uri; pcre:"/ci=[^&]*O%3A\d+%3A|ci=[^&]*O:\d+:/i"; reference:cve,CVE-2026-91939; classtype:web-application-attack; sid:202691939; rev:1;)

Elastic Detection

sequence by source.ip with maxspan=5s
  [network where network.protocol == "http" and url.query : "ci=*" and url.query : "*O:*"]

Splunk SPL Query

index=web sourcetype=access_combined
| eval q=lower(cs_uri_query)
| where match(q, "(^|&)ci=")
| where match(q, "o%3a[0-9]+%3a") OR match(q, "o:[0-9]+:")
| table _time, src_ip, cs_uri, cs_uri_query, cs_user_agent, status
| sort - _time

Wazuh OSSEC Rule

<group name="web,appsec,cve-2026-91939,">
  <rule id="2026919" level="12">
    <if_sid>31100</if_sid>
    <match>ci=</match>
    <regex>ci=[^&]*(O%3A|O:)[0-9]+(%3A|:)</regex>
    <description>CVE-2026-91939: Cotonti Comments plugin PHP object injection attempt via ci parameter</description>
    <mitre>
      <id>T1190</id>
    </mitre>
    <group>attack,pci_dss_6.5.1,</group>
  </rule>
</group>

Mitigation & Patch Guidance

Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source). No vendor fix, no OSV-advertised fixed version, and no workaround guidance has been published.

  1. Immediate mitigations. Where the Comments plugin is not actively needed, disable/uninstall it to remove the attack surface entirely. Where it is required, deploy a reverse-proxy or WAF rule that rejects requests whose ci parameter contains serialized-object indicators (O:, a:, URL-encoded equivalents) — the detection signatures above can be translated into blocking rules. Restrict public exposure of the Cotonti instance (IP allow-listing, VPN, or authentication at the perimeter) until a patch exists. Because exploitation is unauthenticated, treat any internet-reachable instance as directly at risk.

  2. Patch / upgrade steps. No patched version exists to date. Track the Cotonti project's release channel and advisories, and the OSV database entry for this CVE (currently marked unfixed), for a fixed release. If the vendor publishes a fix, upgrade to it immediately and verify the Comments plugin no longer passes the ci parameter to unserialize() without an allowed_classes restriction. Organizations able to maintain a fork can implement the standard code-level fix: pass ['allowed_classes' => false] to unserialize(), or replace deserialization entirely with json_decode() and a schema-based validator.

  3. Long-term hardening. Treat all PHP object deserialization of user input as a coding-standard violation across the codebase, and include unserialize() sinks in static-analysis (SAST) gates. Apply least privilege to the database account used by the CMS, so that database manipulation cannot reach server-level objects or other databases. Enable and monitor web access logs at volume sufficient to catch serialized payloads in query strings. Keep PHP and all CMS plugins updated, and maintain an SBOM/inventory of deployed web components so newly disclosed flaws like this one can be rapidly scoped.

References

No known threat actor campaigns or exploit-in-the-wild evidence have been identified for CVE-2026-91939 at the time of writing.

👁️ SHODAN DORKS (THREAT HUNTING)

What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.

http.html:

💣 PoC CODE AVAILABLE

Exploit code for this CVE is tracked in our database. Access poc_code via API Pro.

[ API_PRO ] →
◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2026-91939/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.