Złośliwy kod w module Lottie-Player

31 października, 2024

Znany moduł Lottie-Player przez kilka godzin zawierał nieautoryzowany kod wyświetlający na witrynach korzystających z tego rozszerzenia popup umożliwiający połączenie portfela kryptowalutowego docelowego użytkownika. Twórcy Lottie-Player, firma Design Barn Inc, o problemie dowiedzieli się poprzez issue założone przez użytkownika MrAhmedSayedAli w serwisie GitHub.

Popup wyświetlany przez złośliwą wersję Lottie-Player.

Jak można zauważyć, czytając odpowiedzi w tym wątku, skala problemu była stosunkowo duża. Co więcej, złośliwy kod utrudniał korzystanie z tzw. narzędzi deweloperskich w przeglądarkach (np. DevTools). Zmiany skutecznie dodano aż do trzech wersji modułu, tj. 2.0.5, 2.0.6 i 2.0.7 (wszystkie opublikowano wczoraj w godzinach wieczornych). Podatne wersje zostały już usunięte z repozytorium npm. Można jednak zapoznać się z tą zawartością, ponieważ została „zarchiwizowana” przez pochodzącego z Polski programistę i udostępniona w tym miejscu. Aktualnie najnowszą wersją jest 2.0.8, która stanowi kopię wersji 2.0.4.

Atak rozpoczął się od uzyskania należącego do programisty Lottie-Player tokenu pozwalającego na dodawanie paczek do repozytorium npm. W opublikowanym wątku znajdziemy „Incident Response”, w którym czytamy, że firma wraz z pomocą zewnętrznego podmiotu prowadzi analizę ataku.

Sam Lottie-Player jest używany do wyświetlania na stronach animacji przygotowanych w formacie Lottie (opartym na JSON). Dostępny jest przykład prezentujący możliwości tego modułu: https://codesandbox.io/p/sandbox/y2nxyvomyj. To bardzo popularne rozwiązanie, co widać na wykresie liczby pobrań w okresie ostatniego roku.

Ilość tygodniowych pobrań Lottie-Player.

Popularne są również memy dotyczące node_modules, czyli katalogu zawierającego pobrane z repozytorium npm gotowe paczki umożliwiające łatwiejsze dodawanie funkcjonalności w aplikacjach. O ile praktyka korzystania ze sprawdzonych i znanych rozwiązań jest zdecydowanie pozytywna, bo pozwala na szybszy rozwój oprogramowania, to jednak w każdej sytuacji wymagana jest pewna rozwaga. Przykładem może być moduł is-odd sprawdzający, czy podana liczba jest nieparzysta — samodzielne przygotowanie takiej funkcji nie jest skomplikowane.

Mem o node_modules.

Można zapytać, dlaczego złośliwy kod pojawił się na tak wielu witrynach. Powodem było stosowanie najnowszej możliwej wersji paczki, oznaczonej latest. Podatne serwisy zawierały odwołanie do tej wersji, wyglądające w ten sposób:

				
					https://unpkg.com/@lottiefiles/lottie-player@latest/dist/lottie-player.js
				
			

Podczas ładowania strony z tym skryptem nastąpi przekierowanie do faktycznej najnowszej wersji. Pomijając kwestie bezpieczeństwa, należy zwrócić też uwagę na kompatybilność, ponieważ wprowadzone w module zmiany niekoniecznie będą poprawnie działały z naszą aplikacją. Z tego powodu zwykle lepiej definiować konkretną i wiarygodną wersję. Zdarza się też, że najnowsze wersje zawierają po prostu błędy uniemożliwiające normalną pracę.

Czy ten artykuł był pomocny?

Oceniono: 3 razy

Picture of Michał Giza

Michał Giza

Administrator systemów Linux i Windows Server. Konfiguruje serwery WWW, bazy danych i inne usługi sieciowe. Wykonuje i automatyzuje wdrożenia aplikacji internetowych.
Picture of Michał Giza

Michał Giza

Administrator systemów Linux i Windows Server. Konfiguruje serwery WWW, bazy danych i inne usługi sieciowe. Wykonuje i automatyzuje wdrożenia aplikacji internetowych.

PODZIEL SIĘ:

guest
0 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments

[ninja_tables id=”27481″]

\r\n <\/div>\r\n<\/div>\r\n","isUserRated":"0","version":"7.6.29","wc_post_id":"54356","isCookiesEnabled":"1","loadLastCommentId":"0","dataFilterCallbacks":[],"phraseFilters":[],"scrollSize":"32","is_email_field_required":"1","url":"https:\/\/avlab.pl\/wp-admin\/admin-ajax.php","customAjaxUrl":"https:\/\/avlab.pl\/wp-content\/plugins\/wpdiscuz\/utils\/ajax\/wpdiscuz-ajax.php","bubbleUpdateUrl":"https:\/\/avlab.pl\/wp-json\/wpdiscuz\/v1\/update","restNonce":"4c067205ba","is_rate_editable":"0","menu_icon":"https:\/\/avlab.pl\/wp-content\/plugins\/wpdiscuz\/assets\/img\/plugin-icon\/wpdiscuz-svg.svg","menu_icon_hover":"https:\/\/avlab.pl\/wp-content\/plugins\/wpdiscuz\/assets\/img\/plugin-icon\/wpdiscuz-svg_hover.svg"}; var wpdiscuzUCObj = {"msgConfirmDeleteComment":"Are you sure you want to delete this comment?","msgConfirmCancelSubscription":"Are you sure you want to cancel this subscription?","msgConfirmCancelFollow":"Are you sure you want to cancel this follow?","additionalTab":"0"}; -->