Moderne JavaScript-utviklere elsker NPM. GitHub og npm-registret er utviklerens førstevalgssted for å finne en bestemt pakke. Open-source-moduler legger til produktiviteten og effektiviteten ved å gi utviklere en rekke funksjoner som du kan bruke på nytt i prosjektet. Det er rimelig å si at hvis det ikke var for disse open source-pakkene, ville de fleste av rammene i dag ikke eksistere i deres nåværende form.
Et fullverdig bedriftsnivåprogram, for eksempel, kan stole på hundrevis hvis ikke tusenvis av pakker. De vanlige avhengighetene inkluderer direkte avhengigheter, utviklingsavhengigheter, bundlede avhengigheter, produksjonsavhengigheter og valgfrie avhengigheter. Det er bra fordi alle får det beste ut av open source-økosystemet.
Imidlertid er en av faktorene som overses, mengden av risiko involvert. Selv om disse tredjepartsmodulene er spesielt nyttige i sitt domene, innfører de også noen sikkerhetsrisiko i søknaden din.
OSS-avhengigheter er faktisk sårbare for utnyttelser og kompromisser. La oss ta en titt på noen få eksempler:
Et sårbarhet ble oppdaget nylig i en pakke kalt eslint-scope som er avhengighet av flere populære JavaScript-pakker som babel-eslint og webpack. Kontoen til pakkeholderen ble kompromittert, og hackerne la til noe ondsinnet kode i det. Heldigvis fant noen ut utnyttelsen snart nok at skadene var angivelig begrenset til noen få brukere.
Moment.js, som er en av de mest brukte biblioteker for å analysere og vise datoer i JavaScript, ble nylig funnet å ha et sikkerhetsproblem med en alvorlighetsgrad på 7,5. Utnyttelsen gjorde det sårbart for ReDoS-angrep. Patches ble raskt sluppet, og de klarte å løse problemet ganske raskt.
Men det er ikke alt. Mange nye utfordringer blir tatt opp hver uke. Noen av dem blir offentliggjort, men andre gjør overskrifter først etter en alvorlig brudd.
Så hvordan reduserer vi disse risikoene? I denne artikkelen vil jeg forklare noen av bransjestandardens beste praksis som du kan bruke til å sikre dine åpen kildekodeavhengigheter.
Logisk sett, da antallet avhengigheter øker, kan risikoen for å ende opp med en sårbar pakke også øke. Dette gjelder også for direkte og indirekte avhengigheter. Selv om det ikke er grunn til at du bør slutte å bruke open source-pakker, er det alltid en god ide å holde styr på dem.
Disse avhengighetene er lett å finne og kan være like enkle som å løpe npm ls
i rotkatalogen av søknaden din. Du kan bruke -prod
argument som viser alle produksjonsavhengigheter og -lang
argument for et sammendrag av hver pakkebeskrivelse.
Videre kan du bruke en tjeneste for å automatisere avhengerhåndteringsprosessen som tilbyr sanntidsovervåking og automatisk oppdateringstesting for dine avhengigheter. Noen av de kjente verktøyene er GreenKeeper, Libraries.io, etc. Disse verktøyene samler en liste over avhengighetene du bruker, og sporer relevant informasjon om dem.
Med tidenes forløp og endringer i koden din, er det sannsynlig at du vil slutte å bruke noen pakker helt og i stedet legge til nye. Utviklere har imidlertid en tendens til ikke å fjerne gamle pakker når de går.
Over tid kan prosjektet samle mange ubrukte avhengigheter. Selv om dette ikke er en direkte sikkerhetsrisiko, vil disse avhengighetene nesten sikkert legge til prosjektets angrepsoverflate og føre til unødvendig rot i koden. En angriper kan muligens finne et smutthull ved å laste inn en gammel, men installert pakke som har en høyere sårbarhetskvotient, og dermed øke den potensielle skade det kan føre til.
Hvordan ser du etter slike ubrukte avhengigheter? Du kan gjøre dette ved hjelp av depcheck-verktøyet. Depcheck skanner hele koden for krever
og importere
kommandoer. Det korrelerer deretter disse kommandoene med enten installerte pakker eller de som er nevnt i din package.json og gir deg en rapport. Kommandoen kan også endres ved hjelp av forskjellige kommandoflagger, og dermed blir det enklere å automatisere kontrollen av ubrukte avhengigheter.
Installer depcheck med:
npm installere -g depcheck
Nesten alle poengene som er diskutert ovenfor, er først og fremst opptatt av de potensielle problemene du måtte støte på. Men hva med de avhengighetene du bruker akkurat nå?
Basert på en nylig studie, omfatter nesten 15% av dagens pakker et kjent sårbarhet, enten i komponentene eller avhengighetene. Den gode nyheten er imidlertid at det er mange verktøy du kan bruke til å analysere koden din og finne sikkerhetsrisiko for åpen kildekode i prosjektet ditt.
Det mest praktiske verktøyet er npm npm revisjon
. Revisjon er et skript som ble utgitt med npm versjon 6. Node Security Platform opprinnelig utviklet npm revisjon, og npm registret senere kjøpt den. Hvis du er nysgjerrig på å vite hva npm-revisjon handler om, her er et sitat fra den offisielle bloggen:
En sikkerhetsrevisjon er en vurdering av pakkeavhengigheter for sikkerhetsproblemer. Sikkerhetsrevisjoner hjelper deg med å beskytte pakkens brukere ved å gjøre det mulig å finne og fikse kjente sårbarheter i avhengigheter. Npm-revisjonskommandoen gir en beskrivelse av avhengighetene som er konfigurert i pakken til standardregisteret ditt og ber om en rapport med kjente sårbarheter.
Rapporten som genereres består vanligvis av følgende detaljer: Det berørte pakkenavnet, sårbarhetsgraden og beskrivelsen, banen og annen informasjon, og, hvis tilgjengelig, kommandoer for å bruke patcher for å løse sårbarheter. Du kan til og med få revisjonsrapporten i JSON ved å kjøre npm revisjon --json
.
Bortsett fra det, tilbyr npm også hjelp til hvordan man skal handle ut fra rapporten. Du kan bruke npm revisjonsrett
å fikse problemer som allerede er funnet. Disse løsningene utføres vanligvis ved hjelp av guidede oppgraderinger eller via åpen kildekodepatcher.
Du er velkommen til å se dokumentasjon for npm for mer informasjon.
Konseptet med åpen kildekode sikkerhet er sterkt avhengig av antall øyne som ser på det aktuelle biblioteket. Pakker som er aktivt brukt, blir nærmere observert. Derfor er det en større sjanse for at utvikleren kan ha adressert alle kjente sikkerhetsproblemer i den aktuelle pakken.
La oss ta et eksempel. På GitHub er det mange JSON web token implementeringer som du kan bruke med ditt Node.js bibliotek. Men de som ikke er i aktiv utvikling, kan ha kritiske sårbarheter. Et slikt sårbarhet, som ble rapportert av Auth0, lar alle lage sine egne "signerte" tokens med hvilken nytte de ønsker.
Hvis en rimelig populær eller godt brukt pakke hadde denne feilen, ville oddsen for en utviklerfunn og patching feilen være høyere. Men hva med et inaktivt / forlatt prosjekt? Vi snakker om det i neste punkt.
Kanskje den raskeste og mest effektive måten å fastslå aktiviteten til en bestemt pakke, er å sjekke nedlastingshastigheten på npm. Du finner dette i Statistikk delen av npms pakkeside. Det er også mulig å trekke ut disse figurene automatisk ved hjelp av npm-statistikk-API eller ved å bla gjennom historiske statistikker på npm-stat.com. For pakker med GitHub-repositorier, bør du sjekke ut begivenhetshistorikken, problemsporingen og eventuelle relevante trekkforespørsler for biblioteket.
Det er mange feil, inkludert et stort antall sikkerhetsbuller som kontinuerlig blir oppgradert og i de fleste tilfeller umiddelbart patched. Det er ikke uvanlig å se nylig rapporterte sikkerhetsproblemer som er løst utelukkende på den nyeste grenen / versjonen av et gitt prosjekt.
For eksempel, la oss ta feil i ReDoS-sårbarheten (Regular Expression Denial of Service) på HMAC-pakken "hawk" tidlig i 2016. Denne feilen i hawk ble raskt løst, men bare i den nyeste store versjonen, 4.x. Eldre versjoner som 3.x ble patched mye senere, selv om de var like utsatt.
Derfor er dine avhengigheter som hovedregel mindre sannsynlig å ha noen sikkerhetsproblemer hvis de bruker den nyeste tilgjengelige versjonen.
Den enkleste måten å bekrefte hvis du bruker den nyeste versjonen, er å bruke npm utdatert
kommando. Denne kommandoen støtter -prod
flagg for å ignorere noen dev avhengigheter og --json
for å gjøre automatisering enklere.
Kontroller regelmessig pakkene du bruker for å bekrefte deres endringsdato. Du kan gjøre dette på to måter: via npm brukergrensesnittet, eller ved å kjøre npm visning
.
Nøkkelen til å sikre søknaden din er å ha en sikkerhetskultur fra starten. I dette innlegget har vi dekket noen av standardpraksisene for å forbedre sikkerheten til JavaScript-komponentene dine.
npm revisjon
å analysere dine avhengigheter.Hvis du har noen tanker om JavaScript-sikkerhet, kan du dele dem i kommentarene.