Z każdym dniem ilość pakietów Javascript rośnie. Jest to wynik aktywności społeczności, która z jednej strony domaga się nowych rozwiązań, z drugiej - generuje je w ramach samorozwoju lub realizacji. Tak duży wzrost otwiera nowe drzwi i możliwości, ale niesie ze sobą również zagrożenia, których każdy developer musi być świadomy.
Pod koniec listopada 2018 r. społeczność GitHub poinformowała o poważnej luce w zabezpieczeniach aplikacji event-stream - który pomaga w pracy z węzeł wydarzenia bardziej efektywnie. Była ona dość popularna, ponieważ liczba pobrań w tym konkretnym okresie sięgała ponad 2,2 mln tygodniowo (w porównaniu do React z 3,7 mln). Event-stream, jak i jego zależności, były zależne od innej biblioteki - flatmap-steam, który został zaktualizowany złośliwym oprogramowaniem typu crypto-pocket. Umożliwiało ono kradzież kluczy prywatnych i innych danych z kont użytkowników na komputerach, do których pakiet był dołączony.
Ostatecznie flatmap-stream został usunięty z NPM, co spowodowało problemy czasowe z wieloma innymi bibliotekami. W maju tego samego roku społeczność znalazła backdoora w bibliotece getcookie który był również częścią wielu innych zależności. Takie przykłady można mnożyć, co pokazuje, że ważne jest, aby zwracać uwagę na zależności zainstalowane w pakiecie projektnie tylko od Javascript ale także w kontekście ogólnym.
Poleganie na oficjalnych rozwiązaniach i dużych społecznościach
W miarę możliwości ważne jest, aby polegać na oficjalnych rozwiązaniach w swoim projekcie. Są one nie tylko mniej podatne na ataki ze względu na lepszy proces rozwoju. Duża społeczność, która zwykle wiąże się z lepszą marką, pomaga znacznie szybciej identyfikować problemy i, co ważniejsze, znajdować dobre rozwiązania.
Wykorzystanie trendów NPM
Rys. 1 Trend Webpack NPM.
Rys. 2. Trend NPM w strumieniu zdarzeń.
Czasami znajomość aktualnego stanu pakietu może nie odzwierciedlać jego przeszłości. Szybkie spojrzenie na wykres trendów npm może pokazać rzeczywisty trend pakietu. Pokaże on nie tylko duże szczyty, w których można znaleźć jakąś podatność, ale także ogólny stan danego pakietu (UWAGA: duże szczyty w trendach google w okolicach 24-30 grudnia reprezentują sezon świąteczny, co niekoniecznie musi oznaczać problem). Jako przykład, spójrz na rysunek 1 - przedstawiający trend pobierania Webpacka na tydzień. Widać stabilny wzrost bez żadnych punktów zwrotnych, co może sugerować, że Webpack jest stabilnym i bezpiecznym pakietem do użycia. Z drugiej strony, na rysunku 2 widać duży spadek w listopadzie, co jest wyraźnym sygnałem, że coś złego mogło się wydarzyć w tym okresie (co już wiemy, że jest prawdą).
Audyt zależności
Najlepszym i najbardziej niezawodnym sposobem na sprawdzenie stanu zależności jest wykonanie funkcji audyt. Polecenie to jest teraz dostępne natywnie zarówno dla yarn, jak i npm, choć wymaga ich najnowszych wersji. Wysyła listę aktualnych zależności do odpowiedniego punktu końcowego i zwraca informacje zawierające ich aktualne luki i inne szczegóły użytkowania, w tym odniesienie do dokumentacji. (rysunek 3).
Rys. 3. Przykład wyniku polecenia npm audit. Źródło: https://docs.npmjs.com
Zarządzanie zależnościami w Javascript nie jest łatwym zadaniem. Liczba rozwiązań rośnie z każdym dniem, dlatego pamiętaj, aby wybierać zależności mądrze i ostrożnie. Nieustannie kontroluj swój bieżący projekt i regularnie aktualizuj swoje pakiety.
Aby dowiedzieć się więcej o zależnościach javascript i jak rozwiązać niektóre z ich problemów, Sprawdź ten artykuł.
Źródło:
- https://github.com/dominictarr/event-stream/issues/116
- https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident
- https://blog.npmjs.org/post/173526807575/reported-malicious-module-getcookies
- https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities
- https://docs.npmjs.com/cli/audit
- https://yarnpkg.com/lang/en/docs/cli/audit/