CVE-2026-55212
Pimcore: Insufficient Permission Check on Class Definition Creation Endpoint Allows Privilege Escalation
Pimcore is an Open Source Data & Experience Management Platform. Prior to 2025.4.6 and 2026.1.6, the Studio API class definition creation endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is guarded by the objects permission instead of the classes permission, allowing a standard editor-level user to create class definitions without admin privileges. Class definition creation generates new database tables and PHP class files on the server, and missing API-layer UID format validation allows malformed UIDs to reach model-layer validation and return internal exceptions. This issue is fixed in versions 2025.4.6 and 2026.1.6.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.1
Pimcore: Insufficient Permission Check on Class Definition Creation Endpoint Allows Privilege Escalation
Pimcore is an Open Source Data & Experience Management Platform. Prior to 2025.4.6 and 2026.1.6, the Studio API class definition creation endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is guarded by the objects permission instead of the classes permission, allowing a standard editor-level user to create class definitions without admin privileges. Class definition creation generates new database tables and PHP class files on the server, and missing API-layer UID format validation allows malformed UIDs to reach model-layer validation and return internal exceptions. This issue is fixed in versions 2025.4.6 and 2026.1.6.
- Record
CVE-2026-55212- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Weakness
- CWE-285
- Updated
- 2026-11-02
EUVDEUVD-2026-42695
7.1
Pimcore is an Open Source Data & Experience Management Platform. Prior to 2025.4.6 and 2026.1.6, the Studio API class definition creation endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is guarded by the objects permission instead of the classes permission, allowing a standard editor-level user to create class definitions without admin privileges. Class definition creation generates new database tables and PHP class files on the server, and missing API-layer UID format validation allows malformed UIDs to reach model-layer validation and return internal exceptions. This issue is fixed in versions 2025.4.6 and 2026.1.6.
- Record
EUVD-2026-42695- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-f97c-ph8j-8vff
7.1
Pimcore: Insufficient Permission Check on Class Definition Creation Endpoint Allows Privilege Escalation
Summary
The Studio API class definition creation endpoint in pimcore/studio-backend-bundle is guarded by the objects permission instead of the classes permission, allowing any standard editor-level user to create class definitions without admin privileges. Class definition creation is a structural admin operation that generates new database tables and PHP class files on the server. Additionally, the API layer performs no format validation on the uid field before passing it to the model layer, relying solely on model-level validation that exists downstream in ClassDefinition::saveClassInternal().
Details
Issue 1 — Incorrect permission guard on CreateController
studio-backend-bundle/src/Class/Controller/DefinitionConfiguration/CreateController.php:
#[IsGranted(UserPermissions::DATA_OBJECTS->value)]
The endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is protected by DATA_OBJECTS (the objects permission), which is a standard editor-level permission granted to content editors for creating and editing data objects. Class definition creation is a structural admin operation equivalent to schema modification, it creates new database tables and generates PHP class files on the server. This operation should require the classes permission, which is the permission Pimcore enforces for class definition management in the Classic Admin.
Any authenticated user with object editing rights can call this endpoint and create new class definitions, bypassing the intended admin-only restriction. The same user cannot perform this action through the Classic Admin UI, confirming the Studio API enforces a weaker permission check than the existing interface.
Correct guard:
#[IsGranted(UserPermissions::CLASSES->value)]
Issue 2 — No UID format validation at the API layer
studio-backend-bundle/src/Class/MappedParameter/CreateClassDefinitionParameters.php:
public function __construct(
private string $name,
private string $uid
) {
if (trim($name) === '' || trim($uid) === '') {
throw new InvalidArgumentException('Class name and UID cannot be empty.');
}
}
Only an empty-string check is performed on uid at the API boundary before the value is passed to the model layer. While ClassDefinition::saveClassInternal() now validates the UID format via anchored regex, no equivalent validation exists in CreateClassDefinitionParameters. A malformed UID passes through the API layer without any format check and only fails deep in the model layer, returning an unformatted internal exception to the caller rather than a clean 400 API validation response, which can expose internal stack traces depending on server configuration.
Defense-in-depth requires validation at the API boundary consistent with the model layer. The same regex now applied in ClassDefinition.php should also be enforced here:
if (!preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_]*$/', trim($this->uid))) {
throw new InvalidArgumentException(
sprintf('Invalid UID for class definition: %s', $this->uid)
);
}
Affected files in pimcore/studio-backend-bundle:
src/Class/Controller/DefinitionConfiguration/CreateController.phpsrc/Class/MappedParameter/CreateClassDefinitionParameters.php
Vulnerable endpoint:
POST /pimcore-studio/api/class/definition/configuration-view/detail/create
PoC
Prerequisites:
- Pimcore 2026.1.x with Studio API enabled
- A user
editorwith only theobjectspermission and noclassespermission
Step 1 — Authenticate as the editor user:
curl -s -c /tmp/cookies.txt -X POST \
"https://your-pimcore/pimcore-studio/api/login" \
-H "Content-Type: application/json" \
-d '{"username":"editor","password":"password"}'
Expected response:
{"message": "Login successful"}
Step 2 — Confirm the user has no class management access in Classic Admin
Log into…
- Record
GHSA-f97c-ph8j-8vff- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Weakness
- CWE-20, CWE-285
- Updated
- 2026-11-02
NVD
7.1
Pimcore is an Open Source Data & Experience Management Platform. Prior to 2025.4.6 and 2026.1.6, the Studio API class definition creation endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is guarded by the objects permission instead of the classes permission, allowing a standard editor-level user to create class definitions without admin privileges. Class definition creation generates new database tables and PHP class files on the server, and missing API-layer UID format validation allows malformed UIDs to reach model-layer validation and return internal exceptions. This issue is fixed in versions 2025.4.6 and 2026.1.6.
- Record
CVE-2026-55212- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Weakness
- CWE-285
- Updated
- 2026-11-02
OSV
7.1
Pimcore: Insufficient Permission Check on Class Definition Creation Endpoint Allows Privilege Escalation
Pimcore is an Open Source Data & Experience Management Platform. Prior to 2025.4.6 and 2026.1.6, the Studio API class definition creation endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is guarded by the objects permission instead of the classes permission, allowing a standard editor-level user to create class definitions without admin privileges. Class definition creation generates new database tables and PHP class files on the server, and missing API-layer UID format validation allows malformed UIDs to reach model-layer validation and return internal exceptions. This issue is fixed in versions 2025.4.6 and 2026.1.6.
- Record
CVE-2026-55212- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Weakness
- CWE-285
- Updated
- 2026-11-02
OSVGHSA-f97c-ph8j-8vff
7.1
Pimcore: Insufficient Permission Check on Class Definition Creation Endpoint Allows Privilege Escalation
Summary
The Studio API class definition creation endpoint in pimcore/studio-backend-bundle is guarded by the objects permission instead of the classes permission, allowing any standard editor-level user to create class definitions without admin privileges. Class definition creation is a structural admin operation that generates new database tables and PHP class files on the server. Additionally, the API layer performs no format validation on the uid field before passing it to the model layer, relying solely on model-level validation that exists downstream in ClassDefinition::saveClassInternal().
Details
Issue 1 — Incorrect permission guard on CreateController
studio-backend-bundle/src/Class/Controller/DefinitionConfiguration/CreateController.php:
#[IsGranted(UserPermissions::DATA_OBJECTS->value)]
The endpoint POST /pimcore-studio/api/class/definition/configuration-view/detail/create is protected by DATA_OBJECTS (the objects permission), which is a standard editor-level permission granted to content editors for creating and editing data objects. Class definition creation is a structural admin operation equivalent to schema modification, it creates new database tables and generates PHP class files on the server. This operation should require the classes permission, which is the permission Pimcore enforces for class definition management in the Classic Admin.
Any authenticated user with object editing rights can call this endpoint and create new class definitions, bypassing the intended admin-only restriction. The same user cannot perform this action through the Classic Admin UI, confirming the Studio API enforces a weaker permission check than the existing interface.
Correct guard:
#[IsGranted(UserPermissions::CLASSES->value)]
Issue 2 — No UID format validation at the API layer
studio-backend-bundle/src/Class/MappedParameter/CreateClassDefinitionParameters.php:
public function __construct(
private string $name,
private string $uid
) {
if (trim($name) === '' || trim($uid) === '') {
throw new InvalidArgumentException('Class name and UID cannot be empty.');
}
}
Only an empty-string check is performed on uid at the API boundary before the value is passed to the model layer. While ClassDefinition::saveClassInternal() now validates the UID format via anchored regex, no equivalent validation exists in CreateClassDefinitionParameters. A malformed UID passes through the API layer without any format check and only fails deep in the model layer, returning an unformatted internal exception to the caller rather than a clean 400 API validation response, which can expose internal stack traces depending on server configuration.
Defense-in-depth requires validation at the API boundary consistent with the model layer. The same regex now applied in ClassDefinition.php should also be enforced here:
if (!preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_]*$/', trim($this->uid))) {
throw new InvalidArgumentException(
sprintf('Invalid UID for class definition: %s', $this->uid)
);
}
Affected files in pimcore/studio-backend-bundle:
src/Class/Controller/DefinitionConfiguration/CreateController.phpsrc/Class/MappedParameter/CreateClassDefinitionParameters.php
Vulnerable endpoint:
POST /pimcore-studio/api/class/definition/configuration-view/detail/create
PoC
Prerequisites:
- Pimcore 2026.1.x with Studio API enabled
- A user
editorwith only theobjectspermission and noclassespermission
Step 1 — Authenticate as the editor user:
curl -s -c /tmp/cookies.txt -X POST \
"https://your-pimcore/pimcore-studio/api/login" \
-H "Content-Type: application/json" \
-d '{"username":"editor","password":"password"}'
Expected response:
{"message": "Login successful"}
Step 2 — Confirm the user has no class management access in Classic Admin
Log into…
- Record
GHSA-f97c-ph8j-8vff- CVSS 3.1
- 7.1 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N - Weakness
- CWE-20, CWE-285
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pimcore/studio-backend-bundlePackagist |
before 2025.4.6 | 2025.4.6 |
pimcore/studio-backend-bundlePackagist |
2026.1.0 up to 2026.1.6 | 2026.1.6 |
pimcore/studio-backend-bundlePackagist |
before 2026.1.6, plus listed versions v0.10.21v0.12.18v0.12.9v0.13.20v0.14.19 Show 25 moreShow lessv0.15.17v0.4.30v0.5.20v0.6.30v0.9.30v2025.4.0v2025.4.1v2025.4.10v2025.4.11v2025.4.12v2025.4.13v2025.4.2v2025.4.3v2025.4.4v2025.4.5v2025.4.6v2025.4.7v2025.4.8v2025.4.9v2026.1.0v2026.1.1v2026.1.2v2026.1.3v2026.1.4v2026.1.5 |
2026.1.6 |
pimcore/studio-backend-bundlePackagist |
2026.1.0 up to 2026.1.6, plus listed versions v2026.1.0v2026.1.1v2026.1.2v2026.1.3v2026.1.4v2026.1.5 |
2026.1.6 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-55212 is a high vulnerability (CVSS 7.1) in Pimcore, published July 9, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.35%, the 28th percentile. Fixed in pimcore/studio-backend-bundle 2025.4.6.
References
github.com/pimcore/pimcore/security/advisories/GHSA-f97c-ph8j-8vff
github.com/pimcore/studio-backend-bundle/pull/1886
github.com/pimcore/studio-backend-bundle/commit/d1a4788c0f159c360d550c34256c8abbbd633ae0
github.com/pimcore/studio-backend-bundle/releases/tag/v2025.4.6
github.com/pimcore/studio-backend-bundle/releases/tag/v2026.1.6
nvd.nist.gov/vuln/detail/CVE-2026-55212
github.com/advisories/GHSA-f97c-ph8j-8vff
github.com/CVEProject/cvelistV5/tree/main/cves/2026/55xxx/CVE-2026-55212.json
github.com/pimcore/pimcore
Left out here: the rest of 2 source descriptions. The JSON record has them.