Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privilege user
-
DeliveryOpen personal dashboard portlet manager
-
ExploitAdd Classic portlet with crafted TALES payload
-
ExecutionPortlet render triggers TAL path() evaluation
-
ImpactExecute arbitrary code in Plone process
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Eval input sanitization
MITRE ATT&CK
1 technique across 1 tactic: Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated Plone account holding the plone.app.portlets.ManageOwnPortlets permission and the ability to add or edit a Classic portlet (plone.app.portlets.portlets.classic) - under Plone's DEFAULT role map ordinary registered users have this on their personal dashboard, so on sites permitting self-registration or granting portlet management broadly the effective bar is any logged-in user. Exploitation is limited where administrators have already restricted 'Manage portlets' to Manager/Site Administrator roles, removed ManageOwnPortlets from untrusted roles, unregistered the Classic portlet via portlets.xml, or blanked the classic.pt template. Affected versions: plone.app.portlets 5.0.0 up to but not including 5.0.8, 6.0.4, and 7.0.2. |
| Impact | This is a genuine high-priority issue, not a CVSS-inflated one. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H, 9.9) reflects network-reachable, low-complexity server-side code execution requiring only low-privilege authentication, with a scope change because the attacker crosses the trust boundary from an authenticated web user into the Plone/Zope server process. The critical aggravating factor is that under Plone's DEFAULT role map, ordinary registered users hold the ManageOwnPortlets permission on their personal dashboard, so the PR:L barrier is effectively 'any account the site allows to register or log in' - for public-registration Plone sites this approaches unauthenticated RCE in practice. Mitigating signals: no EPSS score, no CISA KEV entry, and no public exploit code were supplied, so exploitation status is 'no public exploit identified at time of analysis' - the risk is driven by the low technical bar (TALES expression injection is trivial to weaponize for anyone who understands Zope/TAL) rather than by observed in-the-wild activity. No SSVC decision data was provided. Net: patch urgently on any Plone instance that permits user self-registration or grants portlet management to non-administrators. |
| Exploit ScenarioDerived | An attacker registers or uses any low-privilege account on a Plone site and navigates to their personal dashboard, where the default role map grants the ManageOwnPortlets permission. They add a Classic portlet and set its template/macro field to a crafted TALES expression that escapes the intended path lookup; when the portlet renders, the TAL path() helper evaluates the value as arbitrary code inside the Plone process. No user interaction and no public exploit code are required - the technique follows directly from how the field is evaluated. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 22, 2026
Arbitrary server-side code execution in the Plone process is possible through the Classic portlet shipped in plone.app.portlets 5.0.0 through 7.0.1, where user-supplied template and macro fields are assembled into a TALES path expression and then evaluated by the TAL path() helper, allowing a crafted value to be interpreted as a full expression rather than a constrained path. Any authenticated user who can add or edit a Classic portlet can execute code, and under Plone's default role map that includes ordinary registered users on their personal dashboard, so the issue amounts to a post-authentication privilege escalation across the trust boundary between a web user and the server-side Plone process (CVSS 3.1 9.9, scope changed: AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H). There is no confirmed active exploitation (no CISA KEV listing) and no public exploit identified at time of analysis, but vendor patches are available in 5.0.8, 6.0.4, and 7.0.2.
RemediationAI
Vendor-released patch: upgrade plone.app.portlets to 5.0.8 (5.x line), 6.0.4 (6.x line), or 7.0.2 (7.x line), as documented in GHSA-rr49-f9g6-c9r5 (https://github.com/plone/plone.app.portlets/security/advisories/GHSA-rr49-f9g6-c9r5); this is the primary fix and should be applied before relying on any workaround. If upgrading immediately is not possible, the advisory offers three compensating controls with distinct trade-offs: first, remove the plone.app.portlets.ManageOwnPortlets permission from untrusted roles and confine 'Manage portlets' to trusted administrators (normally Manager and Site Administrator) - effective, but it prevents ordinary users from customizing their own dashboards; second, unregister the Classic portlet by editing a portlets.xml in your own add-on so the portlet can no longer be added - effective and durable, but any existing Classic portlets stop rendering and legacy content may need migration to another portlet type; third, neutralize rendering by customizing the classic.pt template: in the Zope Management Interface open the portal_view_customizations tool, locate classic.pt, click Customize, delete all content and replace it with a placeholder such as <div>The classic portlet was disabled.</div> - the advisory notes this is not a recommended way to customize a template, and because it is a site-local template override it can be lost or diverge from upstream on upgrade, while also disabling the portlet entirely for all users.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
plone.app.portlets supplies the Plone-specific UI layer for plone.portlets together with the portlets that ship with Plone, one of which is the legacy Classic portlet (plone.app.portlets.portlets.classic) that renders previously configured classic-style portlet content. The root cause is an eval-injection weakness (CWE-95): the Classic portlet takes its user-supplied template and macro fields and concatenates them into a TALES (Template Attribute Language Expression Syntax) path expression that is subsequently handed to the TAL path() helper for evaluation. The code intended to accept only a traversable object path, but because the resulting string is evaluated as a complete TALES expression, a crafted value can break out of plain path traversal and be executed as arbitrary Python/TALES logic inside the Zope/Plone runtime. The CVSS vector's changed scope (S:C) reflects exactly this crossing from the authenticated web-user trust context into the server-side Plone process, where confidentiality, integrity, and availability impact is total.
Know when Plone 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
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Network-reachable low-complexity RCE needing only a low-privilege portlet-managing account (PR:L, default for regular users); scope changes as code executes in the server process beyond the web-user boundary, yielding full C/I/A.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
2DescriptionCVE.org
plone.app.portlets.portlets provides a Plone-specific user interface for plone.portlets, as well as a standard set of portlets that ship with Plone. Starting in version 5.0.0 and prior to versions 5.0.8, 6.0.4, and 7.0.2, the Classic portlet (plone.app.portlets.portlets.classic) used its user-supplied template/macro fields to build a TALES path expression that was then evaluated by the TAL path() helper. Because the value was interpreted as a full TALES expression, a user able to add or edit a Classic portlet could supply a crafted value that escapes simple path traversal and is evaluated as arbitrary code. This is exploitable by any authenticated user who can configure a Classic portlet - which, with the default role map, includes regular users on their personal dashboard. The result is code execution in the context of the Plone process, i.e. a privilege escalation across the trust boundary between an authenticated web user and the server-side process. The problem has been patched in plone.app.portlets 5.0.8, 6.0.4, and 7.0.2. Some workarounds are available. Restrict who can manage portlets: remove the plone.app.portlets.ManageOwnPortlets permission from untrusted roles, and limit Manage portlets to trusted administrators (usually this is already restricted to the Manager and Site Administrator roles). Where the Classic portlet is not needed, unregister it so it cannot be added. This would need to be done by editing a portlets.xml in your own code. One may also effectively disable showing the classic portlet by customising its template. In the Zope Management Interface go to the portal_view_customizations tool, locate the classic.pt template and click it. Click the Customize button. Remove all text and replace it with <div>The classic portlet was disabled.</div>. (This is not a recommended way of customizing a template, but in this case it is quite effective.)
Technical POC Analysis
The flaw is CWE-95, Improper Neutralization of Directives in Dynamically Evaluated Code ("Eval Injection").
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A critical defect in plone.app.portlets (versions 5.0.0 through 7.0.1) lets any authenticated user - including ordinary registered users working on their personal dashboard under Plone's default role map - run arbitrary code inside the Plone server process. This turns a routine low-privilege login into full compromise of the Plone instance, exposing all managed content, credentials, and any systems or data the Plone process can reach. Because the vulnerability crosses the trust boundary between web user and server process, every account on an affected deployment should be treated as a potential entry point, not just administrator accounts.
Apply vendor patch (upgrade to plone.app.portlets 5.0.8, 6.0.4, or 7.0.2 per the vendor advisory); until the upgrade is completed, restrict Classic portlet add/edit rights to trusted administrative roles and disable the Classic portlet where it is not required.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
An issue in Plone Docker Official Image 5.2.13 (5221) open-source software that could allow for remote code execution du
Multiple cross-site request forgery (CSRF) vulnerabilities in Zope Management Interface 4.3.7 and earlier, and Plone bef
Zope is an open-source web application server. Rated high severity (CVSS 8.8), this vulnerability is remotely exploitabl
The HTTP PUT and DELETE methods are enabled in the Plone official Docker version 5.2.13 (5221), allowing unauthenticated
The isURLInPortal method in the URLTool class in in_portal.py in Plone 2.1 through 4.1, 4.2.x through 4.2.5, and 4.3.x t
Denial of service in Plone's Dexterity content system lets an authenticated user with content-creation rights submit ite
An issue in Plone Docker Official Image 5.2.13 (5221) open-source software allows for remote code execution via improper
z3c.form in Plone CMS 5.x through 5.0.6 and 4.x through 4.3.11 allows remote attackers to conduct cross-site scripting (
Multiple cross-site scripting (XSS) vulnerabilities in the ZMI page in Zope2 in Plone CMS 5.x through 5.0.6, 4.x through
Cross-site scripting (XSS) vulnerability in an unspecified page template in Plone CMS 5.x through 5.0.6, 4.x through 4.3
Cross-site scripting (XSS) vulnerability in the URL checking infrastructure in Plone CMS 5.x through 5.0.6, 4.x through
Multiple open redirect vulnerabilities in Plone CMS 5.x through 5.0.6, 4.x through 4.3.11, and 3.3.x through 3.3.6 allow
EUVD-2026-84802
GHSA-rr49-f9g6-c9r5
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB