2025-10-23 SSP Wallet v1.27.0 wylądował z najgłębszą zmianą bezpieczeństwa runtime'u w tym roku: LavaMoat, framework kompartmentalizacji JavaScript, prekursorski projekt MetaMaska, jest teraz zintegrowany w SSP. Każda zależność firm trzecich, którą portfel ładuje, jest zamknięta we własnym sandboxie, więc skompromitowany pakiet — ryzyko łańcucha dostaw npm, z którym mierzy się każdy nowoczesny portfel — nie może już czytać ani zmieniać tego, co robią inne części portfela. Release zaostrza także Content Security Policy, ukrywa stronę testów bezpieczeństwa za gestem easter-egg i przynosi garść poprawek wizualnych.
Sandboxing w runtime przybywa do SSP
LavaMoat w 30 sekund: runtime, który bierze drzewo zależności aplikacji JavaScript, izoluje każdy pakiet w jego własnym kompartmencie, i pozwala każdemu kompartmentowi dotykać tylko tych globali i API, które plik polityki mu wyraźnie przyznał. Domyślnie zależność firmy trzeciej nie może czytać localStorage, nie może wywołać fetch, nie może sięgnąć do keyringu, nie może monkey-patchować Object.prototype. Jeśli spróbuje, runtime ją powstrzymuje.
To inna postawa bezpieczeństwa niż ta, którą ma większość aplikacji webowych, gdzie każdy zaimportowany pakiet działa z tym samym autorytetem co sama aplikacja. Wewnątrz SSP kod obsługujący klucze prywatne, integracja swap rozmawiająca z API giełd i pomocnicze komponenty UI firm trzecich dzieliły jeden globalny scope. Od v1.27.0 już nie.
Dlaczego kompartmentalizacja ma znaczenie
Zagrożenie, które kompartmentalizacja ma neutralizować, to atak na łańcuch dostaw npm. Wzorzec był wielokrotnie widziany w naturze: atakujący przejmuje kontrolę nad popularnym pakietem, publikuje złośliwą wersję, i jedzie na fali zależności tranzytywnych do każdej aplikacji, która go importuje. Dla portfela skutek złośliwego pakietu działającego z pełnym autorytetem aplikacji jest katastrofalny — może czytać materiał seed w pamięci, eksfiltrować klucze prywatne, lub przepisywać miejsca docelowe transakcji, zanim użytkownik podpisze.
LavaMoat nie zapobiega temu, że atak dociera do aplikacji. Usuwa skutek. Skompromitowana zależność, nawet zakopana pięć poziomów głęboko w drzewie, działa wewnątrz kompartmentu, który nie ma dostępu do powierzchni podpisywania, nie ma dostępu sieciowego poza tym, co dopuszcza polityka, ani sposobu na czytanie stanu innego kompartmentu. Skompromitowany pakiet ≠ skompromitowany portfel — równoważność ta utrzymuje się po raz pierwszy w v1.27.0.
To uzupełnia, a nie zastępuje zabezpieczenia, które trafiły wcześniej w tym roku. Kod źródłowy SSP został już zweryfikowany przez pełny audyt Halborna, a binarka, którą instalujesz, była już udowadnialna względem tego źródła dzięki deterministycznym buildom i podpisom GPG. LavaMoat zamyka lukę runtime'u: nawet jeśli zależność stanie się złośliwa po podpisaniu builda, nie może eskalować do dostępu na poziomie portfela.
Silniejsza Content Security Policy
Obok sandboxingu runtime, v1.27.0 zaostrza także Content Security Policy na warstwie przeglądarki. CSP to budżet, który portfel deklaruje sam dla siebie — z jakich originów może ładować skrypty, z jakimi originami może rozmawiać, jakie zachowania inline są dozwolone. Surowsza CSP zmniejsza przestrzeń, w której atakujący może działać, jeszcze zanim LavaMoat wymusi swoją politykę wewnątrz strony.
Efektem łącznym są dwie warstwy ograniczenia: przeglądarka odmawia ładowania zasobów spoza zadeklarowanej polityki, a każdy JavaScript, który już działa, jest następnie kompartmentalizowany przez LavaMoat. Każda warstwa pokrywa inny tryb awarii, co jest właśnie sensem obrony w głąb.
Ukryta strona testów bezpieczeństwa
Dla weryfikacji wewnętrznej — i jest to jedyna funkcja w release, która przychodzi z celowym easter eggiem — v1.27.0 zawiera stronę testów bezpieczeństwa, która nie jest wyeksponowana w normalnej nawigacji. Kilkakrotne szybkie kliknięcie numeru wersji ją odsłania. Strona uruchamia baterię testów względem polityki LavaMoata i reguł CSP, żeby recenzenci i red-teamerzy mogli potwierdzić, że zabezpieczenia są aktywne w buildzie, który inspekcjonują, bez instrumentowania portfela samodzielnie. Nie jest przeznaczona dla codziennych użytkowników i nie ma za nią niczego eksploatowalnego; to po prostu wygodniejszy sposób na weryfikację tego, co v1.27.0 obiecuje.
Obrona w głąb: audytowane + powtarzalne + w sandboxie
Ciekawą częścią v1.27.0 nie jest LavaMoat w izolacji; to sposób, w jaki te trzy elementy się komponują. Audytowany kod źródłowy (Halborn), powtarzalna binarka, którą każdy może zweryfikować względem tego źródła (deterministyczne buildy), oraz runtime, który ogranicza każdą skompromitowaną zależność. Razem zmieniają pytanie z „czy ufam całemu drzewu zależności SSP?" na „czy ufam audytowanemu rdzeniu?" — znacznie mniejsza i lepiej odpowiedzialna powierzchnia zaufania.
Wykończenie UI ląduje na wierzchu: logo giełd swapu renderują się teraz poprawnie, a paleta marki została wyrównana w całym interfejsie. Kompartmentalizacja jest tym, co zmienia, jak portfel przeżywa.