Podatność w systemie SiYuan (przed wersją 3.7.0) pozwala na wstrzyknięcie dowolnego kodu JavaScript przez złośliwie spreparowany snippet CSS. Na komputerach z aplikacją desktopową opartą na Electron atak eskaluje do pełnego RCE na hoście, ponieważ renderer działa z włączoną opcją nodeIntegration.
▸ Pokaż oryginał (EN)
SiYuan is an open-source personal knowledge management system. Prior to 3.7.0, CSS snippet body containing </style> breaks out of its surrounding <style> tag when renderSnippet() interpolates it via insertAdjacentHTML. A payload like runs arbitrary JavaScript in the renderer. On Electron desktop builds the renderer runs with nodeIntegration:true, so require('child_process') is reachable from the injected handler and the XSS chains to host RCE. Snippets sync via the workspace repository, so an attacker with write access to any synced workspace plants the payload once and it fires on every device that pulls. The bug also bypasses the user's enabledCSS / enabledJS separation. A user who turned enabledJS off was making a deliberate call not to run untrusted JavaScript; the CSS path runs it anyway. This vulnerability is fixed in 3.7.0.
Funkcja renderSnippet() interpoluje treść snippetu CSS bezpośrednio do dokumentu HTML metodą insertAdjacentHTML, bez odpowiedniej sanityzacji. Umieszczenie sekwencji </style> w treści snippetu powoduje przedwczesne zamknięcie tagu <style>, co pozwala na wstrzyknięcie dowolnego kodu HTML i JavaScript. W buildach desktopowych Electron renderer posiada dostęp do Node.js API (nodeIntegration:true), przez co wstrzyknięty kod może wywołać require('child_process') i wykonać polecenia systemowe. Dodatkowo atak omija ustawienie użytkownika enabledJS — JavaScript jest uruchamiany mimo świadomego wyłączenia tej opcji przez użytkownika.
Atakujący z dostępem do zapisu w synchronizowanym obszarze roboczym (workspace) może osadzić payload raz, a następnie zostanie on automatycznie wykonany na każdym urządzeniu synchronizującym ten workspace — prowadząc do pełnego przejęcia kontroli nad systemem operacyjnym hosta (RCE), w tym do odczytu i modyfikacji danych oraz uruchamiania dowolnych procesów.
Należy niezwłocznie zaktualizować SiYuan do wersji 3.7.0 lub nowszej, w której błąd został naprawiony. Do czasu aktualizacji należy unikać synchronizacji workspace z niezaufanymi stronami oraz nie importować zewnętrznych snippetów CSS z nieweryfikowanych źródeł.
SiYuan w wersjach przed 3.7.0, w szczególności buildy desktopowe oparte na Electron (Windows, macOS, Linux); podatność dotyczy każdego użytkownika synchronizującego workspace z niezaufanym uczestnikiem
Podatność wymaga od atakującego posiadania dostępu do zapisu w synchronizowanym workspace (PR:L), jednak efekt ataku jest znacznie szerszy — payload rozprzestrzenia się automatycznie na wszystkie zsynchronizowane urządzenia. Podatność obejmuje dwa niezależne problemy: XSS (CWE-79) oraz niebezpieczną konfigurację domyślną Electron z włączonym nodeIntegration (CWE-1188).
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H