Description
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.)
Published: 2026-09-22
Score: 9.9 Critical
EPSS: n/a
KEV: No
Impact: Remote Code Execution
Action: Patch Now
AI Analysis

Impact

plone.app.portlets portlets allow an authenticated user who can configure a Classic portlet to supply a crafted template/macro value that is treated as a TALES expression. The TALES path() helper then evaluates this expression as arbitrary code executed with the privileges of the Plone process. This delivers remote code execution and privilege escalation across the boundary between a logged‑in web user and the server side application. The flaw is a classic example of CWE‑95, insecure code execution via user‑supplied input.

Affected Systems

The vulnerability affects the Plone CMS product family through the plone.app.portlets package. Versions from 5.0.0 up to but excluding 5.0.8, from 6.0.0 up to 6.0.4, and from 7.0.0 up to 7.0.2 are impacted. All installations that expose a Classic portlet and allow users to add or edit it are susceptible, including default user dashboards where regular users possess portlet manage rights.

Risk and Exploitability

The CVSS score of 9.9 marks this flaw as critical, and the lack of an EPSS score means the exploitation probability cannot be quantified, but the attack path is clear for any authenticated user with portlet configuration privileges. The vulnerability is not listed in the CISA KEV catalog, yet its high severity and potential for widespread server compromise demand that it be addressed immediately. The analyst should focus on identifying any Classic portlet instances and the roles that can modify them to assess exposure.

Generated by OpenCVE AI on September 22, 2026 at 20:38 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade plone.app.portlets to 5.0.8, 6.0.4, or 7.0.2 to apply the vendor patch
  • Remove the plone.app.portlets.ManageOwnPortlets permission from untrusted roles and restrict portlet management to trusted administrators
  • Unregister or disable the Classic portlet through site configuration or by editing portlets.xml so that it cannot be added, or customize its template to block execution of TALES expressions

Generated by OpenCVE AI on September 22, 2026 at 20:38 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 22 Sep 2026 21:00:00 +0000

Type Values Removed Values Added
First Time appeared Plone
Plone plone.app.portlets
Vendors & Products Plone
Plone plone.app.portlets

Tue, 22 Sep 2026 20:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}


Tue, 22 Sep 2026 19:15:00 +0000

Type Values Removed Values Added
Description 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.)
Title plone.app.portlets Vulnerable to Remote Code Execution via TALES Injection
Weaknesses CWE-95
References
Metrics cvssV3_1

{'score': 9.9, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H'}


Subscriptions

Plone Plone.app.portlets
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-09-22T19:14:41.003Z

Reserved: 2026-06-24T01:45:48.697Z

Link: CVE-2026-57149

cve-icon Vulnrichment

Updated: 2026-09-22T19:13:47.053Z

cve-icon NVD

Status : Received

Published: 2026-09-22T19:16:43.893

Modified: 2026-09-22T20:17:03.850

Link: CVE-2026-57149

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-22T20:45:16Z

Weaknesses
  • CWE-95

    Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')