Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
🐘 Packagist
Not in CISA KEV

GHSA-r2f4-ff2p-xc64

Fix: pimcore/pimcore#19108

GHSA-r2f4-ff2p-xc64 is a SQL Injection vulnerability in pimcore/pimcore. O3 Security confirms whether GHSA-r2f4-ff2p-xc64 is actually reachable in your code before you act, and blocks exploitation at runtime until you patch.

Pimcore Platform - SQL Injection in DataObject composite index handling during class definition import/save

Also known asCVE-2026-5394
Published
May 28, 2026
Updated
Jul 10, 2026
Affected
3 pkgs
Patched
3 / 3
Exploits
None indexed
Exploitation data as of Aug 24, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

No confirmed exploitation observed yet

  • CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.

Exploitation and automatability from CISA’s SSVC triage for GHSA-r2f4-ff2p-xc64.

EPSS Exploitation Probability

via FIRST.org ↗
0.3%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs27th percentile — riskier than 27% of all scored CVEsHighest risk

EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.

Real-World Exposure

3 pkgs affected
🐘pimcore/pimcore🐘pimcore/pimcore🐘pimcore/pimcore

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.

Description

My name is Oscar Uribe, Security Researcher at Fluid Attacks. I am reaching out because we have identified a security vulnerability in Pimcore 12.3.3 that we would like to report to you so we can coordinate a responsible disclosure together.

As part of our standard disclosure measures, we follow a timeline (outlined at https://fluidattacks.com/advisories/policy), which is aligned with ISO/IEC 29147:2018 and ISO/IEC 30111:2019. In short, the timeline works as follows: we ask for acknowledgment of the report within a few days of your first accessing it, and from there, we are happy to coordinate a joint disclosure date with you, typically within 90 days of the initial discovery. This gives your team reasonable time to assess, develop, and release a fix.

We have reserved the CVE ID "CVE-2026-5394" for this issue, and the advisory will eventually be published at https://fluidattacks.com/advisories/dragons. We are committed to coordinating the timing of that publication with you.

Please feel free to reach out if you have any questions about the report, the process, or the timeline. We are glad to work with you on this.

Description

An authenticated administrative user who can import or save DataObject class definitions can inject attacker-controlled composite index metadata and trigger unintended SQL execution in the backend.

The vulnerable flow accepts compositeIndices from imported JSON, stores the values without strict validation, and later concatenates them directly into ALTER TABLE ... DROP INDEX and ALTER TABLE ... ADD INDEX statements executed through Doctrine DBAL.

Although the original report focused on compositeIndices.index_key, independent code review shows that the strongest and most reliable injection point is compositeIndices.index_columns, because it is inserted verbatim inside the ADD INDEX (...) clause. This permits injection of additional ALTER TABLE subclauses against Pimcore object tables without relying on stacked queries.

Vulnerability

Root cause

  1. Source:
    • Pimcore\Model\DataObject\ClassDefinition\Service::importClassDefinitionFromJson() accepts compositeIndices directly from imported JSON.
  2. Assignment:
    • Pimcore\Model\DataObject\ClassDefinition::setCompositeIndices() does not enforce an allowlist for index names or column names.
    • The only special handling is a ManyToOne relation rewrite to __id and __type, which is not a security control.
  3. Sink:
    • Pimcore\Model\DataObject\Traits\CompositeIndexTrait::updateCompositeIndices() builds raw SQL with string concatenation and executes it via $this->db->executeQuery(...).
  4. Missing protection:
    • quoteIdentifier() is used for the SHOW INDEXES query, but not for the dynamic ALTER TABLE statements.
    • No server-side schema validation restricts index_key or index_columns to known safe identifier characters.

Confirmed source-to-sink path

  1. importClassDefinitionFromJson() decodes attacker-controlled JSON and forwards compositeIndices.
  2. setCompositeIndices() stores those values without sanitizing identifier content.
  3. ClassDefinition::save() reaches ClassDefinition\Dao::update().
  4. Dao::update() calls updateCompositeIndices() for:
    • object_store_<classId>
    • object_query_<classId>
  5. Localizedfield\Dao also calls updateCompositeIndices() for:
    • localized query tables
    • localized store tables

Why this is exploitable

The vulnerable ADD INDEX statement is built as:

'ALTER TABLE `'.$table.'` ADD INDEX `' . $key.'` ('.$columnName.');'

$columnName is produced from implode(',', $columns) and is not quoted or validated. A malicious index_columns element such as:

slider), DROP COLUMN `oo_className` -- 

produces SQL of the form:

ALTER TABLE `object_query_<id>` ADD INDEX `c_poc_idx` (slider), DROP COLUMN `oo_className` -- );

