CVE-2026-81923
Executive Summary
CVE-2026-81923 is a broken access control vulnerability (CWE-862, "Missing Authorization") in Concrete CMS versions prior to 9.5.3. The SEO Bulk Update Meta Tags editor fails to enforce per-page edit permissions before saving changes: the saveRecord() action validates the per-page CSRF token but never calls canEditPageProperties() against the target page, allowing a user who has legitimate access to the bulk SEO tool but only view-level rights on a given page to modify that page's meta title, meta description, and URL handle. The impact is integrity-only and scoped (CVSS v4.0 score 2.1, VI:L), affecting the presentation layer and live URLs of otherwise protected content rather than confidentiality or availability.
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
The vulnerability resides in the authorization logic of the Concrete CMS SEO Bulk Update Meta Tags editor, an administrative interface that allows bulk editing of SEO metadata across multiple site pages. Concrete CMS employs a two-part safeguard for state-changing operations: (1) a CSRF token that is bound to the target page, and (2) a per-page permission check that establishes whether the acting user has edit authority over that specific page's properties.
Per the NVD description, the implementation in affected versions validates only the first control. The saveRecord() action checked the per-page CSRF token supplied with the request but never invoked canEditPageProperties() for the page identified in the request payload. The CSRF token is an anti-automation/anti-forgery control — it confirms the request originated from the user's own authenticated session and was tied to a specific page — but it does not assert authorization. Because the token is not an access control mechanism, a user who held a role granting access to the bulk SEO tool, and who could view a target page but not edit it, could submit a well-formed request and have it accepted.
The concrete consequences are limited to three mutable page-property fields named in the description:
- Meta title — the HTML
<title>/ SEO title value. - Meta description — the SEO meta description.
- URL handle — the page's slug/path component, which determines its live, published URL.
All three are properties governed by the page-properties edit permission. The failure to call canEditPageProperties() means the write succeeds despite the absence of that permission, producing a vertical-adjacent privilege escalation within the SEO tool's own page scope rather than full administrative compromise. There is no evidence of SQL injection, remote code execution, file upload, or deserialization in the described mechanism; this is strictly a missing-authorization (CWE-862) case.
Two caveats matter for defenders. First, the attack is bounded: it requires an authenticated account (future-proofing note — CVSS v4.0 rates PR:H, i.e., high privileges required to reach the vulnerable tool) and physical/network adjacency is not required, but AT:P (attack requirements present) and the scoped VI:L rating encode that the attacker must already possess the bulk SEO tool entitlement. Second, because URL handles are modified, the tampering is directly visible on the public internet and can affect indexing, canonical URLs, search rankings, and inbound deep links.
Exploitation Scenarios
No public proof-of-concept, Nuclei template, or exploit code exists for this CVE as of the data snapshot (EPSS 0.00229, 13.9th percentile). The following chain is inferred strictly from the NVD description and the CWE-862 class; no function names, endpoints, or parameters beyond those in the description are assumed.
Reconnaissance / target identification. The attacker must first hold an authenticated Concrete CMS account with access to the SEO Bulk Update Meta Tags tool, and must be able to view at least one page they do not have edit rights over. The Concrete CMS application surface is identifiable via web finger-printing (CMS generator strings,
/concrete/asset paths, login/permission-gated interfaces). Publicly accessible sites running Concrete CMS < 9.5.3 are the population at risk; the attacker is an insider or a compromised low-privilege account holder.Triggering the missing-authorization flaw. Using the bulk SEO editor, the attacker composes a bulk save request that targets a page outside their edit scope. The request carries the per-page CSRF token — which the legitimate tool flow supplies and which the server validates — satisfying the anti-forgery control. It does not, however, carry any proof of the per-page edit permission, and the saveRecord() action performs no canEditPageProperties() check. Classic broken-access-control chaining applies here: the attacker pairs a permitted interface (the bulk SEO tool) with a resource identifier (the target page) for which the server fails to re-authorize. Note: because the request is generated through the normal UI or by replaying the session's own token, the attack does not depend on cross-site request forgery; the CSRF token is present and valid.
Payload / execution method. At the vulnerability-class level, the "payload" is a state-changing save operation whose target resource identifier points to a page the user cannot edit, carrying attacker-chosen values for meta title, meta description, and URL handle. The server accepts the request and persists the fields because the authorization gate is absent. No memory-corruption payload or injected code is required; the manipulation is pure data tampering within the CMS's own metadata store.
Post-exploitation impact. The attacker's supplied values become live on the affected pages. Practical consequences include:
- SEO/content poisoning: altered meta titles and descriptions can misrepresent page content in search results, facilitate phishing lures, or damage brand trust.
- URL redirection/deep-link breakage: changing the URL handle alters the live address of protected content, breaking bookmarks, inbound links, and indexed URLs, and creating opportunities for content spoofing on the vacated path if it is later reused.
- Persistence: with no permission check, the modification can be repeated and can be applied across many pages through the bulk interface, effectively operating as a limited mass-tamper primitive.
- No confidentiality or availability impact is described — payloads are not read, and the page itself remains served (VC:N, VA:N).
Because this is an integrity-only, scope-limited primitive, attackers would most plausibly use it as a component of a larger influence or SEO-poisoning operation rather than as a sole objective. There is no evidence of exploitation in the wild, no KEV listing, and no known threat-actor campaign associated with this CVE.
Impact Assessment
The CVSS v4.0 vector CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N yields a base score of 2.1 (Low). Interpretation of each metric:
- AV:N — exploitable over the network through the web application.
- AC:L — no unusual conditions; a properly formed request succeeds.
- AT:P — attack requirements are present: the adversary must already possess access to the bulk SEO tool and visibility of the target page.
- PR:H — a privileged (tool-entitled) account is required.
- UI:N — no victim interaction needed beyond the attacker's own authenticated session.
- VC:N / VI:L / VA:N — no confidentiality loss; low integrity impact only; no availability loss.
- SC:N / SI:N / SA:N — no impact on subsequent systems; the effect is confined to the vulnerable CMS.
Business impact centers on content integrity and SEO governance rather than data breach. Organizations running Concrete CMS with delegated editing models (staff, agencies, multi-site contributors) are most exposed, because the population of account holders with bulk-SEO access is larger than the population with full page-edit rights. Blast radius is bounded to pages the attacker can address with a valid per-page CSRF token — typically the sites and pages visible within their tool scope. Because URL handles are among the mutable fields, the side effects extend to the public web (search engine indexes, cached links), complicating rollback and incident response.
Detection Guidance
Detection should focus on anomalous writes to page SEO properties by low-privilege accounts, and on the authorization-bypass pattern (bulk-save requests targeting pages the actor cannot edit). Concrete's own audit logging of page-property changes, plus reverse-proxy/WAF logs for the bulk SEO save action, are the primary telemetry sources. The rules below are pattern-based and should be tuned to the environment; references to saveRecord/canEditPageProperties reflect the CVE description, not discovered endpoint names.
Sigma Rule
title: Concrete CMS Bulk SEO Meta Tag Save Without Edit Permission Check (CVE-2026-81923)
id: 8b1e5c3a-2f4d-4d9e-9c47-concrete81923
status: experimental
description: Detects successful updates to Concrete CMS page SEO properties (meta title/description/URL handle) by accounts lacking page-edit rights, abusing the bulk SEO editor authorization bypass.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-81923
author: valtersit.com Threat Intelligence
date: 2026/01/01
tags:
- attack.privilege_escalation
- attack.t1190
- cve.2026.81923
logsource:
category: application
product: concrete_cms
detection:
selection_action:
event_action:
- 'save_meta_tags'
- 'seo_bulk_update'
- 'saveRecord'
selection_fields:
changed_field:
- 'meta_title'
- 'meta_description'
- 'url_handle'
filter_authorized:
actor_can_edit_page: 'true'
condition: selection_action and selection_fields and not filter_authorized
falsepositives:
- Legitimate editors with page-edit rights if permission context is not logged
- Automated SEO maintenance jobs running under service accounts
level: medium
YARA Rule
rule CVE_2026_81923_Concrete_CMS_Bulk_SEO_Authz_Bypass
{
meta:
description = "Detects Concrete CMS bulk SEO meta-tag save handlers that omit the per-page canEditPageProperties() authorization check (CVE-2026-81923)"
author = "valtersit.com Threat Intelligence"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-81923"
cve = "CVE-2026-81923"
date = "2026-01-01"
strings:
$h1 = "SEO Bulk Update" ascii wide nocase
$h2 = "canEditPageProperties" ascii wide
$h3 = "saveRecord" ascii wide
$f1 = "meta_description" ascii wide
$f2 = "meta_title" ascii wide
$f3 = "url_handle" ascii wide
condition:
uint32be(0) == 0x3C3F7068 or filesize < 2MB
and ( $h1 or $h3 )
and ( $f1 or $f2 or $f3 )
and not $h2
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-81923 Concrete CMS Bulk SEO Authorization Bypass - Meta Tag Save Attempt"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"seo"; http.uri; content:"bulk"; nocase; http.request_body; content:"meta_title"; nocase; http.request_body; content:"meta_description"; nocase; http.request_body; content:"url_handle"; nocase; http.header; content:"Cookie"; nocase; threshold:type both, track by_src, count 20, seconds 300; reference:cve,2026-81923; classtype:attempted-user; sid:2026081923; rev:1;)
Elastic Detection
sequence by user.id, source.ip with maxspan=5m
[ authentication where event.outcome == "success" and user.name : * ]
[ http where http.request.method == "POST"
and url.path : "*seo*bulk*"
and http.request.body.content : ("meta_title" or "meta_description" or "url_handle")
and not user.roles : ("administrator" or "editor")
and event.outcome == "success" ]
Splunk SPL Query
index=web OR index=concrete sourcetype=concrete_cms:access_log OR sourcetype=concrete_cms:audit
| eval method=coalesce(http_method, method)
| search method=POST
| eval uri_lc=lower(coalesce(uri, url, cs_uri_stem))
| search uri_lc IN ("*seo*", "*bulk*", "*meta*")
| eval body_lc=lower(coalesce(request_body, cs_uri_query, audit_message))
| search body_lc IN ("*meta_title*", "*meta_description*", "*url_handle*")
| lookup concrete_users actor_id OUTPUT roles page_edit_perms
| where NOT match(lower(roles), "administrator") AND (page_edit_perms!="true" OR isnull(page_edit_perms))
| stats count min(_time) as first_seen max(_time) as last_seen values(uri) as targets by src_ip, actor_id, roles
| where count > 0
| convert ctime(first_seen) ctime(last_seen)
Wazuh OSSEC Rule
<group name="web,cve-2026-81923,concrete_cms,">
<rule id="200923" level="10">
<decoded_as>json</decoded_as>
<field name="event_action">save_meta_tags|seo_bulk_update</field>
<field name="changed_field">meta_title|meta_description|url_handle</field>
<field name="actor_can_edit_page">false</field>
<description>CVE-2026-81923: Concrete CMS bulk SEO meta-tag update by actor without page edit permission</description>
<mitre>
<id>T1190</id>
</mitre>
</rule>
<rule id="200924" level="12">
<if_sid>200923</if_sid>
<field name="url_handle_changed">true</field>
<description>CVE-2026-81923: Concrete CMS URL handle modified by unauthorized bulk SEO actor - possible content/link tampering</description>
<mitre>
<id>T1499</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence is 0/4 — UNPATCHED: no patch evidence was found in any tracked source, and no vendor fix reference, commit hash, or advisory URL was supplied. The CVE description states that Concrete CMS "before 9.5.3" is affected, which implies 9.5.3 contains the fix, but this must be independently verified before any upgrade plan is treated as remediation.
Immediate mitigations (no code change):
- Prune entitlements. Audit which accounts hold access to the SEO Bulk Update Meta Tags tool. Remove that permission from any user who does not also possess page-edit rights for the pages in their scope, eliminating the precondition (bulk-tool access + view-only page) the vulnerability requires.
- Restrict network/application exposure. Require authentication for all administrative tooling, enforce MFA on accounts with SEO-tool access, and place the CMS admin interface behind IP allow-listing or a zero-trust access proxy where feasible.
- Compensating control at the edge. Where a WAF/reverse proxy is available, add a virtual patch that rejects bulk SEO meta-tag save requests where the target page identifier is outside the authenticated user's granted page set. Validate the user's page-edit permission server-side or via the CMS's permission API rather than trusting client-supplied scope.
- Monitor for a vendor hotfix. Because patch confidence is zero, treat the version claim in the description as unconfirmed; subscribe to the Concrete CMS security advisory feed and monitor the project's release notes.
Patch/upgrade steps:
- Verify the actual fixed version by consulting the official Concrete CMS security advisory and release notes once they are locatable — do not assume 9.5.3 from the description alone.
- When an authoritative fix is confirmed: stage it in a non-production environment, exercise the SEO bulk editor with a view-only test account to confirm that the write is now rejected, then deploy. Back up the database first, as URL-handle changes are stored data.
- Until a verifiable patch exists, apply the workaround in step 1 as the primary control.
Long-term hardening:
- Enforce authorization on every state change. Standardize on server-side permission checks (the missing canEditPageProperties() pattern) in addition to CSRF tokens for all bulk editor actions; treat CSRF as defense-in-depth, never as authorization.
- Bulk-endpoint scope enforcement. For bulk operations, re-authorize each item in the batch individually and fail closed if any target is outside the actor's scope.
- Audit logging and alerting. Log every change to page properties (title, meta description, URL handle) with actor, timestamp, and target; wire to SIEM and alert on changes by accounts lacking edit rights.
- Least privilege in CMS roles. Periodically review delegated roles; separate SEO-tool entitlements from content-edit entitlements where business workflows permit.
- Defense-in-depth validation. Add automated regression tests that assert view-only users cannot mutate metadata, and include bulk editor permission assertions in CI.
References
- NVD — CVE-2026-81923: https://nvd.nist.gov/vuln/detail/CVE-2026-81923
- Concrete CMS — official security advisories / release notes (consult the vendor's security page for the advisory corresponding to this CVE and the definitive fixed version)
- CWE-862: Missing Authorization — https://cwe.mitre.org/data/definitions/862.html
- FIRST EPSS — CVE-2026-81923 (score 0.00229, 13.9th percentile as of snapshot): https://api.first.org/data/v1/epss?cve=CVE-2026-81923
- CISA Known Exploited Vulnerabilities catalog — CVE-2026-81923 not listed (checked against snapshot); no exploit-in-the-wild evidence, no public PoC, and no associated threat-actor campaign identified at time of writing. Reported by Andrew Gonzalez; vendor credit to the Concrete CMS security team.