Ponad milion pobrań tygodniowo ma na dzień dzisiejszy opublikowana 8 lat temu biblioteka, która jest… pusta. Jak to możliwe?! Rozwiązanie zagadki tkwi w jej nazwie: fs
. Brzmi znajomo? Oczywiście! To jedna z core’owych bibliotek Node.js. Problem w tym, że prawilny fs
jest wbudowany w core i nie ma potrzeby go instalować z npm. Statystyki pobrań, jak i sam koncept złośliwego kodu wstrzykiwanego w ten sposób są bardzo niepokojące.
Tak samo pomyślał core team Node.js.
W związku z zagrożeniem takimi właśnie pomyłkami wprowadził on notację dotyczącą bibliotek standardowych. Od wersji 18 możemy spotkać się z zapisem node:fs
, który wskazuje bezpośrednio na bibliotekę z wachlarza tych core’owych i pomija instalowane ręcznie rozwiązania.
Wspaniale! Czyli jesteśmy całkiem bezpieczni? Nie do końca.
Wciąż wisi nad nami kilka niebezpieczeństw, o których warto pamiętać. Przede wszystkim zasada “prefix-only” dotyczy tylko nowych paczek, takich jak node:test
. Starsze rozwiązania (fs
, http
, etc.) musiały zachować kompatybilność wsteczną i dostępne są pod dwiema nazwami: fs
oraz node:fs
. Drugi zapis daje pewność załadowania biblioteki z core, a nie z userlandu, ale wciąż o pomyłkę nie jest trudno. Szczególnie biorąc pod uwagę, że zamieszanie z nazewnictwem wydaje się być spore. Tylko czekać na wysyp ciekawych wariacji bibliotek z literówkami (vide: typosquatting).
Oczywiście, żeby atak się powiódł, musielibyśmy je jeszcze zainstalować. Odruch pt. “nie znalazł biblioteki, więc szybko ją doinstaluję z IDE (zamiast poprawić literówkę)” może być wyjątkowo zwodniczy w tym wypadku 😉.
Podsumowując:
node:lib
.require('node:module').builtinModules
.Może nam to oszczędzić sporo nerwów 😉.