Hoe veilig zijn uw JavaScript Open Source-afhankelijkheden?

Moderne JavaScript-ontwikkelaars houden van npm. GitHub en het npm-register zijn de eerste keuzeplaats van een ontwikkelaar voor het vinden van een bepaald pakket. Open-source modules dragen bij aan de productiviteit en efficiëntie door ontwikkelaars een scala aan functionaliteiten te bieden die u kunt hergebruiken in uw project. Het is redelijk om te zeggen dat als de open source-pakketten er niet zouden zijn, de meeste kaders van vandaag niet zouden bestaan ​​in hun huidige vorm..

Een volwaardige applicatie op bedrijfsniveau kan bijvoorbeeld vertrouwen op honderden, zo niet duizenden pakketten. De gebruikelijke afhankelijkheden omvatten directe afhankelijkheden, afhankelijkheid van de ontwikkeling, gebundelde afhankelijkheden, afhankelijkheden van de productie en optionele afhankelijkheden. Dat is geweldig want iedereen haalt het beste uit het open-source ecosysteem.

Een van de factoren die over het hoofd worden gezien, is echter de hoeveelheid risico die hiermee gemoeid is. Hoewel deze externe modules bijzonder nuttig zijn in hun domein, introduceren ze ook enkele beveiligingsrisico's in uw toepassing.

Zijn open-sourcebibliotheken kwetsbaar?

OSS-afhankelijkheden zijn inderdaad kwetsbaar voor exploits en compromissen. Laten we een paar voorbeelden bekijken: 

Onlangs werd een kwetsbaarheid ontdekt in een pakket genaamd eslint-scope, dat afhankelijk is van verschillende populaire JavaScript-pakketten zoals babel-eslint en webpack. Het account van de beheerder van het pakket is gehackt en de hackers hebben er schadelijke code aan toegevoegd. Gelukkig kwam iemand er snel achter dat de schade naar verluidt beperkt was tot een paar gebruikers. 

Moment.js, een van de meest gebruikte bibliotheken voor het parseren en weergeven van datums in JavaScript, is recentelijk bevonden een kwetsbaarheid te hebben met een severity score van 7.5. De exploit maakte het kwetsbaar voor ReDoS-aanvallen. Patches werden snel vrijgegeven en ze konden het probleem vrij snel oplossen.

Maar dat is niet alles. Veel nieuwe exploits worden wekelijks ontdekt. Sommigen van hen worden bekendgemaakt aan het publiek, maar anderen halen alleen koppen na een ernstige overtreding. 

Dus hoe kunnen we deze risico's beperken? In dit artikel zal ik een aantal van de best practices in de branche uitleggen die u kunt gebruiken om uw open-source afhankelijkheden te beveiligen.

1. Houd de afhankelijkheden van uw applicatie bij

Logisch gesproken, naarmate het aantal afhankelijkheden toeneemt, kan het risico op een kwetsbaar pakket ook toenemen. Dit geldt ook voor directe en indirecte afhankelijkheden. Hoewel er geen reden is dat u stopt met het gebruik van open-sourcepakketten, is het altijd een goed idee om ze bij te houden.

Deze afhankelijkheden zijn gemakkelijk vindbaar en kunnen net zo eenvoudig zijn als draaien npm ls in de hoofdmap van uw toepassing. U kunt de -por argument dat alle productie-afhankelijkheden en de -lang argument voor een samenvatting van elke pakketbeschrijving. 

Bovendien kunt u een service gebruiken om het proces voor afhankelijkheidsbeheer te automatiseren dat real-time monitoring en automatische updatetests voor uw afhankelijkheden biedt. Enkele van de vertrouwde tools omvatten GreenKeeper, Libraries.io, enz. Deze tools sorteren een lijst van de afhankelijkheden die u momenteel gebruikt en volgen relevante informatie over hen.

2. Ontdoen van pakketten die u niet nodig hebt

Met het verstrijken van de tijd en wijzigingen in uw code, is het waarschijnlijk dat u stopt met het gebruik van sommige pakketten helemaal en in plaats daarvan nieuwe toevoegt. Ontwikkelaars hebben echter de neiging om oude pakketten niet te verwijderen als ze meegaan.

Na verloop van tijd kan uw project veel ongebruikte afhankelijkheden accumuleren. Hoewel dit geen direct veiligheidsrisico is, voegen deze afhankelijkheden vrijwel zeker toe aan het aanvalsoppervlak van uw project en leiden tot onnodige rommel in de code. Een aanvaller kan een maas in de wet vinden door een oud, maar geïnstalleerd pakket met een hoger kwetsbaarheidsquotiënt te laden, waardoor de potentiële schade die het kan veroorzaken, toeneemt.

Hoe controleer je op dergelijke ongebruikte afhankelijkheden? U kunt dit doen met behulp van de tool voor het afhandelen van bestanden. Depcheck scant uw volledige code voor vereist en importeren commando's. Vervolgens worden deze opdrachten gecorreleerd met geïnstalleerde pakketten of de pakketten die worden genoemd in uw package.json en biedt u een rapport. De opdracht kan ook worden gewijzigd met behulp van verschillende opdrachtvlaggen, waardoor het eenvoudiger wordt om het controleren van ongebruikte afhankelijkheden te automatiseren.

Installeer depcheck met:

npm install -g depcheck

3. Zoek en herstel cruciale beveiligingslekken

Bijna alle hierboven besproken punten houden zich primair bezig met de potentiële problemen die u tegen kunt komen. Maar hoe zit het met de afhankelijkheden die u nu gebruikt??

Op basis van een recente studie bevat bijna 15% van de huidige pakketten een bekende kwetsbaarheid, hetzij in de componenten of afhankelijkheden. Het goede nieuws is echter dat er veel tools zijn die u kunt gebruiken om uw code te analyseren en open-source beveiligingsrisico's binnen uw project te vinden.

Het handigste hulpmiddel is npm's npm audit. Audit is een script dat is uitgebracht met versie 6 van npm. Node Security Platform ontwikkelde in eerste instantie npm-audit en npm-registry heeft het later overgenomen. Als je nieuwsgierig bent naar wat npm audit inhoudt, dan is hier een citaat uit de officiële blog:

Een beveiligingsaudit is een beoordeling van pakketafhankelijkheden voor beveiligingskwetsbaarheden. Beveiligingsaudits helpen u de gebruikers van uw pakket te beschermen door u in staat te stellen bekende zwakke plekken in afhankelijkheden te vinden en op te lossen. De opdracht npm-audit verzendt een beschrijving van de afhankelijkheden die in uw pakket zijn geconfigureerd naar uw standaardregister en vraagt ​​om een ​​rapport met bekende kwetsbaarheden. 

Het gegenereerde rapport bevat meestal de volgende details: de betreffende pakketnaam, de ernst van de kwetsbaarheid en beschrijving, pad en andere informatie en, indien beschikbaar, opdrachten om patches toe te passen om kwetsbaarheden op te lossen. U kunt het auditrapport zelfs in JSON krijgen door het uit te voeren npm audit - json.

Daarnaast biedt npm ook hulp bij het handelen op basis van het rapport. Je kunt gebruiken npm audit fix om problemen op te lossen die al zijn gevonden. Deze oplossingen worden meestal bereikt met behulp van begeleide upgrades of via open-source patches. 

Raadpleeg de documentatie van npm voor meer informatie.

4. Vervang verlopen bibliotheken met interne alternatieven 

Het concept van open-sourcebeveiliging is sterk afhankelijk van het aantal ogen dat waakt over die bepaalde bibliotheek. Pakketten die actief worden gebruikt, worden nauwlettend in de gaten gehouden. Daarom is de kans groter dat de ontwikkelaar alle bekende beveiligingsproblemen in dat specifieke pakket heeft aangepakt. 

Laten we een voorbeeld nemen. Op GitHub zijn er veel JSON-webtoken-implementaties die u kunt gebruiken met uw Node.js-bibliotheek. Degenen die niet in actieve ontwikkeling zijn, kunnen echter kritieke kwetsbaarheden hebben. Eén van deze kwetsbaarheden, die werd gemeld door Auth0, laat iedereen zijn eigen "ondertekende" tokens maken met elke gewenste belasting. 

Als een redelijk populair of goed gebruikt pakket dit probleem had, zou de kans dat een ontwikkelaar de fout zou vinden en herstellen groter zijn. Maar hoe zit het met een inactief / verlaten project? We zullen daar in het volgende punt over praten.

5. Kies altijd een bibliotheek die zich in actieve ontwikkeling bevindt

Misschien is de snelste en meest efficiënte manier om de activiteit van een specifiek pakket te bepalen de downloadsnelheid op npm te controleren. Je kunt dit vinden in de Stats gedeelte van de pakketpagina van npm. Het is ook mogelijk om deze cijfers automatisch uit te pakken met behulp van de API van npm stats of door historische statistieken te bekijken op npm-stat.com. Voor pakketten met GitHub-opslagplaatsen moet u de commit-geschiedenis, de issue-tracker en alle relevante pull-aanvragen voor de bibliotheek bekijken.

6. Werk de afhankelijkheden regelmatig bij

Er zijn veel bugs, waaronder een groot aantal beveiligingsbugs die voortdurend worden ontdekt en in de meeste gevallen meteen worden gepatcht. Het is niet ongebruikelijk om te zien dat recent gemelde kwetsbaarheden alleen worden vastgesteld op basis van de meest recente tak / versie van een bepaald project.

We nemen bijvoorbeeld de kwetsbaarheid van de Regular Expression Denial of Service (ReDoS) die begin 2016 werd gemeld op de hawk van het HMAC-pakket. Deze bug in hawk was snel opgelost, maar alleen in de nieuwste hoofdversie, 4.x. Oudere versies zoals 3.x werden veel later gepatcht, hoewel ze evenveel risico liepen. 

Daarom hebben uw afhankelijkheden in de regel minder beveiligingsincidenten als ze de nieuwste beschikbare versie gebruiken. 

De eenvoudigste manier om te bevestigen of u de nieuwste versie gebruikt, is met behulp van de npm verouderd commando. Deze opdracht ondersteunt de -por vlag om dev afhankelijkheden en te negeren --json om automatisering eenvoudiger te maken.

Inspecteer regelmatig de pakketten die u gebruikt om hun wijzigingsdatum te controleren. U kunt dit op twee manieren doen: via de gebruikersinterface van npm, of door te lopen npm weergave time.modified.

Conclusie

De sleutel tot het beveiligen van uw toepassing is om vanaf het begin een cultuur op beveiligingsbasis te hebben. In dit bericht hebben we enkele standaardpraktijken behandeld voor het verbeteren van de beveiliging van uw JavaScript-componenten. 

  1. Gebruik open-source afhankelijkheden die in actieve ontwikkeling zijn.
  2. Update en bewaak uw componenten.
  3. Controleer uw code en schrijf tests.
  4. Verwijder ongewenste afhankelijkheden of gebruik alternatieven.
  5. Gebruik beveiligingshulpmiddelen zoals npm audit om uw afhankelijkheden te analyseren.

Als u denkt aan JavaScript-beveiliging, kunt u deze in de opmerkingen delen.