Tấn công chuỗi cung ứng npm và tác động đến MCP
Tuần trước, một cuộc tấn công chuỗi cung ứng đáng kể đã xảy ra trong hệ sinh thái JavaScript/TypeScript thông qua kho npm. Nhiều gói (packages) được sử dụng rộng rãi, với tổng số lượt tải xuống hơn 2 tỷ lần mỗi tuần, đã bị xâm phạm thông qua tài khoản npm của một người duy trì.
Phiên bản độc hại của các gói như debug, chalk, ansi-styles, và 15 gói khác đã được phát hành. Payload của cuộc tấn công tập trung vào việc đánh cắp ví tiền điện tử, nhưng sự cố này đã làm nổi bật một rủi ro lớn hơn đang diễn ra: chuỗi cung ứng mã nguồn mở là một mục tiêu giá trị cao.
Và nó không dừng lại ở đó. Trong tuần này, một chiến dịch khác mang tên "Shai-Hulud" đã nhắm mục tiêu vào các gói npm bổ sung, lần này là để lấy dữ liệu nhạy cảm và cố gắng tự nhân bản trong toàn bộ hệ sinh thái.
Nhiều thông tin đã được viết về những cuộc tấn công này. Ở đây, tôi sẽ tập trung vào tác động đến hệ sinh thái Giao thức Ngữ cảnh Mô hình (MCP). Một cuộc khảo sát nhanh các máy chủ MCP dựa trên npm cho thấy một tỷ lệ đáng kể đang gặp rủi ro.
Tại sao nhiều máy chủ MCP lại bị phơi bày?
Các gói bị xâm phạm là nền tảng trong hệ sinh thái JavaScript/TypeScript. Đối với MCP, chúng là các phụ thuộc gián tiếp của SDK TypeScript MCP chính thức. Bất kỳ máy chủ MCP nào được xây dựng từ SDK đều có khả năng bị tổn thương.
Hầu hết các máy chủ JS/TS MCP đều được chạy bởi khách hàng với npx, cho phép thực thi các lệnh tùy ý từ các gói npm. Trong quá trình thực thi, tất cả các phụ thuộc trực tiếp và gián tiếp đều được tải xuống hệ thống cục bộ. Trừ khi được bọc trong một container Docker, máy chủ sẽ thừa hưởng quyền truy cập giống như bạn có trên máy của mình, mạng và dữ liệu.
Người dùng MCP nên làm gì?
May mắn thay, các phiên bản độc hại đã được xác định và loại bỏ nhanh chóng, hạn chế thiệt hại ở phía hạ nguồn. Nhưng hãy giả định điều tồi tệ nhất và thực hiện các bước chủ động:
- Kiểm tra và cập nhật các phiên bản gói MCP mà bạn sử dụng.
- Dọn dẹp bộ nhớ cache npm/npx của bạn (
npm cache clean --force) và khởi động lại các máy khách MCP của bạn. - Ghi rõ phiên bản gói thay vì mặc định là
@latest.
Trong tương lai, hãy áp dụng cùng một kỷ luật như bạn sẽ làm cho bất kỳ mã nào bạn chạy trên máy cục bộ:
- Giữ cho các máy chủ MCP luôn được cập nhật.
- Ưu tiên các máy chủ đang được duy trì tích cực.
- Thích các máy chủ MCP đã được container hóa để giới hạn phạm vi ảnh hưởng của chúng.
Người duy trì máy chủ MCP nên làm gì?
Nếu bạn duy trì một máy chủ npm MCP, hãy xây dựng lại và phát hành một phiên bản mới, ngay cả khi bạn không nghĩ rằng mình đã bị ảnh hưởng. Chi phí để thực hiện là rất thấp, và điều này sẽ loại bỏ khả năng một phụ thuộc độc hại đã lọt vào trong khoảng thời gian tấn công.
Trong dài hạn, có một số thực tiễn tốt mà mọi người duy trì nên tuân theo:
- Kiểm tra các phụ thuộc một cách thường xuyên với
npm audithoặc các công cụ tương tự. - Tự động cập nhật các phụ thuộc trực tiếp và gián tiếp với các công cụ như Dependabot.
- Ghi rõ phiên bản phụ thuộc trực tiếp.
- Hãy cẩn thận: những kẻ tấn công này đã sử dụng các phiên bản vá lỗi, vì vậy ngay cả một dải phiên bản hẹp như
~1.2.3cũng sẽ khớp.
- Hãy cẩn thận: những kẻ tấn công này đã sử dụng các phiên bản vá lỗi, vì vậy ngay cả một dải phiên bản hẹp như
- Kiểm tra tệp lock của bạn vào hệ thống kiểm soát phiên bản để xây dựng có thể tái tạo.
- Cung cấp các bản dựng đã được container hóa của máy chủ MCP của bạn.
ToolHive: một cách tiếp cận an toàn cho MCP
Tại Stacklok, chúng tôi đang làm việc để bảo mật các máy chủ MCP thông qua dự án mã nguồn mở của chúng tôi, ToolHive.
Chúng tôi đã đưa ra những lựa chọn có chủ đích trong thiết kế và phát triển ToolHive với sự an toàn trong tâm trí. Ví dụ, một trong những quyết định kiến trúc sớm nhất của chúng tôi là yêu cầu container hóa cho các máy chủ MCP.
Chúng tôi đóng gói lại một bộ gói MCP được chọn lọc dưới dạng hình ảnh container trong kho ToolHive. Khi biết về cuộc tấn công này, chúng tôi đã chủ động xây dựng lại các hình ảnh này ngay khi các gói độc hại bị loại bỏ khỏi kho npm. Đối với các hình ảnh bên thứ ba trong kho của chúng tôi, chúng tôi sử dụng việc ghi rõ phiên bản nghiêm ngặt, đảm bảo rằng người dùng không kéo các bản phát hành có thể bị tổn thương trong khoảng thời gian tấn công.
Container hóa mang lại tính nhất quán và khả năng di động trong thời gian chạy, nhưng quan trọng hơn, nó hạn chế sự phơi bày: một máy chủ MCP bị xâm phạm được cô lập khỏi phần còn lại của hệ thống của bạn.
ToolHive còn đi xa hơn bằng cách bao gồm cách ly mạng. Bạn có thể hạn chế quyền truy cập ra ngoài để các máy chủ MCP chỉ kết nối nơi chúng cần. Các thiết lập an toàn được tích hợp sẵn trong kho. Ví dụ, máy chủ MCP GitHub có thể được bảo vệ bằng một cờ CLI duy nhất hoặc một công tắc UI:
thv run --isolate-network github
Kết luận
Cuộc tấn công chuỗi cung ứng npm vào ngày 8 tháng 9 năm 2025 đã ảnh hưởng sâu sắc đến hệ sinh thái MCP. Tác động thực tế phụ thuộc vào cách các máy chủ được phát triển và triển khai. Cách ly container, đặc biệt khi kết hợp với cách ly mạng, đã chứng minh là một biện pháp phòng thủ hiệu quả.
Điều này không chỉ là về một công cụ đơn lẻ. Nó nhắc nhở rằng an ninh phải được tích hợp vào cách chúng ta phát triển và vận hành phần mềm. Các cuộc tấn công chuỗi cung ứng sẽ tiếp tục phát triển. Các thực tiễn của chúng ta phải tiến hóa nhanh hơn.