Các gói bị ảnh hưởng có tổng số lượt tải xuống hằng tuần vượt quá 1,1 triệu . Cuộc tấn công đã gây chấn động trong cộng đồng nhà phát triển AI và ngay lập tức thúc đẩy những thay đổi chính sách từ Microsoft, hãng đã xác định hoạt động này là do Sapphire Sleet thực hiện với độ tin cậy cao vào ngày 19 tháng 6 năm 2026 .
Chuỗi tấn công đi theo một khuôn mẫu mà các nhà nghiên cứu bảo mật đã cảnh báo từ nhiều năm trước — và khai thác chính xác loại lỗ hổng thông tin đăng nhập mà các kho gói đang chạy đua để loại bỏ.
Những kẻ tấn công đầu tiên nhắm vào một người bảo trì Mastra hợp pháp thông qua tấn công xã hội (social engineering), thành công trong việc chiếm đoạt thông tin đăng nhập tài khoản npm của người đó . Tài khoản bị chiếm đoạt, được xác định là "ehindero," có quyền xuất bản trên toàn bộ phạm vi @mastra .
Sử dụng tài khoản bị chiếm đoạt, những kẻ tấn công đã phát hành lại tất cả các gói trong không gian tên @mastra/* trong vòng 88 phút. Một số báo cáo mô tả đợt bùng phát xuất bản hàng loạt chỉ diễn ra trong vỏn vẹn 19 phút . Tốc độ này cho thấy có sử dụng script xuất bản tự động chứ không phải tải lên thủ công.
Mỗi phiên bản gói bị xâm nhập đều được cấy một phụ thuộc (dependency) độc hại có tên là "easy-day-js" — một biến thể giả mạo lỗi chính tả (typosquat) của thư viện ngày tháng hợp pháp và phổ biến "dayjs" . Các nhà nghiên cứu bảo mật đã đặt tên cho chiến dịch này là "easy-day-js" .
Mã độc được thiết kế để tự động thực thi thông qua script postinstall của npm. Bất kỳ lập trình viên nào chạy npm install trên một gói bị ảnh hưởng sẽ ngay lập tức kích hoạt tải trọng mà không cần chạy bất kỳ mã ứng dụng nào .
Sau khi được thực thi, tải trọng sẽ thu thập khoá ví tiền mã hoá, thông tin đăng nhập đám mây và bí mật CI/CD từ máy trạm và hệ thống xây dựng của lập trình viên bị ảnh hưởng . Tải trọng cũng vô hiệu hoá xác minh TLS và tải xuống một bộ đánh cắp giai đoạn hai từ cơ sở hạ tầng do kẻ tấn công kiểm soát .
Vào ngày 19 tháng 6 năm 2026, Microsoft đánh giá với độ tin cậy cao rằng cuộc tấn công là công việc của Sapphire Sleet, một tác nhân nhà nước Triều Tiên chủ yếu nhắm vào lĩnh vực tài chính và tiền mã hoá. Microsoft đã trích dẫn cơ sở hạ tầng và các chiến thuật, kỹ thuật và quy trình (TTPs) phù hợp với các hoạt động Sapphire Sleet đã được ghi nhận trước đây . Amazon Threat Intelligence cũng đã liên kết Sapphire Sleet với các chiến dịch trước đó nhắm vào các gói NPM bao gồm axios, debug, chalk và typo-crypto .
Cuộc tấn công Mastra đã đẩy nhanh một số thay đổi bảo mật mà Microsoft đã phát triển từ trước. Công ty đã công bố hai thay đổi chính sách lớn nhằm loại bỏ chính xác vector thông tin đăng nhập mà Sapphire Sleet đã khai thác.
Có hiệu lực từ ngày 17 tháng 8 năm 2026, Microsoft đang giảm thời hạn tối đa của các khoá API NuGet.org mới được tạo từ 365 ngày xuống còn 30 ngày . Tất cả các khoá API được tạo trước ngày đó sẽ bị vô hiệu hoá bắt buộc vào ngày 1 tháng 11 năm 2026 .
Lý do rất rõ ràng: các khoá API tồn tại lâu dài giống như "sợi dây lỏng lẻo dễ bị mất" và đã trở thành vector tấn công chính cho việc xâm nhập chuỗi cung ứng . Một khoá bị đánh cắp cho phép kẻ tấn công có một khoảng thời gian dài để phát hành các gói bị nhiễm mã độc — chính xác những gì đã xảy ra trong vụ việc Mastra và vụ xâm nhập npm NX Console gần đây .
Microsoft đang đặc biệt khuyến nghị tất cả người bảo trì gói chuyển sang Trusted Publishing — một quy trình làm việc hiện đại được ra mắt vào tháng 9 năm 2025 thay thế các khoá API tồn tại lâu dài bằng xác thực OpenID Connect (OIDC) có thời hạn ngắn .
Các ưu điểm chính của Trusted Publishing :
Khi một quy trình CI/CD sử dụng Trusted Publishing chạy, nó sẽ yêu cầu một mã thông báo OIDC được ký bằng mật mã từ nhà cung cấp (ví dụ: GitHub Actions). NuGet.org xác thực mã thông báo đó dựa trên chính sách nhà xuất bản đã đăng ký và cấp một khoá API tạm thời, sử dụng một lần có hiệu lực chỉ cho phiên xuất bản đó .
Một số thay đổi bổ sung trong hệ sinh thái npm và quản lý gói giúp củng cố phản ứng của Microsoft:
Thu hồi mã thông báo cổ điển npm: npm đã thu hồi vĩnh viễn tất cả các mã thông báo tồn tại lâu dài cổ điển vào tháng 12 năm 2025. Lệnh npm login hiện chỉ cấp mã thông báo phiên hai giờ .
Thời hạn mã thông báo chi tiết npm: Các mã thông báo truy cập chi tiết có quyền ghi mới hiện có thời hạn mặc định 7 ngày và tối đa 90 ngày, giảm từ không giới hạn và mặc định 30 ngày .
Xuất bản theo giai đoạn (staged publishing) npm: Đã có mặt rộng rãi từ tháng 5 năm 2026, tính năng này yêu cầu người bảo trì vượt qua thử thách xác thực hai yếu tố (2FA) để phê duyệt rõ ràng một bản phát hành trước khi nó có thể được cài đặt công khai .
Các biện pháp này nhằm mục đích loại bỏ chính xác thứ mà Sapphire Sleet đã khai thác: một mã thông báo người bảo trì npm tồn tại lâu dài, được bảo vệ yếu kém duy nhất có quyền xuất bản trên toàn bộ phạm vi gói.
Hãy xoay vòng các khoá API NuGet hiện tại của bạn ngay lập tức: Nếu bạn có các khoá được tạo trước ngày 17 tháng 8 năm 2026, chúng sẽ hết hạn vào ngày 1 tháng 11 năm 2026. Hãy tạo khoá mới hoặc chuyển sang Trusted Publishing trước ngày đó .
Áp dụng Trusted Publishing càng sớm càng tốt: Xác thực dựa trên OIDC giúp loại bỏ nhu cầu lưu trữ các bí mật tồn tại lâu dài trong các đường ống CI/CD của bạn. Nó được hỗ trợ bởi NuGet.org, npm và PyPI .
Xem xét lại các quy trình xuất bản npm của bạn: npm hiện sử dụng mã thông báo phiên ngắn hạn, mã thông báo chi tiết với thời hạn giới hạn và xuất bản theo giai đoạn. Đảm bảo các đường ống CI/CD của bạn được cập nhật để sử dụng một trong các phương pháp xác thực được hỗ trợ này .
Cố định phiên bản gói và tránh nâng cấp phụ thuộc tự động: Đặc biệt đối với cơ sở hạ tầng quan trọng, việc cố định các phiên bản đã được xác minh là tốt có thể ngăn chặn việc vô tình đưa vào các gói bị xâm nhập .
Vô hiệu hoá thực thi script tự động khi cài đặt gói: Chạy npm install --ignore-scripts (hoặc đặt ignore-scripts = true trên toàn cầu) có thể ngăn chặn các script postinstall độc hại thực thi .