Κάθε μέρα ο αριθμός των πακέτων Javascript αυξάνεται. Είναι το αποτέλεσμα της δραστηριότητας μιας κοινότητας, η οποία, από τη μία πλευρά, απαιτεί νέες λύσεις, από την άλλη - τις παράγει ως μορφή αυτο-ανάπτυξης ή υλοποίησης. Μια τόσο μεγάλη ανάπτυξη ανοίγει νέες πόρτες και δυνατότητες, αλλά φέρνει και κινδύνους, τους οποίους κάθε προγραμματιστής πρέπει να γνωρίζει.
Στα τέλη Νοεμβρίου 2018, η κοινότητα του GitHub ανέφερε μια σοβαρή ευπάθεια στο event-stream - πακέτο που βοηθά στην εργασία με κόμβος εκδηλώσεις πιο αποτελεσματικά. Ήταν αρκετά δημοφιλές, καθώς ο αριθμός των λήψεων κατά τη συγκεκριμένη περίοδο ξεπερνούσε τα 2,2 εκατομμύρια ανά εβδομάδα (σε σύγκριση με το React με 3,7 εκατομμύρια). Το Event-stream, καθώς και οι εξαρτήσεις του, εξαρτιόνταν από μια άλλη βιβλιοθήκη - flatmap-steam, που έτυχε να έχει ενημερωθεί με ένα κακόβουλο λογισμικό κρυπτο-τσέπης. Αυτό επέτρεπε την κλοπή ιδιωτικών κλειδιών και άλλων λεπτομερειών από τους λογαριασμούς των χρηστών σε μηχανήματα στα οποία ήταν ενσωματωμένο το πακέτο.
Τελικά, η flatmap-stream αφαιρέθηκε από την NPM, γεγονός που δημιούργησε χρονικά προβλήματα με πολλές άλλες βιβλιοθήκες. Τον Μάιο του ίδιου έτους, η κοινότητα βρήκε μια κερκόπορτα μέσα στην το getcookie πακέτο, το οποίο αποτελούσε μέρος πολλών άλλων εξαρτήσεων. Τέτοια παραδείγματα μπορούν να πολλαπλασιαστούν, γεγονός που αποδεικνύει ότι είναι σημαντικό να δίνετε προσοχή στις εξαρτήσεις που εγκαθίστανται σε ένα έργο, όχι μόνο από την Javascript αλλά και σε γενικότερο πλαίσιο.
Βασιστείτε σε επίσημες λύσεις και μεγάλες κοινότητες
Στο μέτρο του δυνατού, είναι σημαντικό να βασίζεστε σε επίσημες λύσεις στο έργο σας. Δεν είναι απλώς λιγότερο ευάλωτες λόγω καλύτερης διαδικασίας ανάπτυξης. Μια μεγάλη κοινότητα, η οποία συνήθως συνοδεύεται από ένα καλύτερο εμπορικό σήμα, βοηθάει στον πολύ ταχύτερο εντοπισμό των προβλημάτων και, το σημαντικότερο, στην εξεύρεση καλών λύσεων.
Χρήση τάσεων NPM

Σχήμα 1 Τάση Webpack NPM.

Σχήμα 2. Τάση της ροής γεγονότων NPM.
Μερικές φορές, η γνώση της τρέχουσας κατάστασης του πακέτου μπορεί να μην αντιπροσωπεύει το παρελθόν του. Μια γρήγορη ματιά στο διάγραμμα τάσεων του npm μπορεί να σας δείξει μια πραγματική τάση του πακέτου. Θα δείξει όχι μόνο τις μεγάλες κορυφές, όπου θα μπορούσε να βρεθεί κάποια ευπάθεια, αλλά και τη γενική κατάσταση ενός συγκεκριμένου πακέτου (ΣΗΜΕΙΩΣΗ: οι μεγάλες κορυφές στις τάσεις της google κοντά στις 24 - 30 Δεκεμβρίου αντιπροσωπεύουν την περίοδο των διακοπών, η οποία μπορεί να μην αντιπροσωπεύει απαραίτητα κάποιο πρόβλημα). Ως παράδειγμα, ρίξτε μια ματιά στην εικόνα 1 - μια αντιπροσωπευτική τάση της λήψης του Webpack ανά εβδομάδα. Θα δείτε σταθερή αύξηση χωρίς σημεία διακοπής, γεγονός που μπορεί να υποδηλώνει ότι το Webpack είναι ένα σταθερό και ασφαλές πακέτο προς χρήση. Από την άλλη πλευρά, στο σχήμα 2 θα βρείτε μια μεγάλη πτώση τον Νοέμβριο, η οποία αποτελεί σαφές μήνυμα ότι κάτι λάθος μπορεί να συνέβη εκείνη την περίοδο (κάτι που ήδη γνωρίζουμε ότι ισχύει).
Έλεγχος εξάρτησης
Ο καλύτερος και πιο αξιόπιστος τρόπος για να επαληθεύσετε την κατάσταση των εξαρτήσεών σας είναι να εκτελέσετε ένα έλεγχος. Αυτή η εντολή είναι τώρα διαθέσιμη εγγενώς τόσο για το yarn όσο και για το npm, αν και απαιτεί τις τελευταίες εκδόσεις τους. Στέλνει μια λίστα με τις τρέχουσες εξαρτήσεις σε ένα κατάλληλο τελικό σημείο και επιστρέφει πληροφορίες που περιέχουν τις τρέχουσες ευπάθειές τους και άλλες λεπτομέρειες χρήσης, συμπεριλαμβανομένης της αναφοράς στην τεκμηρίωση. (εικόνα3).

Σχήμα 3. Παράδειγμα αποτελέσματος της εντολής npm audit. Πηγή: https://docs.npmjs.com
Η διαχείριση των εξαρτήσεων στη Javascript δεν είναι εύκολη υπόθεση. Ο αριθμός των λύσεων αυξάνεται καθημερινά, επομένως θυμηθείτε να επιλέγετε τις εξαρτήσεις σας με σύνεση και προσοχή. Συνεχίστε να ελέγχετε το τρέχον έργο σας και να ενημερώνετε τακτικά τα πακέτα σας.
Για να μάθετε περισσότερα σχετικά με τις εξαρτήσεις javascript και πώς να επιλύσετε ορισμένα από τα προβλήματά τους, παρακαλώ ελέγξτε αυτό το άρθρο.
Πηγή:
- https://github.com/dominictarr/event-stream/issues/116
- https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident
- https://blog.npmjs.org/post/173526807575/reported-malicious-module-getcookies
- https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities
- https://docs.npmjs.com/cli/audit
- https://yarnpkg.com/lang/en/docs/cli/audit/