CVE-2026-93870
Executive Summary
CVE-2026-93870 is a Cross-Site Request Forgery (CSRF) vulnerability (CWE-352) affecting the Cotonti content management system through version 1.0.0. The ratings plugin AJAX handler fails to validate anti-CSRF tokens, enabling attackers to forge rating submissions on behalf of authenticated users. Because the flaw requires a victim to visit a malicious page while logged in, the CVSS v3.1 base score is 4.3 (Medium), with a limited integrity-only impact; no public proof-of-concept, exploit code, or Nuclei template is currently available, and the vulnerability remains unpatched.
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.
No signup required
Technical Analysis
Cotonti is a PHP-based modular CMS. The affected component is the ratings plugin, which exposes an AJAX endpoint that accepts POST requests to record user-submitted ratings and update stored rating data. Per the NVD description, this handler "fails to validate anti-CSRF tokens," meaning requests are processed without verifying that they originate from a legitimate session context tied to the user's browser.
In a correctly implemented CSRF defense, the server issues a per-session or per-request token embedded in the legitimate client form and validates that token against the value supplied with incoming state-changing requests. CVE-2026-93870 indicates this validation step is absent from the ratings plugin AJAX handler. As a result, the server relies solely on the presence of the victim's session cookie to authenticate a rating submission — a classic CSRF condition.
Root cause (CWE-352): lack of a server-side mechanism to verify that the request was intentionally generated by the authenticated user rather than by a third-party origin. The attack surface is network-reachable (AV:N) with no privileges required for the attacker (PR:N), but successful exploitation depends on user interaction — the victim must be authenticated and must load attacker-controlled content (UI:R). No specific function names, file paths, or parameter names are disclosed in the NVD description, so the exact handler implementation cannot be characterized beyond the vulnerability class.
Because the AJAX handler accepts POST requests, the browser automatically attaches the victim's authentication cookies when the request is issued from a cross-origin page, unless SameSite cookie attributes or token validation block it. The absence of token validation removes the primary barrier.
Exploitation Scenarios
No public PoC is available; the attack chain below is inferred strictly from the vulnerability class and the NVD description.
Reconnaissance / Target Identification An attacker identifies Cotonti deployments running the ratings plugin at version ≤ 1.0.0. Targets can be enumerated via search-engine and internet-scanning queries that fingerprint the Cotonti application. The attacker must also establish that the ratings plugin is enabled, since the flaw is specific to its AJAX handler.
Triggering the Flaw The attacker crafts a malicious web page (hosted on an attacker-controlled origin) that auto-submits a POST request to the target's ratings AJAX handler when loaded. Because the handler "fails to validate anti-CSRF tokens," it processes the request using only the victim's existing session cookie for authentication. No token is required, and none is checked.
Payload / Execution Method The delivery vector is the victim visiting the attacker's page (via phishing, a compromised site, or a link) while authenticated to the Cotonti target. On page load, the forged POST is issued to the ratings plugin endpoint. Because the request lacks any validated anti-CSRF token, the server accepts it as legitimate and records the attacker-chosen rating value on behalf of the victim.
Post-Exploitation Impact The attacker modifies stored rating data attributed to the authenticated victim. This is an integrity-only impact (CVSS I:L). Ratings can be manipulated to inflate or deflate scores, distorting user-generated content and potentially product/reputation metrics. There is no confidentiality or availability impact per the CVSS vector, and no code execution, privilege escalation, or session hijacking is implied by the description.
Impact Assessment
Per the supplied CVSS v3.1 vector (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N), this is a Medium-severity (4.3) issue with an integrity-only, low impact.
- Scope is Unchanged (S:U) — the impact is confined to the vulnerable component.
- Confidentiality (C:N) and Availability (A:N) are unaffected; no data exfiltration or denial of service.
- Integrity (I:L): attackers can forge ratings, altering stored rating data on behalf of logged-in users.
- Attack complexity is Low (AC:L) but requires user interaction (UI:R), which constrains mass, unattended exploitation. Blast radius: any Cotonti installation (≤ 1.0.0) with the ratings plugin enabled and authenticated users who browse untrusted content. Business impact centers on data integrity and trust — manipulated aggregate ratings can undermine the credibility of community or product feedback, and forged actions tied to a user's account may raise reputational and compliance concerns. The CISA KEV catalog does not list this CVE, and no mass-exploitation campaigns are documented in the provided data.
Detection Guidance
Sigma Rule
title: Potential Cotonti Ratings Plugin CSRF Token Bypass
id: 8f3c1a72-4b9e-4d21-9c7a-cotonti93870
status: experimental
description: Detects suspicious POST requests to the Cotonti ratings plugin AJAX handler lacking a valid anti-CSRF token, consistent with CVE-2026-93870.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-93870
author: valtersit.com
date: 2026-01-01
logsource:
category: webserver
detection:
selection_method:
cs-method: 'POST'
selection_uri:
cs-uri-query|contains:
- 'ratings'
- 'rate'
filter_legit_token:
cs-uri-query|contains:
- 'csrf'
- 'token'
- 'SID'
condition: selection_method and selection_uri and not filter_legit_token
falsepositives:
- Legitimate AJAX rating submissions where token is passed in request body rather than URI
level: medium
tags:
- attack.t1190
- cwe.352
YARA Rule
rule CVE_2026_93870_Cotonti_CSRF_PoC_Page
{
meta:
description = "Detects attacker HTML pages auto-submitting forged POST requests to Cotonti ratings plugin (CVE-2026-93870)"
author = "valtersit.com"
date = "2026-01-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-93870"
severity = "medium"
strings:
$form1 = "<form" ascii nocase
$post1 = "method=\"post\"" ascii nocase
$post2 = "method='post'" ascii nocase
$rate1 = "ratings" ascii nocase
$rate2 = "rate" ascii nocase
$auto1 = "onload=" ascii nocase
$auto2 = "document.forms" ascii nocase
$auto3 = ".submit()" ascii nocase
condition:
$form1 and ($post1 or $post2) and ($rate1 or $rate2) and 1 of ($auto*)
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-93870 Cotonti Ratings Plugin CSRF Forged POST"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"ratings"; nocase; http.referer; content:"!cotonti"; threshold:type limit, track by_src, count 1, seconds 60; classtype:web-application-attack; reference:cve,2026-93870; reference:url,nvd.nist.gov/vuln/detail/CVE-2026-93870; sid:2026938700; rev:1;)
Elastic Detection
sequence by source.ip with maxspan=30s
[ network where http.request.method == "POST" and http.request.referrer != null and
not http.request.referrer : "*cotonti*" and http.request.body.text : "*ratings*" ]
Splunk SPL Query
index=web sourcetype=access_combined
| search method=POST uri_path="*ratings*" OR uri_path="*rate*"
| eval has_token=if(match(uri_query, "(?i)(csrf|token|SID)="), 1, 0)
| where has_token=0 AND (referer="*" OR isnull(referer) OR NOT match(referer, "(?i)cotonti"))
| stats count min(_time) as first_seen max(_time) as last_seen by src_ip, uri_path, referer
| sort - count
Wazuh OSSEC Rule
<group name="web,appsec,cotonti,">
<rule id="100937" level="8">
<if_sid>31100</if_sid>
<match>POST</match>
<regex>ratings|rate</regex>
<description>CVE-2026-93870: Possible Cotonti ratings plugin CSRF token bypass - forged POST without token.</description>
<mitre>
<id>T1190</id>
</mitre>
<group>cwe_352,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source). No vendor fix, workaround, or affected-version list is available from tracked sources.
- Immediate Mitigations
- Disable or restrict the Cotonti ratings plugin AJAX handler until a fix is available.
- Enable SameSite=Strict (or Lax) on session cookies to prevent cross-site requests from carrying authentication.
- Require an additional per-request anti-CSRF token check at the web application firewall (WAF) or reverse-proxy layer if feasible; block POST requests to rating endpoints lacking a valid token.
- Limit exposure of the ratings endpoint to authenticated, same-origin requests via custom server rules.
- Patch / Upgrade Steps
- There is currently no vendor patch. Monitor the Cotonti project for an advisory and upgrade to the first release that validates anti-CSRF tokens in the ratings plugin AJAX handler.
- Until then, treat all Cotonti ≤ 1.0.0 deployments with the ratings plugin as vulnerable.
- Long-Term Hardening
- Enforce framework-wide CSRF token validation on all state-changing endpoints, including AJAX handlers.
- Adopt the synchronizer token pattern or double-submit cookie using cryptographically random, per-session values.
- Set secure cookie attributes (SameSite, Secure, HttpOnly) and validate Origin/Referer headers as defense-in-depth.
- Add regression tests ensuring no state-changing handler processes requests without token verification.
References
- NVD — CVE-2026-93870: https://nvd.nist.gov/vuln/detail/CVE-2026-93870
- MITRE CWE-352 (Cross-Site Request Forgery): https://cwe.mitre.org/data/definitions/352.html
- OWASP Cross-Site Request Forgery Prevention Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
- Cotonti Project — official site/repository: https://www.cotonti.com
- CISA KEV Catalog (CVE-2026-93870 NOT listed as of this report): https://www.cisa.gov/known-exploited-vulnerabilities-catalog
No threat actor campaigns or exploit-in-the-wild evidence are documented for CVE-2026-93870 in the provided intelligence. Do not assume active exploitation; no public PoC, Nuclei template, or exploit code is available.
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.