CVE-2026-54615
ŚrednieCVSS 6.0Streszczenie
W Part-DB, systemie zarządzania inwentarzem komponentów elektronicznych, w wersjach przed 2.12.1 występuje podatność typu stored XSS. Klasa LogEntryExtraFormatter w gałęzi CollectionElementDeleted wstawia nazwę usuniętego pod-elementu (getOldName(), getCollectionName()) do HTML bez użycia htmlspecialchars(), co pozwala użytkownikowi z niskimi uprawnieniami zapisać złośliwy kod HTML/JS jako nazwę pod-elementu, a następnie wywołać jego wykonanie w przeglądarce administratora lub audytora przeglądającego dziennik aktywności lub historię elementu.
Ocena ryzyka
Użytkownik z uprawnieniami edycji treści może wykonać atak XSS w kontekście sesji uprzywilejowanego administratora lub audytora, co może prowadzić do przejęcia konta, kradzieży danych lub wykonania nieautoryzowanych działań w systemie. Polityki CSP blokują wykonywanie inline JavaScript w normalnych warunkach, co ogranicza, ale nie eliminuje ryzyka.
Rekomendacja
Zaktualizuj Part-DB do wersji 2.12.1 lub nowszej, która zawiera poprawkę. Do czasu aktualizacji rozważ ograniczenie uprawnień edycji treści oraz weryfikację polityk CSP.
Inne podatności w Part-DB
Zobacz wszystkie- CVE-2026-86055Wysokie
Part-DB przed wersją 2.13.3 buduje bezwzględny URL linku do resetowania hasła na podstawie nagłówka HTTP Host dostarczonego przez klienta, bez walidacji zaufanego hosta. Nieuwierzytelniony atakujący może wysłać żądanie resetu hasła dla znanego konta ze sfałszowanym nagłówkiem Host, powodując wysłanie linku z hostem kontrolowanym przez atakującego, ale z prawdziwym tokenem resetowania. Gdy ofiara otworzy link (lub zrobi to skaner poczty), token wycieka do atakującego, który może przejąć konto, w tym konto administratora.
- CVE-2026-86020Średnie
Part-DB przed wersją 2.13.2 zawiera podatność na wstrzyknięcie formuł arkusza kalkulacyjnego w procesie importu/eksportu części. Uwierzytelniony użytkownik z uprawnieniami do importu może zaimportować plik CSV zawierający wartości z prefiksem formuły, takie jak =1+1, do kontrolowanych pól części. Gdy część zostanie wyeksportowana jako arkusz XLSX, Part-DB zapisuje wartość za pomocą setCellValue() bez neutralizacji znaków formuły, co może spowodować wykonanie formuły przez oprogramowanie arkusza kalkulacyjnego innego użytkownika.
- CVE-2026-86019Średnie
Part-DB przed wersją 2.13.2 pozwala uwierzytelnionym użytkownikom API obejść skonfigurowany maksymalny rozmiar załącznika, przesyłając załączniki przez API z danymi pliku zakodowanymi w base64. Aplikacja egzekwuje limit rozmiaru dla zwykłych przesyłań przez przeglądarkę, ale ścieżka API base64 nie stosuje tej samej walidacji. W rezultacie użytkownik z dostępem do API i uprawnieniami do tworzenia załączników może przesłać pliki większe niż limit, potencjalnie wyczerpując miejsce na dysku i powodując odmowę usługi.
- CVE-2026-86018Średnie
Part-DB przed wersją 2.13.2 pozwala uwierzytelnionym użytkownikom obejść skonfigurowany maksymalny rozmiar załącznika podczas korzystania z funkcji „Download external file” po stronie serwera. Gdy pobieranie załączników po stronie serwera jest włączone, Part-DB pobiera zdalny plik i strumieniuje go bezpośrednio na dysk bez egzekwowania limitu MAX_ATTACHMENT_FILE_SIZE. W rezultacie użytkownik z uprawnieniami do tworzenia lub edycji załączników może spowodować przechowywanie plików większych niż limit, potencjalnie wyczerpując miejsce na dysku i powodując odmowę usługi.
- CVE-2026-59188Średnie
Part-DB przed wersją 2.12.3 sanityzuje pliki SVG wyłącznie na podstawie rozszerzenia nazwy pliku kontrolowanego przez użytkownika, a nie rzeczywistego typu zawartości. Uwierzytelniony atakujący może przesłać złośliwy plik SVG z ładunkiem JavaScript podając inne rozszerzenie (np. .jpg), całkowicie omijając sanityzację. Gdy dowolny użytkownik wyświetli załącznik inline, przeglądarka otrzyma Content-Type: image/svg+xml i wykona osadzony skrypt w kontekście Part-DB.
- CVE-2026-55600Średnie
W Part-DB przed wersją 2.12.2 komunikaty walidacji BOM są renderowane z użyciem filtra |raw w Twig, a zawierają placeholdery wypełniane nazwami części kontrolowanymi przez użytkownika. Użytkownik mogący edytować nazwę części może zapisać znaczniki HTML, które zostaną wyrenderowane na stronie wyników walidacji BOM innego użytkownika, co prowadzi do przechowywanego wstrzyknięcia HTML.
- CVE-2026-54631Średnie
W Part-DB przed wersją 2.12.1 plik .env w repozytorium zawiera stałą wartość APP_SECRET, której oficjalny obraz Docker jbtronics/part-db1 nie nadpisuje ani nie losuje przy starcie kontenera. Symfony używa APP_SECRET jako klucza HMAC do podpisywania ciasteczek remember-me, więc atakujący znający ten sekret może sfałszować ciasteczko remember-me dowolnego użytkownika i uzyskać w pełni uwierzytelnioną sesję bez poświadczeń.
- CVE-2026-54630Krytyczne
W Part-DB przed wersją 2.12.1 mechanizm blokowania niebezpiecznych rozszerzeń przy przesyłaniu załączników nie obejmuje rozszerzenia .phar. Plik .phar przesłany jako załącznik trafia do katalogu public/media/, który jest dokument root Apache, a konfiguracja Apache kieruje .phar do PHP-FPM, co pozwala na wykonanie dowolnego kodu PHP.
Oryginalny opis (angielski, źródło NVD)
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.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

