npm 12 blokuje domyślne wykonywanie skryptów z zależności. Co zmienia się dla programistów?
GitHub ogłasza, że od lipca npm 12 domyślnie blokuje wykonywanie skryptów z zależności. To odpowiedź na serię ataków na łańcuch dostaw. Sprawdź, jak przygotować projekt na zmianę.
Dlaczego GitHub zmienia domyślne zachowanie npm?
GitHub wyjaśnia w swoim komunikacie, że w ostatnich miesiącach doszło do wielu poważnych incydentów związanych z atakami na łańcuch dostaw w ekosystemie npm. Głównym problemem było domyślne, automatyczne wykonywanie skryptów z zależności podczas uruchamiania komendy npm install. Atakujący, w tym grupy takie jak TeamPCP oraz samoreplikujący się robak Shai-Hulud, wykorzystywali ten mechanizm do rozprzestrzeniania złośliwego kodu wśród tysięcy programistów.
„npm install nie będzie już wykonywać skryptów preinstall, install ani postinstall z zależności, chyba że zostaną one jawnie dozwolone w twoim projekcie” – czytamy w oficjalnym oświadczeniu platformy. Zmiana obejmie również natywne kompilacje node-gyp, w tym pakiety zawierające plik binding.gyp bez jawnego skryptu instalacyjnego. To istotne, ponieważ ataki Shai-Hulud Miasma opierały się właśnie na spreparowanym pliku binding.gyp.
Jak sprawdzić, które pakiety będą wymagały zgody?
GitHub udostępnił narzędzie ułatwiające migrację do nowego modelu bezpieczeństwa. Deweloperzy mogą uruchomić komendę npm approve-scripts –allow-scripts-pending, która pozwala przejrzeć wszystkie pakiety posiadające skrypty, zatwierdzić te zaufane i zablokować pozostałe. Wynik działania zapisywany jest w pliku package.json jako lista dozwolonych pakietów.
Po zatwierdzeniu listy i zapisaniu zmian w repozytorium, programiści korzystający z npm w wersji 11.16.0 lub nowszej będą otrzymywać ostrzeżenia, jeśli procedura instalacji będzie próbowała wykonać nieautoryzowane skrypty. „Zaktualizuj do npm 11.16.0 lub nowszej, uruchom standardową instalację i przejrzyj ostrzeżenia” – zaleca GitHub w swoim komunikacie.
Kolejne zmiany: blokada zależności z Git i zdalnych URL-i
Nowa wersja npm przynosi także inne istotne ograniczenia. Zależności pochodzące bezpośrednio z repozytoriów Git (zarówno bezpośrednie, jak i przechodnie) nie będą już rozwiązywane podczas npm install, chyba że zostaną jawnie dozwolone. GitHub tłumaczy: „zamyka to ścieżkę wykonania kodu, w której plik .npmrc zależności Git mógł nadpisać plik wykonywalny Git, nawet przy użyciu flagi –ignore-scripts”.
Podobnie traktowane będą zależności ze zdalnych URL-i, w tym archiwa tarball pobierane przez HTTPS. Deweloperzy będą mogli je zezwolić za pomocą flagi –allow-remote, dostępnej od wersji 11.15.0. Te zmiany znacząco utrudnią atakującym wykorzystywanie zewnętrznych, niekontrolowanych źródeł kodu do przenikania do projektów.
Co to oznacza dla polskich zespołów?
Dla firm i programistów w Polsce zmiana domyślnego zachowania npm to przede wszystkim sygnał do przeglądu procesów CI/CD oraz polityk bezpieczeństwa dotyczących zależności. Zespoły powinny jak najszybciej zaktualizować npm do wersji 11.16.0, przetestować swoje projekty pod kątem ostrzeżeń o skryptach i przygotować listę dozwolonych pakietów.
Warto przeanalizować, które zewnętrzne biblioteki są krytyczne dla działania aplikacji i czy można zastąpić je bezpieczniejszymi odpowiednikami. Nowe zasady wejdą w życie wraz z wydaniem npm 12 w lipcu, ale przygotowania warto rozpocząć już teraz. Im wcześniej zespół dostosuje swoje repozytoria, tym mniejsze ryzyko, że aktualizacja zablokuje proces budowania w najmniej oczekiwanym momencie.
GitHub zapowiada, że zmiana ma charakter stały i będzie obowiązywać we wszystkich przyszłych wersjach npm. To krok w stronę bezpieczniejszego ekosystemu, ale wymaga aktywnego udziału społeczności. Więcej informacji na temat migracji można znaleźć w oficjalnym komunikacie na stronie GitHub.


