0
0
Lập trình
TT

Cuộc Tấn Công Chuỗi Cung Ứng NPM Lớn Nhất và Cách Bảo Vệ

Đăng vào 4 tháng trước

• 8 phút đọc

Cuộc Tấn Công Chuỗi Cung Ứng NPM Lớn Nhất và Cách Bảo Vệ

Vào ngày 8 tháng 9 năm 2025, hệ sinh thái JavaScript đã thoát khỏi thảm họa trong gang tấc. Một tài khoản bị lừa đảo duy nhất đã cho phép kẻ tấn công phát hành các bản cập nhật độc hại đến 18 gói NPM phổ biến nhất: những thư viện như chalk, debug, và ansi-regex mà tổng cộng nhận được hơn 2 tỷ lượt tải về mỗi tuần. 😱

Trong khoảng hai giờ, bất kỳ ai thực hiện npm install hoặc triển khai một build mới có thể đã vô tình tải về những phiên bản bị xâm nhập này.

Tải trọng không chỉ là một minh chứng. Nó là một trình rút tiền ẩn tinh vi, lặng lẽ thay đổi địa chỉ ví trong các giao dịch tiền điện tử trên trình duyệt web.

Nếu bạn có một ví MetaMask mở trong một ứng dụng sử dụng một trong những gói này, tiền của bạn có thể đã bị chuyển hướng đến kẻ tấn công.

Cuộc tấn công này là một lời cảnh tỉnh cho mọi nhà phát triển và tổ chức phụ thuộc vào các thư viện mã nguồn mở—nói cách khác, tất cả chúng ta.

Hãy cùng phân tích những gì đã xảy ra, tại sao điều này lại quan trọng, và bảy bước thực tiễn để bảo vệ mã nguồn và người dùng của bạn.


🧵 Điều Gì Đã Xảy Ra

  • Kẻ tấn công đã gửi một email lừa đảo đến một người duy trì, mạo danh bộ phận hỗ trợ NPM và lừa anh ta nhập thông tin xác thực và mã OTP của mình trên một trang web giả mạo.
  • Với quyền truy cập vào tài khoản của anh ta, họ đã phát hành các phiên bản vá độc hại của các gói được sử dụng rộng rãi. Ví dụ: chalk@5.6.1debug@4.4.2.
  • Phần mềm độc hại đã được thiết kế cẩn thận:
    • Nó chỉ kích hoạt trong môi trường trình duyệt (typeof window !== 'undefined').
    • gắn vào các API mạng như window.fetchXMLHttpRequest.send.
    • Nó phát hiện các giao dịch tiền điện tử và thay thế địa chỉ ví người nhận ngay trước khi ký.
    • Hỗ trợ nhiều chuỗi: Ethereum, Bitcoin, Solana, và nhiều hơn nữa.
  • Trong vòng hai giờ, các nhà nghiên cứu bảo mật và đội ngũ NPM đã phản ứng:
    • Các phiên bản xấu đã được gỡ bỏ khỏi kho lưu trữ.
    • Các thông báo trên GitHub đã được công bố để cảnh báo các dự án bị ảnh hưởng.
    • Vercel và các nền tảng khác đã thông báo cho các nhóm có build bị xâm nhập.

Mặc dù lợi ích tài chính trực tiếp là nhỏ (~600 đô la trong tiền điện tử được theo dõi đến ví của kẻ tấn công), nhưng thiệt hại tiềm ẩn là rất lớn.

Hãy tưởng tượng tải trọng này trong một ứng dụng fintech lớn hoặc sàn giao dịch tiền điện tử; hàng triệu có thể đã bị mất trong vài phút.


🛡️ Bảy Cách Bảo Vệ Mã Nguồn Của Bạn

Hãy gọi kẻ tấn công là Jack. Hắn là kẻ tinh ranh, kiên nhẫn, và luôn tìm kiếm cơ hội tiếp theo để xâm nhập vào chuỗi cung ứng của bạn. 🌲💻🪓

Cuộc tấn công này là một ví dụ điển hình về cuộc tấn công chuỗi cung ứng—nơi mắt xích yếu nhất không phải là mã của bạn, mà là các phụ thuộc mà bạn tin tưởng. Đó là lý do tại sao bạn nên cẩn trọng với mọi gói mà bạn cài đặt. Bởi vì Jack sẽ quay lại.

Dưới đây là bảy bước thực tiễn bạn có thể thực hiện để phòng ngừa trước Jack tiếp theo:


1. Thực hiện và Khóa Các Phụ Thuộc

Các phiên bản nổi như ^5.0.0 hoặc latest có nghĩa là các build của bạn có thể đột ngột nhận các bản cập nhật độc hại.

Thay vào đó:

  • Cam kết một tệp package-lock.json hoặc yarn.lock.
  • Sử dụng cài đặt xác định trong CI/CD, vì npm install vẫn có thể cập nhật các gói trong phạm vi cho phép. Ưu tiên:
Copy
  npm ci
  • Cân nhắc sử dụng các công cụ như Renovate hoặc Dependabot để quản lý các bản cập nhật theo các nhóm có kiểm soát.

Tại sao điều này lại quan trọng: Nếu bạn có một lockfile trước ngày 8 tháng 9, bạn sẽ không tự động tải về chalk@5.6.1.


2. Chặn Các Script Vòng Đời (Phòng Ngừa Hậu Cài Đặt)

Các gói độc hại thường lạm dụng các script vòng đời npm như postinstall để thực thi các lệnh tùy ý.

Chặn chúng theo mặc định:

Copy
npm install --ignore-scripts

Đặt nó thành vĩnh viễn cho CI:

Copy
npm config set ignore-scripts true

Nếu một gói đáng tin cậy thực sự cần một script, hãy kích hoạt một cách chọn lọc.

Bonus: Điều này cũng giúp tăng tốc độ build của bạn!


3. Quét Liên Tục Các Phụ Thuộc

Sử dụng các công cụ Phân Tích Thành Phần Phần Mềm (SCA) để phát hiện các phiên bản xấu đã biết:

  • Snyk
  • Trivy
  • Docker Scout

Chạy các quét trong pipeline của bạn và thất bại các build trên các phát hiện nghiêm trọng.


4. Sử Dụng npq Thay Vì npm

npq là một sự thay thế hoàn hảo cho npm kiểm tra các gói về lỗ hổng, trạng thái hết hạn, và các dấu hiệu đỏ khác trước khi cài đặt.

Copy
npq install chalk

npq kiểm tra những điều sau:

  • Các lỗ hổng đã biết (CVE)
  • Tuổi của gói trên NPM
  • Độ phổ biến của gói
  • Sự hiện diện của file README

Về cơ bản, npq là Snyk Advisor tích hợp vào lệnh cài đặt của bạn.


5. Tăng Cường Xác Thực

Các nhà duy trì và thành viên nhóm nên sử dụng khóa bảo mật phần cứng (WebAuthn/U2F) cho NPM, GitHub, và các tài khoản quan trọng khác.

Tại sao?

  • Mã OTP (từ SMS hoặc ứng dụng xác thực) có thể bị lừa đảo trong thời gian thực.
  • Khóa phần cứng xác thực nguồn gốc miền, chặn các cuộc tấn công lừa đảo như cuộc tấn công này.

Quy tắc vàng: Không bao giờ nhấp vào các liên kết trong email không mong đợi.
Luôn truy cập trực tiếp vào trang web chính thức.

Người duy trì bị xâm nhập đã có 2FA, nhưng trang web lừa đảo đã nhập OTP của anh ta trong thời gian thực để đăng nhập.


6. Theo Dõi Các Thay Đổi Đáng Ngờ

Nếu một tiện ích nhỏ đột nhiên xuất hiện:

  • Các khối mã được mã hóa lớn
  • Các hooks mạng
  • Mã liên quan đến ví hoặc tiền điện tử

🚩 Đó là một dấu hiệu đỏ.

Sử dụng bot cập nhật phụ thuộc, nhưng xem xét cẩn thận các thay đổi — đặc biệt là đối với các thư viện được sử dụng rộng rãi.


7. Tạo SBOM (Danh Sách Hóa Đơn Phần Mềm)

SBOM cho bạn biết chính xác những gì có trong ứng dụng của bạn.

Tạo một danh sách trong mỗi build:

Copy
docker buildx build --sbom=true --push -t your-image:tag .

Lệnh này sử dụng Syft dưới dạng cơ sở để tạo một SBOM ở định dạng SPDX và tải nó lên kho hình ảnh của bạn.
Khi một gói được báo cáo là độc hại sau này, bạn có thể tìm kiếm các SBOM trước đó để nhanh chóng tìm và sửa các build bị ảnh hưởng.


⚔️ Bảo Vệ Chống Lại Jack

Jack có thể đang ẩn nấp ở đâu đó trong Rừng Đen, mài giũa mã của hắn và chờ đợi cơ hội tấn công lần nữa.

Nhưng bạn không cần phải là một mục tiêu dễ dàng.

Bằng cách kết hợp xác thực mạnhquản lý phụ thuộc chủ động, bạn có thể giảm thiểu đáng kể tầm ảnh hưởng của một cuộc tấn công chuỗi cung ứng.


Thảo Luận

💬 Mẹo yêu thích của bạn để bảo vệ chống lại các cuộc tấn công chuỗi cung ứng là gì?
Chia sẻ nó trong phần bình luận bên dưới.
Tôi sẽ giới thiệu mẹo tốt nhất trong số tiếp theo của Git Weekly và gửi cho người thắng cuộc một bản sao miễn phí của cuốn sách của tôi, Bảo Mật Docker và Kubernetes. 📘⚔️

Bảo Mật Docker và Kubernetes

Từ chuỗi cung ứng đến thời gian chạy: xây dựng hình ảnh an toàn hơn, khóa các cụm, ghi lại và điều tra các dấu vết, và theo kịp các mối đe dọa mới nổi. Hướng dẫn toàn diện của Mohammad-Ali A'râbi.

dockersecurity.io


Tài Nguyên

  • Syft – Tạo SBOM
  • Docker Scout – Quét hình ảnh và phụ thuộc container
  • Snyk – Quét lỗ hổng phụ thuộc
  • Trivy – Công cụ quét bảo mật mã nguồn mở
  • npq – Thay thế npm cho bảo mật

Tài Liệu Tham Khảo

  • Paloalto Networks. Phân Tích: Cuộc Tấn Công Chuỗi Cung Ứng npm Rộng Rãi Đặt Hàng Tỷ Lượt Tải Về Tuần Vào Rủi Ro
  • JFrog Blog. Các gói bị xâm nhập mới được xác định trong cuộc tấn công npm lớn nhất trong lịch sử
  • The Hacker News. 20 Gói npm Phổ Biến Với 2 Tỷ Lượt Tải Về Mỗi Tuần Bị Xâm Nhập Trong Cuộc Tấn Công Chuỗi Cung Ứng
  • Vercel Blog. Phản ứng đối với cuộc tấn công chuỗi cung ứng npm nghiêm trọng - Ngày 8 tháng 9 năm 2025
  • Aikido Blog. Các gói npm debug và chalk bị xâm nhập

Những Suy Nghĩ Cuối Cùng

Cuộc tấn công NPM tháng 9 có thể đã tồi tệ hơn nhiều. Nhờ phản ứng nhanh chóng của cộng đồng, thiệt hại là tối thiểu... lần này.

Nhưng các cuộc tấn công chuỗi cung ứng sẽ không biến mất. Mỗi phụ thuộc bạn cài đặt là một vectơ tấn công tiềm năng.

Hãy luôn cẩn trọng, xây dựng một cách phòng thủ, và đừng để Jack khai thác phần cứng của bạn. 🪓

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào