ApostropheCMS: Obejście walidacji pola koloru umożliwia przechowywany XSS przez kod HTML dołączony po prefiksie rgb()/hsl()
Podsumowanie
Pole koloru akceptuje dowolny ciąg znaków, który rozpoczyna się od prawidłowego koloru rgb() / hsl(), ponieważ TinyColor.isValid nie zakotwicza dopasowania na końcu ciągu. Uwierzytelniony użytkownik z uprawnieniami do edycji może zapisać dowolny kod HTML po prawidłowym prefiksie koloru. Gdy zapisana wartość jest renderowana, ładunek zostaje wykonany, co prowadzi do przechowywanego cross-site scripting (XSS).
Szczegóły
Walidacja pola koloru po stronie serwera opiera się na TinyColor:
const { TinyColor } = require('@ctrl/tinycolor');
if (!new TinyColor(value).isValid) throw self.apos.error('invalid');
Dopasowania rgb/hsl w TinyColor nie są zakotwiczone na końcu ciągu, w przeciwieństwie do dopasowań hex. Przetestowano z @ctrl/tinycolor:
| Input | isValid |
|---|---|
rgb(1,2,3)<img src=x onerror=alert(1)> |
true |
rgb(1,2,3)</textarea><script>alert(1)</script> |
true |
hsl(0,100%,50%);--x:1}</style><script>alert(1)</script> |
true |
#ff0000<img src=x onerror=alert(1)> |
false |
Wartość jest zapisywana w MongoDB w postaci niezmienionej (bez normalizacji do hex8).
Powiązanie z GHSA-97v6-998m-fp4g
GHSA-97v6 rozwiązało problem wstrzykiwania niestandardowych właściwości CSS uciekających z kontekstu <style>. Pierwotna przyczyna (walidacja akceptująca dodatkową treść po prawidłowym kolorze) nadal występuje w wersjach <= 4.32.2, więc punkt ujścia style-tag pozostaje podatny na wykorzystanie poprzez </style> lub podatny jest oddzielny punkt ujścia HTML. Naprawa walidacji (wymaganie, aby cały ciąg był kolorem, lub zapisywanie wyłącznie znormalizowanego wyniku TinyColor) wyeliminowałaby oba problemy.
Wpływ
Każdy użytkownik z uprawnieniami do edycji może umieścić trwały kod JavaScript, który wykonuje się w przeglądarkach odwiedzających oraz administratorów przeglądających stronę, umożliwiając przejęcie sesji i wykonywanie działań w imieniu administratora.
Sugerowana poprawka
Odrzucanie wartości, chyba że cały ciąg jest prawidłowym kolorem, np. normalizacja przy zapisie:
const c = new TinyColor(value);
if (!c.isValid) throw self.apos.error('invalid');
value = c.toHex8String(); // store only normalized output
Co trzeba zrobić
Zaktualizuj ApostropheCMS do wersji 4.34.0 lub nowszej.
Czego dotyczy
Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Paczka npm | apostrophe | < 4.34.0 | 4.34.0 |
Odnośniki
- https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-vmgj-9cwm-cf3h
- https://nvd.nist.gov/vuln/detail/CVE-2026-112951
- https://github.com/apostrophecms/apostrophe/commit/06e4b377f3c360f9e89c32dccd7e505ad5ddf498
- https://github.com/apostrophecms/apostrophe/commit/40b989b1a9dd23d30029b8ce7668634265cfe5ea
- https://github.com/apostrophecms/apostrophe
- https://github.com/apostrophecms/apostrophe/releases/tag/apostrophe@4.34.0
- Wektor CVSS
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N- Słabość (CWE)
CWE-79- Platforma
- npm
- Paczka
apostrophe- Ujawniono
- 21.10.2026
- Aktualizacja
- 21.10.2026 20:21
Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.
OSV / GitHub Advisory Database - GHSA-vmgj-9cwm-cf3h - CC BY 4.0
Historia podatności: apostrophe
Wszystkie opisane podatności tej paczki (Paczka npm), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.
- Wszystkich wpisów
- 33
- Pierwsza → ostatnia
- 09.2020 10.2026
- Bez poprawki
- 4
- Wykorzystywana w atakach
- 0
Rozkład istotności
- Krytyczna 2
- Wysoka 9
- Średnia 18
- Niska 4
Ujawnienia w latach
- 2020: 2
- 2021: 2
- 2022: 0
- 2023: 0
- 2024: 0
- 2025: 0
- 2026: 29
-
ApostropheCMS: Obejście walidacji pola koloru umożliwia przechowywany XSS przez kod HTML dołączony po prefiksie rgb()/hsl() ten wpis
Dowiedz się, które podatności dotyczą Twojej aplikacji
Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.