Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privilege content editor
-
DeliveryStore script payload as sub-element name
-
ExploitDelete sub-element to write log entry
-
ExecutionHigher-privileged admin views activity log (/log)
-
ImpactPayload parsed as live DOM in admin context
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, 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 account with edit rights on an entity that owns a named collection sub-element (Part Parameter, Attachment, PartLot, Orderdetail, etc.) so the attacker can store an arbitrary string as that sub-element's name and then delete it, which is what writes the CollectionElementDeleted log entry. Exploitation only yields impact when a higher-privileged victim subsequently views the data: a user with system.show_logs opening /log (typically an admin/auditor), or a user with show_history opening the affected element's history table. The key limiting factor is the application's default Content-Security-Policy (script-src 'self' 'wasm-unsafe-eval', no unsafe-inline, plus X-Content-Type-Options: nosniff), which prevents the injected inline <script>/onerror JavaScript from executing - so on a default deployment this is HTML/CSS injection (content spoofing, UI-redress, img-src beaconing) rather than JavaScript execution. Full script execution requires a relaxed/non-default CSP or a rendering context where the markup executes. Affected: Part-DB-server <= 2.12.0; fixed in 2.12.1. |
| Impact | This is a genuine but moderate-priority issue, not a drop-everything emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:L/UI:N, VI:H) and the 6.0 MEDIUM score indicate a network-reachable flaw that an authenticated low-privileged user can trigger, but with an attack requirement (AT:P): a higher-privileged victim must actually view the activity log or element history for the payload to fire. The vulnerability is NOT in CISA KEV (no confirmed active exploitation) and no EPSS score was provided in the input, so widespread opportunistic exploitation cannot be quantified. The vuln.today decision label is 'this_month' - meaningful but below act_now/emergency urgency. A detailed, author-verified proof-of-concept (payload plus end-to-end headless-Chrome reproduction showing live DOM injection) is published in the GHSA advisory itself, so exploitability is demonstrated even though no standalone weaponized exploit tool is distributed. The most important mitigating signal, stated by both the advisory and the vendor release notes, is the default Content-Security-Policy (script-src 'self' 'wasm-unsafe-eval', no unsafe-inline): under a default deployment inline JavaScript does NOT execute, so real-world impact is downgraded from script execution to HTML/CSS injection (content spoofing, UI-redress, phishing in a trusted admin page) plus img-src beaconing. Signals are consistent here rather than conflicting; the main caveat is that deployments which relax the default CSP, or render this content in a non-CSP context, escalate to full script execution in an admin session. |
| Exploit ScenarioDerived | A low-privileged content editor creates a named part sub-element (e.g. a Part Parameter) whose name is an HTML/script payload, then deletes it, which writes a CollectionElementDeleted log entry carrying the unescaped name. When an administrator or auditor with system.show_logs opens /log (or any user opens the element's history tab), the payload is inserted as raw HTML and parsed into live DOM nodes in the victim's privileged session. The GHSA advisory includes an author-verified end-to-end PoC demonstrating the injection; on a default deployment the shipped CSP blocks the inline JavaScript, limiting the effect to HTML/CSS injection and image beaconing rather than arbitrary script execution. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 23, 2026
Stored HTML injection in Part-DB through 2.12.0 lets an authenticated user with edit rights on an entity store a crafted name on a named collection sub-element (Part Parameter, Attachment, PartLot, Orderdetail and similar) and have that markup emitted unescaped when a higher-privileged victim opens the activity log at /log (requires system.show_logs, typically an admin or auditor) or the affected element's history table; the root cause is a single missed htmlspecialchars() in the CollectionElementDeleted branch of LogEntryExtraFormatter. The vendor advisory documents a proof-of-concept in which the stored payload parses into live img-onerror and script nodes in the victim's page, but the shipped Content-Security-Policy (script-src 'self' 'wasm-unsafe-eval', no unsafe-inline, plus X-Content-Type-Options: nosniff) blocks inline JavaScript execution, so on a default deployment the realistic impact is HTML and inline-CSS injection, content spoofing, UI redressing and img-src beaconing rather than script execution; full script execution requires a relaxed or non-default CSP or another rendering context. The issue is fixed in 2.12.1, and the overall read is a genuine but moderate-priority defect rather than a drop-everything emergency.
RemediationAI
Upgrade to Part-DB 2.12.1, which applies htmlspecialchars() to both getOldName() (falling back to the deleted element ID) and getCollectionName() inside the CollectionElementDeleted branch of LogEntryExtraFormatter, matching the escaping already performed by every sibling branch; the fix ships in the tagged release at https://github.com/Part-DB/Part-DB-server/releases/tag/v2.12.1, with details in advisory GHSA-gp89-jfq9-x8r9 (https://github.com/Part-DB/Part-DB-server/security/advisories/GHSA-gp89-jfq9-x8r9). Because 2.12.1 is described by the maintainers as containing critical security fixes, the same update also addresses a separate critical issue allowing users with editing rights to execute arbitrary PHP code on Docker installations via uploaded phar files, and it warns that APP_SECRET must be changed to prevent forgery of REMEMBERME tokens - generate a new 32-character value with openssl rand -hex 32 and place it in .env.local or the environment section of docker-compose.yaml. For deployments that cannot update immediately, the only documented mitigating factor is the default Content-Security-Policy (script-src 'self' 'wasm-unsafe-eval', no unsafe-inline, with nosniff), so keeping that policy intact and not relaxing it is what prevents the injected inline script and onerror handlers from executing; the trade-off is that this does not stop the underlying HTML and inline-CSS injection or wildcard img-src beacon requests, and any deployment that loosens the CSP, or renders the log content in a context where the markup executes, reverts to full script execution. No separate code-level patch or configuration toggle for the vulnerable formatter branch is identified in the available sources.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Part-DB is a PHP/Symfony inventory application for electronic components; its activity log is rendered client-side through a DataTables bundle whose column classes return HTML strings. LogEntryExtraFormatter::getInternalFormat() builds the Extra column content, and every sibling branch passes user-controlled strings through htmlspecialchars() - including the ElementDeletedLogEntry branch, which escapes the very same getOldName() value - except the CollectionElementDeleted branch, which interpolates getOldName() and getCollectionName() straight into a sprintf() template (lines 168-175 in v2.12.0, commit 4b119490). The resulting string is passed through LogEntryExtraColumn::render() as raw HTML into the DataTables cell, because the column does not escape its output and relies on each formatter branch to sanitize. The tainted value originates in the CollectionElementDeleted entity constructor, which stores the deleted sub-element's name into extra['o'] whenever the element implements NamedElementInterface; such names are free-form strings set by any user with edit rights, so a low-privileged editor can persist a payload and trigger the log write simply by deleting the sub-element. This is CWE-79 (improper neutralization of input during web page generation), and the assessed severity is CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N - network-reachable, low privileges required, victim interaction required, scope changed. The mitigating control is the application's default CSP: style-src allows unsafe-inline and img-src is wildcarded, so CSS injection and cross-origin image requests still succeed and can leak the fact and timing of an administrator viewing the log, while script-src without unsafe-inline prevents the injected inline JavaScript from running. The trigger path is fully described by the advisory; no memory-safety or concurrency behavior is involved.
Know when Part Db 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
CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
PR:L because attacker needs edit rights; UI:R because a privileged victim must view the log/history; S:C as the payload runs in the admin's trust context; impacts Low because the default CSP blocks JS, leaving HTML/CSS injection and beaconing.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Part-DB is an open source inventory management system for electronic components. Prior to version 2.12.1, LogEntryExtraFormatter builds the HTML shown in the "Extra" column of the activity-log table (/log) and in element history tables. Every branch of LogEntryExtraFormatter::getInternalFormat() runs user-controlled strings through htmlspecialchars() before placing them into the HTML it returns - except the CollectionElementDeleted branch, which interpolates getOldName() (and getCollectionName()) into a sprintf() template with no escaping. The returned string is emitted by LogEntryExtraColumn::render() and inserted as raw HTML into the DataTables cell (the bundle does not escape column output; sibling columns call htmlspecialchars() themselves). CollectionElementDeleted.getOldName() is the name of a deleted collection sub-element - a part Parameter, Attachment, PartLot, Orderdetail, etc. - all freely set by any user with edit rights on the owning element. A low-privileged content editor can therefore store an HTML/script payload as the name of such a sub-element, delete it (which writes the log entry), and have that markup parsed as live DOM in the browser of a higher-privileged victim (an administrator/auditor with system.show_logs, or any user viewing that element's history). This is a stored cross-site-scripting / HTML-injection defect caused by a single missed sanitizer in one sibling branch. CSP policies block inline javascript execution under normal conditions. This issue has been patched in version 2.12.1.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
OS Command Injection in GitHub repository part-db/part-db prior to 0.5.11. Rated critical severity (CVSS 9.8), this vuln
Authenticated file upload in Part-DB Server 2.12.0 and earlier lets any member of the default users group obtain remote
Password-reset link poisoning in Part-DB Server (through 2.13.2) lets an unauthenticated remote attacker who can reach t
Part-DB is an open source inventory management system for your electronic components. Rated medium severity (CVSS 6.1),
Stored cross-user HTML injection in Part-DB's BOM validation results allows a user who can create or edit a Part name to
Stored cross-site scripting in Part-DB Server 2.12.2 and earlier allows an authenticated user with attachment-upload per
Authenticated users with attachment create/edit permissions can bypass the configured MAX_ATTACHMENT_FILE_SIZE limit in
Authenticated users holding the API access permission can bypass the configured maximum attachment file size in Part-DB
Spreadsheet formula injection in Part-DB through 2.13.1 lets an authenticated user who holds the '@parts.import' permiss
Part-DB is an open source inventory management system for electronic components. Rated medium severity (CVSS 5.7), this
EUVD-2026-108572
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB