GitHub chặn mặc định tính năng tự chạy script trên npm để ngăn chặn mã độc
GitHub sẽ thay đổi cấu hình mặc định của npm trong phiên bản 12 tới, ngăn chặn việc tự động chạy các kịch bản cài đặt nhằm giảm thiểu rủi ro bảo mật. Quyết định này được đưa ra sau khi sâu Shai-Hulud và các mã độc khác khai thác lỗ hổng này để tấn công chuỗi cung ứng phần mềm.

GitHub thông báo sẽ thay đổi các thiết lập mặc định của npm để lệnh cài đặt (install) không còn tự động chạy các kịch bản (scripts) nữa. Việc này nhằm vô hiệu hóa một tính năng thường bị các gói phần mềm độc hại khai thác, điển hình là sâu máy tính Shai-Hulud.
Bề mặt tấn công lớn nhất trong hệ sinh thái npm
Leo Balter, người duy trì dự án, nhận định: "Các kịch bản lifecycle tại thời điểm cài đặt là bề mặt thực thi mã lớn nhất trong hệ sinh thái npm. Mọi lệnh npm install đều chạy script từ mọi phụ thuộc chuyển tiếp, do đó một gói bị xâm nhập duy nhất trong cây phụ thuộc của bạn có thể thực thi mã tùy ý trên máy của nhà phát triển hoặc trình chạy CI (tích hợp liên tục)."
Trong npm phiên bản 12 dự kiến ra mắt vào tháng 7, sẽ có ba thay đổi mặc định tập trung vào bảo mật:
- Các script được cấu hình cho
preinstall,installhoặcpostinstallsẽ không còn chạy trừ khi được cho phép rõ ràng thông quaallow-scripts. - Cờ
--allow-git, dùng để kéo phụ thuộc từ các URL từ xa, sẽ mặc định bị tắt. Điều này đóng một đường tấn công mà tệp.npmrcđộc hại có thể ghi đè tệp thực thi Git để thực thi mã tùy ý. - Cuối cùng,
allow-remotesẽ mặc định lànone, chặn hoàn toàn việc tải xuống phụ thuộc từ các URL từ xa.
Danh sách cho phép và các thay đổi phá vỡ
Vẫn có thể cho phép các script chạy thông qua danh sách cho phép (allowlist) trong tệp cấu hình package.json. Theo mặc định, danh sách này sẽ được ghim (pin) với phiên bản đã cài đặt của gói.
Đây là những thay đổi mang tính phá vỡ (breaking changes). Ông Balter khuyến nghị các nhà phát triển nên chạy các lệnh để cho phép script cho mọi gói hiện đã cài đặt trong dự án mà yêu cầu chúng. "Việc này giúp bạn được bảo vệ ngay lập tức chống lại các script mới, bất ngờ," ông nói. Bước tiếp theo là xem xét các gói này và từ chối script đối với những nơi không thực sự cần thiết.
Một số gói yêu cầu phê duyệt script để hoạt động, bao gồm các mô-đun gốc (native modules) biên dịch khi cài đặt, công cụ kiểm thử như Playwright và Puppeteer (tải binary qua postinstall), và Electron.
Phản ứng từ cộng đồng
Các tính năng này đã có sẵn kể từ phiên bản npm 11.10.0 được phát hành vào tháng 2, nhưng dưới dạng cờ tùy chọn (opt-in) thay vì mặc định. Phiên bản đó cũng giới thiệu min-release-age, chặn cài đặt các phiên bản gói mới hơn một số ngày nhất định, được thiết kế như một biện pháp bảo vệ chống lại các gói độc hại mới được xuất bản.
Tuy nhiên, liệu điều này có khắc phục được các vấn đề bảo mật của npm? Thật không may là chưa hoàn toàn. "Bây giờ tất cả mã độc có thể chuyển từ script cài đặt sang chính mô-đun, nơi nó chắc chắn vẫn sẽ được chạy," một nhà phát triển nhận định. Một quan điểm phổ biến khác là các nhà phát triển nên sử dụng pnpm, vốn có các mặc định an toàn hơn npm, bao gồm cả tuổi phát hành tối thiểu.
Dù vậy, vẫn có sự đồng thuận rằng những thay đổi này cải thiện bảo mật npm và đã quá chậm trễ. Yêu cầu kéo (pull request) cho thay đổi này bao gồm nhận xét rằng: "npm là trình quản lý gói chính lớn cuối cùng chạy script cài đặt phụ thuộc theo mặc định. pnpm v10+, Yarn Berry, Bun và Deno đều chặn chúng."



