Cât de securizate sunt dependențele dvs. Open-Source JavaScript?

Dezvoltatorii JavaScript de zi cu zi iubesc npm. GitHub și registrul npm sunt locul preferat al dezvoltatorului pentru găsirea unui pachet special. Modulele open-source adaugă productivității și eficienței, oferind dezvoltatorilor o serie de funcționalități pe care le puteți reutiliza în proiect. Este corect să spunem că, dacă nu ar fi fost pentru aceste pachete open-source, majoritatea cadrelor de astăzi nu ar exista în forma lor actuală.

O aplicație la nivel de întreprindere cu drepturi depline, de exemplu, ar putea să se bazeze pe sute, dacă nu pe mii de pachete. Dependențele obișnuite includ dependențele directe, dependențele de dezvoltare, dependențele grupate, dependențele de producție și dependențele opționale. Este minunat pentru că toată lumea obține cele mai bune rezultate din ecosistemul open source.

Cu toate acestea, unul dintre factorii care sunt trecuți cu vederea este valoarea riscului implicat. Cu toate că aceste module terțe sunt deosebit de utile în domeniul lor, acestea introduc și unele riscuri de securitate în aplicația dvs..

Bibliotecile open-source sunt vulnerabile?

Dependentele OSS sunt într-adevăr vulnerabile la exploatări și compromisuri. Să aruncăm o privire la câteva exemple: 

O vulnerabilitate a fost descoperită recent într-un pachet numit eslint-scope, care este o dependență a mai multor pachete JavaScript populare, cum ar fi babel-eslint și webpack. Contul administratorului de pachete a fost compromis, iar hackerii au adăugat un cod malware în el. Din fericire, cineva a aflat exploatarea în destul de curând încât prejudiciul a fost raportat limitat la câțiva utilizatori. 

Moment.js, care este una dintre cele mai utilizate biblioteci pentru parsarea și afișarea datelor în JavaScript, sa dovedit recent că are o vulnerabilitate cu un scor de severitate de 7,5. Exploatarea la făcut vulnerabilă la atacurile ReDoS. Patch-urile au fost eliberate rapid și au reușit să remedieze problema destul de repede.

Dar asta nu este tot. O mulțime de explozii noi se descoperă în fiecare săptămână. Unele dintre ele sunt dezvăluite publicului, dar altele fac titluri doar după o încălcare gravă. 

Deci, cum putem atenua aceste riscuri? În acest articol, vă voi explica câteva din cele mai bune practici standard din industrie pe care le puteți utiliza pentru a vă asigura dependențele open source.

1. Urmăriți dependențele aplicației dvs.

Din punct de vedere logic, pe măsură ce crește numărul dependențelor, riscul de a se termina cu un pachet vulnerabil poate, de asemenea, să crească. Acest lucru este valabil și pentru dependențele directe și indirecte. Deși nu există nici un motiv să nu mai folosiți pachete open source, este întotdeauna o idee bună să le urmăriți.

Aceste dependențe sunt ușor de descoperit și pot fi la fel de simple ca și funcționarea npm ls în directorul rădăcină al aplicației. Puteți utiliza funcția -prod argument care afișează toate dependențele de producție și -lung argument pentru un rezumat al fiecărei descrieri a pachetului. 

Mai mult, puteți utiliza un serviciu pentru a automatiza procesul de gestionare a dependenței care oferă monitorizarea în timp real și testarea actualizării automate a dependențelor dvs. Unele dintre instrumentele familiare includ GreenKeeper, Libraries.io, etc. Aceste instrumente colaborează cu o listă a dependențelor pe care le utilizați în prezent și urmăriți informații relevante despre ele.

2. Îndepărtați pachetele pe care nu le aveți nevoie

Odată cu trecerea timpului și modificările codului dvs., este foarte probabil că veți înceta să utilizați în totalitate unele pachete și adăugați în schimb altele noi. Cu toate acestea, dezvoltatorii nu au tendința de a elimina pachetele vechi în timp ce merg.

În timp, proiectul dvs. ar putea acumula o mulțime de dependențe neutilizate. Deși acest lucru nu reprezintă un risc de securitate direct, aceste dependențe aproape sigur adaugă la suprafața de atac a proiectului dvs. și conduc la o agresiune inutilă a codului. Un atacator ar putea să găsească o portiță prin încărcarea unui pachet vechi, dar instalat, care are un coeficient de vulnerabilitate mai mare, crescând astfel daunele potențiale pe care le poate provoca.

Cum verificați pentru astfel de dependențe neutilizate? Puteți face acest lucru cu ajutorul instrumentului de depanare. Deplogeți scanarea întregului cod pentru necesită și import comenzi. Se corelează apoi aceste comenzi fie cu pachetele instalate, fie cu cele menționate în secțiunea dvs. package.json și vă oferă un raport. De asemenea, comanda poate fi modificată utilizând diferite pavilioane de comandă, simplificând astfel automatizarea verificării dependențelor neutilizate.

Instalați deplicit cu:

npm instalează -g depcheck

3. Găsiți și remediați vulnerabilitățile de securitate cruciale

Aproape toate punctele discutate mai sus se referă în primul rând la problemele potențiale pe care le-ați putea întâlni. Dar cum rămâne cu dependențele pe care le utilizați acum?

Pe baza unui studiu recent, aproape 15% din pachetele actuale includ o vulnerabilitate cunoscută, fie în componente, fie în dependențe. Cu toate acestea, vestea bună este că există multe instrumente pe care le puteți utiliza pentru a vă analiza codul și pentru a găsi riscuri de securitate open-source în cadrul proiectului dvs..

Cel mai convenabil instrument este npm's npm audit. Audit este un script care a fost lansat cu versiunea npm 6. Node Security Platform a dezvoltat inițial npm audit, iar registrul npm la achiziționat ulterior. Dacă sunteți curios să știți ce este vorba despre auditul de la npm, iată un citat din blogul oficial:

Un audit de securitate este o evaluare a dependențelor de pachete pentru vulnerabilitățile de securitate. Analizele de securitate vă ajută să vă protejați utilizatorii de pachete, permițându-vă să găsiți și să remediați vulnerabilitățile cunoscute în dependențe. Comanda de audit npm transmite o descriere a dependențelor configurate în pachetul dvs. la registrul dvs. implicit și solicită un raport al vulnerabilităților cunoscute. 

Raportul generat cuprinde de obicei următoarele detalii: numele pachetului afectat, severitatea și descrierea vulnerabilității, calea și alte informații și, dacă există, comenzi pentru aplicarea de patch-uri pentru a rezolva vulnerabilitățile. Puteți obține chiar și raportul de audit în JSON executând npm audit - json.

În afară de asta, npm oferă, de asemenea, asistență privind modul de acțiune pe baza raportului. Poți să folosești npm audit fix pentru a remedia problemele deja identificate. Aceste remedii sunt realizate în mod obișnuit prin upgrade-uri ghidate sau prin intermediul patch-urilor open-source. 

Nu ezitați să consultați documentația npm pentru mai multe informații.

4. Înlocuiți bibliotecile expirate cu alternative interne 

Conceptul de securitate open-source se bazează foarte mult pe numărul ochilor care urmăresc această bibliotecă. Pachetele care sunt utilizate în mod activ sunt urmărite mai atent. Prin urmare, există o șansă mai mare ca dezvoltatorul să fi abordat toate problemele de securitate cunoscute din pachetul respectiv. 

Să luăm un exemplu. În GitHub, există multe implementări de jetoane web JSON pe care le puteți utiliza cu biblioteca dvs. Node.js. Cu toate acestea, cei care nu sunt în dezvoltare activă ar putea avea vulnerabilități critice. O astfel de vulnerabilitate, care a fost raportată de Auth0, permite oricui să creeze propriile semnale "semnate" cu orice încărcătură utilă pe care o doresc. 

Dacă un pachet destul de popular sau bine folosit ar avea acest defect, probabilitatea ca un dezvoltator să găsească și să repare defecțiunea ar fi mai mare. Dar cum rămâne cu un proiect inactiv / abandonat? Vom vorbi despre asta în următorul punct.

5. Alegeți întotdeauna o bibliotecă care se află în dezvoltarea activă

Poate că cea mai rapidă și mai eficientă modalitate de a determina activitatea unui anumit pachet este de a verifica rata de descărcare pe npm. Puteți găsi acest lucru în Statistici secțiune a paginii pachetului npm. De asemenea, este posibil să extrageți aceste cifre automat utilizând API-ul cu statistici npm sau accesând statisticile istorice de pe npm-stat.com. Pentru pachetele cu depozite GitHub, ar trebui să verificați istoricul comitetelor, urmărirea problemelor și orice solicitări de tragere relevante pentru bibliotecă.

6. Actualizați frecvent dependențele

Există multe bug-uri, inclusiv un număr mare de bug-uri de securitate care sunt descoperite continuu și, în cele mai multe cazuri, imediat patch-uri. Nu este neobișnuit să vedem vulnerabilitățile raportate recent fiind fixate numai pe cea mai recentă sucursală / versiune a unui anumit proiect.

De exemplu, hai să luăm vulnerabilitatea Recomandării privind renunțarea la replici de serviciu (ReDoS) raportată la pachetul HMAC "hawk" la începutul anului 2016. Acest bug în șoim a fost rezolvat rapid, dar numai în cea mai recentă versiune majoră, 4.x. Versiuni mai vechi ca 3.x au fost patch-uri mult mai târziu, chiar dacă au fost la fel de riscante. 

Prin urmare, ca regulă generală, dependențele dvs. sunt mai puțin susceptibile de a avea erori de securitate dacă utilizează ultima versiune disponibilă. 

Cea mai ușoară modalitate de a confirma dacă utilizați cea mai recentă versiune este folosirea funcției npm depășită comanda. Această comandă acceptă -prod să ignore toate dependențele și --JSON pentru a simplifica automatizarea.

Verificați periodic pachetele pe care le utilizați pentru a verifica data modificării. Puteți face acest lucru în două moduri: prin interfața de utilizare npm sau prin difuzare Vizualizare npm time.modified.

Concluzie

Cheia pentru asigurarea aplicației dvs. este să aveți o primă cultură de securitate de la bun început. În acest post, am acoperit câteva dintre practicile standard pentru îmbunătățirea securității componentelor dvs. JavaScript. 

  1. Utilizați dependențele open-source care se află în dezvoltarea activă.
  2. Actualizați și monitorizați componentele.
  3. Examinați codul și scrieți teste.
  4. Îndepărtați dependențele nedorite sau utilizați alternative.
  5. Utilizați instrumente de securitate cum ar fi npm audit pentru a vă analiza dependențele.

Dacă aveți vreo idee despre securitatea JavaScript, nu ezitați să le distribuiți în comentarii.

Cod