Or you want a quick look: npm là gì?
Người ta vừa phát hiện ra một package npm bí ẩn có tên là “-” đã được tải về tới hơn 700.000 lượt. Điều thú vị là nó chẳng chứa bất kỳ dòng code nào có nghĩa. Vậy tại sao nó lại được tải về nhiều như vậy?
npm là gì?
Trước tiên, để tiện cho việc nắm được nội dung bài viết mời các bạn tìm hiểu npm là gì? – NMP là viết tắt của Node package manager là một công cụ tạo và quản lý các thư viện lập trình Javascript cho Node.js. Trong cộng đồng Javascript, các lập trình viên chia sẻ hàng trăm nghìn các thư viện với các đoạn code đã thực hiện sẵn một chức năng nào đó. Nó giúp cho các dự án mới tránh phải viết lại các thành phần cơ bản, các thư viện lập trình hay thậm chí cả các framework.
Cơ sở dữ liệu trực tuyến của npm được gọi là npm registry, chứa các package public và private.
Bên trong package “-” có những gì?
Package “-” có mặt trên npm registry từ đầu năm 2020. Cho đến nay, package này gây bất ngờ khi được tải về tới hơn 700.000 lần. Package này chỉ có duy nhất một phiên bản 0.0.1 và chứa ba file:
tar tvf 0.0.1/--0.0.1.tgz
package/dist/index.js
package/package.json
package/README.md
Bên trong các tệp này, chủ yếu là tệp kê khai (package.json) và index.js, không có bất cứ điều gì khú vị, chỉ đơn giản là những đoạn code khung.
Tệp kê khai kéo một loạt phụ thuộc phát triển (devDependencies) và gọi một số lệnh trên thành phần “ts-node” nhưng cũng chỉ có mỗi thế. Thực tế hiện tại nó chỉ là một đoạn code chết, vô dụng:
“-” được sử dụng bởi gần 60 package khác
Bất ngờ hơn, package vô dụng “-” còn đóng vai trò phụ thuộc cho gần 60 package khác mà không hiểu tại sao.
Nhưng hầu hết các phụ thuộc này đều có không quá vài chục lượt tải xuống hàng tuần. Vậy làm thế nào mà “-” đạt được gần 720.000 lượt tải?
Nguyên nhân có thể là do lỗi đánh máy
Giải thích hợp lý nhất cho điều này chính là gói “-” vô tình được tải xuống do các nhà phát triển đã mắc lỗi đánh máy khi chạy lệnh npm.
Ví dụ: Để cài đặt package có tên “somepackage” bạn sẽ phải chạy lệnh:
npm i somepackage
Điều gì sẽ xảy ra nếu bạn chỉ định một vài flag nhưng lại mắc lỗi. Ví dụ:
npm i - someFlag somepackage
Khoảng trống giữa “-” với someFlag khiến npm tải về package “-” bởi vì package này có tồn tại.
Tương tự như vậy, khi thêm các phần phụ thuộc vào package.json qua dòng lệnh nhà phát triển cũng rất dễ mắc lỗi với “-“.
Trang tin BleepingComputer đã thử nghiệm dòng lệnh sau với ý định tải xuống package “somepackage” và “axsharma” từ npm. Bạn hãy chú ý, dòng lệnh này có lỗi, thừa một dấu “-” trước cờ “–save”.
npm install somepackage axsharma - --save
Lỗi này khiến cả file package-lock.json và thư mục node_modules/ đều chứa package “-“:
Cho tới thời điểm hiện tại, có thể kết luận “-” không phải là một package chứa mã độc hay có ý định phá hoại. Tuy nhiên, việc cho phép đặt tên package bằng những ký tự dễ gây nhầm lẫn của npm có thể vô tình tiếp tay cho tội phạm mạng.
Lợi dụng việc nhà phát triển dễ bị mắc những lỗi đánh máy, tội phạm mạng có thể tạo ra các package độc hại để đánh lừa họ tải về. Nguy hiểm hơn, quá trình tải nhầm package này diễn ra âm thầm và nhà phát triển thường không hay biết gì.