U Javascript-u postoji veliki broj potencijalnih napada, u seminaru je obrađena potencijalna prijetnja od “malicious lifecycle script” napada i vulnerabilnosti Dependency Confusion. Kako bih se obranili od navedenih napada potrebno je koristiti poznate pakete s provjerenim komentarima korisnika, dobro proučiti ovisnosti i koristiti “lockfile” te isključiti pokretanje skripti prilikom instalacije.
JavaScripta je jedan od najčešće korištenih i popularnih programskih jezika u svijetu, također se stalno mijenja i razvija. S popularnošću JavaScripta, dolazi povećani rizik od potencijalnih sigurnosnih prijetnji i ranjivosti. Postoje rizici povezani s upotrebom vanjskih paketa i knjižnica, jer one mogu sadržavati ranjivosti koje mogu biti iskorištene od strane napadača. U nastavku ćemo napisati kako dolazi do najčešćih napada kroz vanjske pakete te kako ih spriječiti.
“Malicious lifecycle script” napad se događa kada kontrolu nad paketom preuzme zlonamjerni akter koji je postavio maliciozni kod unutar postinstalacijske skripte (postinstall lifecycle script). Prijetnja se očituje u tome što je potencijalna maliciozna skripta poslala podatke za prijavu u npm registar na udaljenu adresu. Najveći problem je što nije lagano otkriti postojanje zlonamjerne skripte jer su često skrivene od korisnika. Postinstalacijske skripte se izvode u pozadini nakon instalacije kako bi osigurale spremnost korištenja paketa.
Primjer:
// package.json file "name: "example-package", "scripts": { "postinstall": "node malicious.js" }
Kada bi korisnik odlučio instalirati npm example-package imao bi izvršenu gornju postinstalacijsku skriptu u kojoj bi se moglo nalaziti bilo što što zlonamjerni korisnik želi učiniti korisniku. Isto ponašanje sa postinstalacijskom skriptom može se izvesti i s “preinstall” , “postinstall” , “preuninstall” i “postuninstall” skriptama.
Ne postoji jednostavan način obrane od opisanog napada jer “lifecycle hooks” imaju važnu ulogu u instaliranju paketa jer obavljaju čišćenje i pripremu paketa za korištenje te njihovo obustavljanje može stvoriti probleme kod pokretanja paketa. Preporučeni pristupi za sprječavanje problema:
npm install --ignore-scripts ili yarn add --ignore-scripts
“Malicious lifecycle script” napad nije greška npm-a jer lifecycle skripte imaju vrlo korisne značajke za upravljanje paketima. Problem je puno širi od samog npm-a jer postoji puno malih modula koji se dijele kako bi se Node.js aplikacije lakše koristile te dovodi tako i do većeg broja prijetnji. Važno je da zajednica korisnika npm-a, poduzme mjere opreza za sprječavanje napada. Jedan od prvih koraka bi trebao biti 2FA za sve npm račune koji sadrže pristup objavljivanja tj pisanja paketa. Na takav bi način umanjili mogući broj zlonamjernih korisnika. Npm poduzima mjere opreza, koje se očituju u smanjenom “typosquatting” te nudi besplatne sigurnosne alate od kojih je najpoznatiji: npm audit.
Vulnerabilnost Dependency Confusion je vrsta sigurnosnog propusta koja se pojavljuje kada se koriste vanjske biblioteke (eng. dependency) u softverskom projektu. To se događa kada se unutar projekta koristi isto ime vanjske biblioteke kao i unutarnje, pa se interna verzija biblioteke prevodi kao vanjska, što može dovesti do sigurnosnih propusta. Prije nekoliko godina je demonstrirano kako Apple, Microsoft, PayPal, Shopify, te mnogi drugi nemaju zaštitu protiv ovog napada, odnosno radi nepažnje kod kreiranja internih paketa došlo je do sigurnosnih propusta.
U istraživanju napadač je na https://npmjs.com objavio pakete istih imena kao interni PayPalovi paketi “paypal-auth” i pplogger, te na rubygems.org paket shopify-cloud. Kroz svega nekoliko sati njegovi paketi bili su instalirali što na automatiziranim deployment servisima (CI/CD) što na računalima developera tih firmi.
Opisani problem imaju praktički svi manageri paketa, pip (python), npm (js), gem (ruby) i ostali. Zaštita je u većini slučajeva jednostavna te se može izvesti na jedan od sljedećih načina:
GitHub pruža mogućnost dojave potencijalne ranjivosti pomoću GitHub alert bot-a. Ranjivost nam dojavljuje da jedan od ovisnosti u našem package.json fileu ima sigurnosne implikacije koje napadač može iskoristiti i može uzrokovati probleme našem računalu, projektu, korisnicima projekta ili tvrtki za koju radimo.
Što možemo učiniti kako bi pronašli potencijalne ranjivosti u projektu?
npm audit
“npm audit” je naredba u npm-u koja provjerava postoje li ranjivosti u instaliranim paketima u projektu. Skenira zavisnosti projekta i provjerava postoje li poznate ranjivosti povezane s njima. Ako se pronađu, pružit će se informacije o ranjivosti, uključujući opis problema, razinu ozbiljnosti i preporuku za rješavanje problema.
JavaScript ekosustav se stalno mijenja, stoga je važno da programeri budu informirani o najnovijim sigurnosnim prijetnjama i ranjivostima te da poduzimaju odgovarajuće mjere za zaštitu svojih projekata i korisnika.
[1] Kyle Martin: EUnderstanding and protecting against malicious npm package lifecycle scripts
[2] Nikolai Tschacher: Typosquatting programming language package managers
[3] Vivek Nayyar: Fixing security vulnerabilities in npm dependencies
[4] Alex Birsan: Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies