Skip to content

NPM v12: 3 Breaking Changes Bảo Mật Mà Mọi Node.js Developer Cần Biết

Karify98 & Amy 🌸·
Cover Image for NPM v12: 3 Breaking Changes Bảo Mật Mà Mọi Node.js Developer Cần Biết

npm install Sẽ Không Chạy Script Tự Động Nữa

Nếu bạn là Node.js developer, câu lệnh npm install đã quá quen thuộc. Bạn gõ, nó chạy, mọi thứ hoạt động. Nhưng điều mà ít người để ý: mỗi lần npm install chạy, hàng loạt script từ dependencies cũng âm thầm thực thi — preinstall, install, postinstall. Không hỏi, không cảnh báo.

Đến tháng 7/2026, điều này sẽ thay đổi.

GitHub vừa công bố 3 breaking changes cho NPM v12, tất cả đều xoay quanh một chủ đề: bảo mật chuỗi cung ứng (supply chain security). Không còn tự động chạy script từ package bạn chưa approve. Không còn tự động pull git dependencies. Không còn tự động tải từ remote URL.

Đây là những thay đổi sẽ ảnh hưởng đến workflow của mọi Node.js developer. Nhưng tin tốt là: bạn có thể chuẩn bị ngay từ bây giờ.

Tại Sao Lại Cần Những Thay Đổi Này?

Trước khi đi vào chi tiết, cần hiểu lý do. NPM ecosystem có một điểm yếu cố hữu: cài một package đồng nghĩa với việc tin tưởng code của nó sẽ chạy trên máy bạn. Một postinstall script độc hại có thể đánh cắp token, cài backdoor, hoặc lây lan sang các dự án khác — tất cả diễn ra trong vài giây khi bạn chạy npm install.

Các cuộc tấn công supply chain không còn là giả thuyết. Vụ colors.js sabotage (2022), xz utils backdoor (2024), và hàng loạt package typosquatting đã chứng minh rằng một dòng npm install vô tội có thể mở cửa cho kẻ tấn công.

NPM v12 là phản ứng trực tiếp trước thực tế đó.

Breaking Change #1: allowScripts Mặc Định Là false

Đây là thay đổi lớn nhất và sẽ ảnh hưởng đến nhiều developer nhất.

Hiện tại (v11): Khi bạn chạy npm install, tất cả script preinstall, install, postinstall từ mọi dependency đều tự động thực thi. Kể cả node-gyp rebuild ngầm — nếu package có binding.gyp nhưng không khai báo script, NPM vẫn tự chạy build.

Từ v12: Mọi script đều bị chặn, trừ phi bạn tường minh cho phép từng package một. Không có allowlist = không script nào chạy.

Điều này có nghĩa là gì trong thực tế? Nếu dự án của bạn dùng package như node-sass, bcrypt, hoặc bất kỳ package nào cần native build — npm install sẽ không build chúng nữa, trừ khi bạn đã approve trước.

Cách Chuẩn Bị

NPM đã cung cấp công cụ để bạn chuẩn bị từ bây giờ (v11.16.0+):

# Nâng cấp lên npm mới nhất
npm install -g npm@latest

# Xem danh sách package có script đang bị "pending" (sẽ bị chặn ở v12)
npm approve-scripts --allow-scripts-pending

# Cho phép package bạn tin tưởng
npm approve-scripts bcrypt node-sass

# Từ chối phần còn lại
npm deny-scripts

Sau khi chạy, NPM sẽ ghi allowlist vào package.json:

{
  "allowScripts": {
    "bcrypt@5.1.1": true,
    "node-sass@9.0.0": true
  }
}

Commit file này vào repo — đó là danh sách duy nhất quyết định script nào được chạy khi bạn lên v12.

Breaking Change #2: --allow-git Mặc Định Là none

Hiện tại: Bạn có thể khai báo dependency trực tiếp từ Git repository:

{
  "dependencies": {
    "my-fork": "git+https://github.com/user/repo.git#branch"
  }
}

npm install sẽ tự động clone + cài đặt. Không cần hỏi.

Vấn đề: Một Git dependency có thể chứa file .npmrc override Git executable, mở ra đường dẫn thực thi code ngay cả khi bạn dùng --ignore-scripts. Kẻ tấn công chỉ cần chèn một transitive dependency từ Git là đủ.

Từ v12: Git dependencies bị chặn mặc định. Bạn phải thêm flag --allow-git để kích hoạt.

Điều này gây xáo trộn đáng kể với team dùng private Git repositories làm package registry. Nhưng trong bối cảnh supply chain attack ngày càng tinh vi, đây là trade-off hợp lý.

Lưu ý: --allow-file--allow-directory (dùng cho local development) không bị thay đổi default trong v12.

Breaking Change #3: --allow-remote Mặc Định Là none

Tương tự Git, việc cài package từ remote URL (HTTPS tarball) cũng bị chặn mặc định:

{
  "dependencies": {
    "some-pkg": "https://example.com/package.tgz"
  }
}

→ Sẽ không resolve trừ khi thêm --allow-remote.

Đây là thay đổi ít ảnh hưởng nhất vì hầu hết team dùng npm registry hoặc private registry, không dùng raw URL. Nhưng nếu CI/CD pipeline của bạn có step tải package từ URL, cần cập nhật ngay.

Timeline Và Tác Động Thực Tế

Mốc thời gian Sự kiện
Hiện tại (npm 11.16.0+) Cảnh báo hiển thị khi chạy npm install, chưa chặn
Tháng 7/2026 NPM v12 phát hành, 3 thay đổi trên thành mặc định

Ai bị ảnh hưởng nhiều nhất?

  • Team dùng nhiều native addons (node-sass, bcrypt, sharp, canvas...) — cần approve script cho từng package
  • Team dùng Git dependencies trong monorepo hoặc private packages — cần thêm --allow-git
  • CI/CD pipeline — mọi script cần được cập nhật với flag mới

Ai ít bị ảnh hưởng?

  • Dự án thuần JS, không native build
  • Team dùng npm registry + private registry (sinopia/verdaccio)
  • Dự án đã audit script dependencies từ trước

Takeaways

  • Chuẩn bị ngay: Nâng cấp lên npm ≥11.16.0, chạy npm approve-scripts --allow-scripts-pending, review và approve
  • CI/CD: Thêm --allow-git--allow-remote vào pipeline nếu cần
  • Tư duy mới: Script từ dependency không còn là điều hiển nhiên — phải được phép tường minh
  • Bảo mật thắng tiện lợi: 3 thay đổi này gây chút phiền toái, nhưng đổi lại là một ecosystem an toàn hơn đáng kể

Tháng 7 không còn xa. Kiểm tra dự án của bạn hôm nay — đừng để sáng thứ Hai nào đó, npm install đột nhiên không build được nữa.


Bài viết được hỗ trợ bởi AI (Amy 🌸). Nội dung đã được kiểm duyệt bởi tác giả.

Related Posts