Skip to main content

plone.app.portlets CVE-2026-57149

| EUVDEUVD-2026-84802 CRITICAL
Eval Injection (CWE-95)
2026-09-22 security-advisories@github.com GHSA-rr49-f9g6-c9r5
9.9
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as low-privilege user
  2. Delivery
    Open personal dashboard portlet manager
  3. Exploit
    Add Classic portlet with crafted TALES payload
  4. Execution
    Portlet render triggers TAL path() evaluation
  5. Impact
    Execute 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.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.6% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

plone.app.portlets 6.0.0, < 6.0.4
plone.app.portlets 5.0.0, < 5.0.8
plone.app.portlets 7.0.0, < 7.0.2

Affected Packages

pypi plone-app-portlets fix: 5.0.8, 6.0.4, 7.0.2

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

Vendor (github) PRIMARY 9.9 CRITICAL
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
vuln.today AI 9.9 CRITICAL

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

2
Patch available
Sep 22, 2026 - 20:18 EUVD
CVE Published
Sep 22, 2026 - 19:16 cve.org
CRITICAL 9.9

DescriptionCVE.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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

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

EPSS Score
0.6%
Top 51% exploitable
Prevalence
Low
Plone is a niche open-source Python/Zope CMS with modest enterprise footprint
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.6%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Very High
Technical Impact
Total

Priority Score

51
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +50
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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 CRITICAL

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.

More in Plone

View all
CVE-2024-23054 CRITICAL POC
9.8 Feb 05

An issue in Plone Docker Official Image 5.2.13 (5221) open-source software that could allow for remote code execution du

CVE-2015-7293 HIGH POC
8.8 Sep 25

Multiple cross-site request forgery (CSRF) vulnerabilities in Zope Management Interface 4.3.7 and earlier, and Plone bef

CVE-2021-32633 HIGH POC
8.8 May 21

Zope is an open-source web application server. Rated high severity (CVSS 8.8), this vulnerability is remotely exploitabl

CVE-2024-23756 HIGH POC
7.5 Feb 08

The HTTP PUT and DELETE methods are enabled in the Plone official Docker version 5.2.13 (5221), allowing unauthenticated

CVE-2013-4200 MEDIUM POC
5.8 Jan 21

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

CVE-2026-57576 MEDIUM POC
6.5 Sep 22

Denial of service in Plone's Dexterity content system lets an authenticated user with content-creation rights submit ite

CVE-2024-23055 MEDIUM POC
6.1 Jan 25

An issue in Plone Docker Official Image 5.2.13 (5221) open-source software allows for remote code execution via improper

CVE-2016-7136 MEDIUM POC
6.1 Mar 07

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 (

CVE-2016-7140 MEDIUM POC
6.1 Mar 07

Multiple cross-site scripting (XSS) vulnerabilities in the ZMI page in Zope2 in Plone CMS 5.x through 5.0.6, 4.x through

CVE-2016-7139 MEDIUM POC
6.1 Mar 07

Cross-site scripting (XSS) vulnerability in an unspecified page template in Plone CMS 5.x through 5.0.6, 4.x through 4.3

CVE-2016-7138 MEDIUM POC
6.1 Mar 07

Cross-site scripting (XSS) vulnerability in the URL checking infrastructure in Plone CMS 5.x through 5.0.6, 4.x through

CVE-2016-7137 MEDIUM POC
6.1 Mar 07

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

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy