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"
}
}
Và 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 và --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-gitvà--allow-remotevà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
3,800 GitHub Repos Bị Đánh Cắp Qua VSCode Extension: Bài Học Cho Developer
GitHub xác nhận 3,800 repository nội bộ bị lộ sau khi nhân viên cài extension VSCode chứa mã độc. Đây là hồi chuông cảnh tỉnh cho mọi developer đang dùng VSCode.
Miasma Worm: Khi AI Agent Trở Thành Cánh Tay Nối Dài Của Malware
Mã độc Miasma tấn công 73 repo của Microsoft, lợi dụng cơ chế hoạt động của Claude Code và Cursor để âm thầm đánh cắp credential của developer.
Claude Fable 5: Khi Anthropic Đưa Thần Thoại Lên API Công Cộng
Anthropic vừa làm rúng động giới AI khi chính thức phát hành Claude Fable 5, mô hình đầu tiên thuộc kiến trúc Mythos-class hoàn toàn mới.