Skip to main content

Part-DB CVE-2026-54615

| EUVDEUVD-2026-108572 MEDIUM
Cross-site Scripting (XSS) (CWE-79)
2026-10-23 GitHub_M
6.0
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Authenticate as low-privilege content editor
  2. Delivery
    Store script payload as sub-element name
  3. Exploit
    Delete sub-element to write log entry
  4. Execution
    Higher-privileged admin views activity log (/log)
  5. Impact
    Payload 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.3% exploitation probability (EPSS)

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

Alert me

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

Part-DB-server < 2.12.1

Affected Packages

euvd part_db_server fix: 2.12.1

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

Vendor (GitHub_M) PRIMARY 6.0 MEDIUM
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
vuln.today AI 5.4 MEDIUM

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.

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

1
Patch available
Oct 23, 2026 - 05:01 EUVD

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

EPSS Score
0.3%
Top 79% exploitable
Prevalence
Low
niche open-source electronics-inventory tool, limited enterprise footprint
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
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· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

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

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2022-0848 CRITICAL POC
9.8 Mar 04

OS Command Injection in GitHub repository part-db/part-db prior to 0.5.11. Rated critical severity (CVSS 9.8), this vuln

CVE-2026-54630 CRITICAL
9.6 Oct 23

Authenticated file upload in Part-DB Server 2.12.0 and earlier lets any member of the default users group obtain remote

CVE-2026-86055 HIGH
8.7 Oct 23

Password-reset link poisoning in Part-DB Server (through 2.13.2) lets an unauthenticated remote attacker who can reach t

CVE-2023-26042 MEDIUM
6.1 Feb 27

Part-DB is an open source inventory management system for your electronic components. Rated medium severity (CVSS 6.1),

CVE-2026-55600 MEDIUM
5.7 Oct 23

Stored cross-user HTML injection in Part-DB's BOM validation results allows a user who can create or edit a Part name to

CVE-2026-59188 MEDIUM
5.4 Oct 23

Stored cross-site scripting in Part-DB Server 2.12.2 and earlier allows an authenticated user with attachment-upload per

CVE-2026-86018 MEDIUM
5.3 Oct 23

Authenticated users with attachment create/edit permissions can bypass the configured MAX_ATTACHMENT_FILE_SIZE limit in

CVE-2026-86019 MEDIUM
5.3 Oct 23

Authenticated users holding the API access permission can bypass the configured maximum attachment file size in Part-DB

CVE-2026-86020 MEDIUM
4.6 Oct 23

Spreadsheet formula injection in Part-DB through 2.13.1 lets an authenticated user who holds the '@parts.import' permiss

CVE-2025-55194 MEDIUM POC
5.7 Aug 13

Part-DB is an open source inventory management system for electronic components. Rated medium severity (CVSS 5.7), this

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