This remains a single ALTER TABLE statement, so the base vulnerability does not depend on multi-statement support. The attacker can inject additional DDL clauses affecting the target Pimcore object table.

Impact

The issue allows a privileged attacker to alter backend SQL behavior during class-definition import/save and modify schema on Pimcore object tables associated with the affected class.

Practical impact includes:

  • unauthorized schema modification on object query/store tables
  • backend denial of service by breaking expected table layout
  • data integrity impact for DataObject storage and queries

index_key is also concatenated into SQL without proper identifier escaping, but the most defensible exploitation path is through index_columns.

Relevant code:

  • models/DataObject/ClassDefinition/Service.php:92-137
  • models/DataObject/ClassDefinition.php:994-1006
  • models/DataObject/Traits/CompositeIndexTrait.php:30-85
  • models/DataObject/ClassDefinition/Dao.php:217-218
  • models/DataObject/Localizedfield/Dao.php:945-951

PoC

Application-level PoC

Preconditions:

  • valid authenticated administrative session
  • ability to import or save a class definition containing compositeIndices

The original report reproduced the issue through an authenticated Studio endpoint:

POST /pimcore-studio/api/class/definition/configuration-view/detail/1/import

Minimal malicious JSON fragment:

{
  "compositeIndices": [
    {
      "index_key": "poc_idx",
      "index_type": "query",
      "index_columns": [
        "slider), DROP COLUMN `oo_className` -- "
      ]
    }
  ]
}

Reproduction:

  1. Authenticate as an administrator with permission to manage/import class definitions.
  2. Export an existing class definition or prepare a valid class-definition JSON document.
  3. Replace only the compositeIndices section with the payload above.
  4. Import the modified definition or save the class through the administrative workflow.

Expected result:

  • Pimcore reaches updateCompositeIndices() during class save/import.
  • The backend executes an attacker-influenced ALTER TABLE statement against the target object table.
  • The affected class table is modified unexpectedly, for example by dropping a column or otherwise changing schema.

Minimal source-level confirmation

The behavior is directly visible from the code path:

$newIndicesMap['c_' . $key] = implode(',', $columns);
$columnName = $newIndicesMap[$key];
$this->db->executeQuery(
    'ALTER TABLE `'.$table.'` ADD INDEX `' . $key.'` ('.$columnName.');'
);

No escaping or allowlist validation is applied to $columns before they are interpolated into SQL.

Evidence of Exploitation

  • Video of exploitation:

https://github.com/user-attachments/assets/64a49147-12a5-4550-ba22-cb4383523557

  • Static evidence:
<img width="3004" height="1686" alt="Dragons-img" src="https://github.com/user-attachments/assets/2e920636-ce7e-4f8b-b80c-88fb3c4c5299" />

Our security policy

We have reserved the ID CVE-2026-5394 to refer to this issue from now on.

Disclosure policy

System Information

Pimcore Platform Version v12.3.3 Database layer: doctrine/dbal ^4.4 Operating System: Any

References

Github Repository: https://github.com/pimcore/pimcore Security: https://github.com/pimcore/pimcore/security

Affected Packages

3 total 3 fixed
EcosystemPackageVulnerable rangeFix
🐘Packagistpimcore/pimcore12.0.0-RC1&&< 12.3.712.3.7
🐘Packagistpimcore/pimcoreall versions11.5.17
🐘Packagistpimcore/pimcore2026.1.0&&< 2026.1.32026.1.3

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for pimcore/pimcore. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.

  2. Fix

    Update pimcore/pimcore to 12.3.7 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-r2f4-ff2p-xc64 is resolved across your whole dependency graph.

  3. Workarounds

    If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.

  4. How O3 protects you

    O3 pinpoints whether GHSA-r2f4-ff2p-xc64 is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.

Tailored to GHSA-r2f4-ff2p-xc64. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.

Frequently Asked Questions

My name is Oscar Uribe, Security Researcher at Fluid Attacks. I am reaching out because we have identified a security vulnerability in Pimcore 12.3.3 that we would like to report to you so we can coordinate a responsible disclosure together. As part of our standard disclosure measures, we follow a timeline (outlined at https://fluidattacks.com/advisories/policy), which is aligned with ISO/IEC 29147:2018 and ISO/IEC 30111:2019. In short, the timeline works as follows: we ask for acknowledgment of the report within a few days of your first accessing it, and from there, we are happy to coordinat
O3 Security · Impact-Aware SCA

Is GHSA-r2f4-ff2p-xc64 in your dependencies?

O3 detects GHSA-r2f4-ff2p-xc64 across Packagist dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.

GHSA-r2f4-ff2p-xc64: pimcore/pimcore Denial… | O3 Security