Sự kiện các gói trên npm liên tục bị tấn công trong thời gian qua gây ảnh hưởng không nhỏ đến cộng đồng, khiến cho chúng ta nghi ngờ cả khả năng bảo mật của các thư viện mà đang sử dụng, dù là trong môi trường phát triển (development) hay môi trường sản xuất (production).
Thực tế ngay từ ngày đầu mới biết đến Node.js, npmjs... mình thấy mỗi khi chạy npm install xong thì xuất hiện thư mục node_modules và tệp package-lock.json. Tò mò mở ra thì ôi thôi, sao mà nó chứa nhiều thư mục khác quá vậy, trong khi nếu mở package.json ra chỉ thấy cài mỗi thư viện express 🤔. Điều đó có nghĩa cài express thì nó sẽ tự cài một đống gói, hay nói cách khác express đang phụ thuộc vào các gói khác, các gói đó lại tiếp tục phụ thuộc vào gói khác nữa dẫn đến một "địa ngục" phụ thuộc. Điều đó giải thích cho việc tại sao cài một thư viện thôi mà xuất hiện hàng tá thư viện chưa bao giờ nhìn thấy.
Có một điều khá thú vị là nếu điều tra một thư viện bất kỳ, lần theo dấu vết là các thư viện mà nó phụ thuộc, cứ thế cứ thế đến một lúc nào đó bạn sẽ thấy một thư viện siêu nhỏ đến mức... ngớ ngẩn, nó chỉ làm một nhiệm vụ duy nhất, nhiệm vụ đó tưởng chừng như rất đơn giản như chỉ cần một hàm JavaScript là đã có thể xử lý xong, ấy thế mà thư viện "ngớ ngẩn" đó lại có đến hàng triệu thậm chí hàng chục triệu lượt cài đặt hàng tuần. Tại sao lại thế?
Tất cả là vì những món nợ kỹ thuật ngày xưa, JavaScript không có một thư viện chuẩn để làm những điều tưởng chừng như cơ bản đó, dẫn đến cộng đồng tự tạo ra để sử dụng. Dần dần các gói đó tiếp tục được sử dụng trong các gói khác với tốc độ chóng mặt. Tưởng tượng ban đầu chúng như những viên gạch xây nhà, những viên gạch sau đè lên viên trước tạo nên một bức tường vững chắc. Nếu đập vỡ một viên gạch đầu tiên, nhiều khả năng bức tường bị sụp đổ, điều đó khiến chúng ta liên tưởng đến các sự kiện xảy ra gần đây. Nếu thế tại sao không tìm cách khắc phục?
Khó! Mặc dù JavaScript liên tục bổ sung thêm đặc tả mới, mạnh mẽ hơn, cơ mà ngôi nhà đã xây xong, bức tường đã vững, bây giờ giới thiệu gạch mới cứng cáp và khoẻ hơn gạch cũ đến x100 lần nhưng nhà xây xong hết rồi thì giờ đây có tác dụng gì nữa chứ? Đập đi xây lại?
Vẫn khó, vì nó đã ăn quá sâu vào tiềm thức mà không thể quay lui được. Tuy vậy một phần cộng đồng đang nỗ lực để thay đổi điều này. Mình biết có một số kho lưu trữ tương tự như npmjs nhưng mang đến triết lý thiết kế mới giảm bớt sự phụ thuộc và tận dụng thư viện chuẩn, có thể kể đến như là jsr.io. Hãy lượn qua một vòng, bạn sẽ thấy chúng hầu như không có sự phụ thuộc vào các gói khác. Điều đó giảm thiểu sự phức tạp, nguy cơ tấn công và địa ngục phụ thuộc.
Thôi! Nói nhiều quá mà lại chẳng giải quyết được vấn đề gì. Mình chỉ đơn giản là chỉ ra những gì biết về các gói trên npmjs thôi. Chứ thật ra mọi người nói nhiều về vấn đề này lắm rồi. Mỗi người một kiểu nên là góp thêm một ít cho phong phú thêm câu chuyện 🤓