Cuộc tấn công chuỗi cung ứng Rust cài cắm mã độc vào các Crate có 245 triệu lượt tải

Dự án Rust đã xóa các phiên bản độc hại của ba crate Rust phổ biến khỏi crates.io sau khi một tài khoản maintainer bị chiếm quyền, phát tán các bản phát hành chứa phụ thuộc typosquatted có khả năng thực thi mã độc trong quá trình biên dịch. Các phiên bản bị ảnh hưởng gồm arrayref 0.3.10, internment 0.8.7 và append-only-vec 0.1.9.
Rust Supply Chain Attack

Dự án Rust đã xóa các phiên bản độc hại của ba crate Rust được sử dụng rộng rãi khỏi crates.io sau khi một tài khoản maintainer bị chiếm dụng đã công bố các bản phát hành mới. Các bản phát hành này bí mật thêm vào một phụ thuộc typosquatted (giả mạo tên), trong đó build script của nó sẽ tải xuống và thực thi một payload từ xa ngay trong quá trình biên dịch.

Các phiên bản bị ảnh hưởng bao gồm arrayref 0.3.10, internment 0.8.7, và append-only-vec 0.1.9. Tất cả đều được xuất bản từ cùng một tài khoản chủ sở hữu vào ngày 20 tháng 8 năm 2026 và đã bị gỡ bỏ trong khoảng từ 86 đến 107 phút sau đó.

Vì mã độc nằm trong build script của phụ thuộc được tiêm vào, việc build một project có chứa các crate này là đủ để kích hoạt payload, ngay cả khi không có hàm nào từ các crate đó được gọi.

Các nhà phát triển được khuyến cáo nên tìm kiếm trong thư mục ~/.cargo/registry/cache các tệp crate đã bị xóa và ghim phiên bản arrayref ở mức 0.3.9 hoặc thấp hơn, sau khi Rust Security Response Team đã khôi phục (unyanked) các phiên bản bị rút lại một cách ác ý trong quá trình ứng phó.

Hiện tại không có phiên bản vá lỗi chính thức, chưa có mã định danh CVE nào được chỉ định, và các khuyến nghị từ RustSec cho cả ba crate đều ghi nhận không có bằng chứng cho thấy bất kỳ phiên bản độc hại nào đã được sử dụng thành công trên diện rộng.

"Một phiên bản mới của crate arrayref đã được xuất bản với phụ thuộc trực tiếp vào proc-macro1, thứ sẽ thực thi một build script độc hại. Phiên bản bị xâm nhập này được xuất bản vào ngày 20-08-2026 và bị xóa sau khoảng 86 phút, không có bằng chứng về việc sử dụng thực tế," thông báo RUSTSEC-2026-0260 cho biết.

Phân tích kỹ thuật cuộc tấn công

Rust Security Response Team cho biết họ nhận được báo cáo về việc crate proc-macro1 là độc hại vào lúc 07:15 UTC ngày 20 tháng 8 và đã xác nhận crate này chứa một build script tải xuống payload độc hại. Nhóm nghiên cứu tại Nextron Systems GmbH là đơn vị đầu tiên phát hiện và báo cáo vụ việc.

"Chúng tôi không tin rằng tác giả của arrayref có ý đồ xấu, nhưng máy tính hoặc thông tin đăng nhập của họ có khả năng đã bị chiếm quyền kiểm soát, và chúng tôi đang cố gắng liên lạc với họ," Rust Security Response Team tuyên bố.

Thông qua crates.io API, chủ sở hữu duy nhất được liệt kê của arrayref là người dùng David Roundy, đăng ký từ tháng 10 năm 2009. Hiện tại, cách thức tài khoản này bị xâm nhập vẫn chưa được tiết lộ.

Các phiên bản độc hại đã bị xóa:

  • [email protected]: xuất bản lúc 07:15:00Z, xóa lúc 08:41:40Z (tồn tại 86 phút).
  • [email protected]: xuất bản lúc 07:34:07Z, xóa lúc 09:04:11Z (tồn tại 90 phút).
  • [email protected]: xuất bản lúc 07:37:49Z, xóa lúc 09:25:24Z (tồn tại 107 phút).
  • Bất kỳ phiên bản nào của: proc-macro1, proc-macro-en, aovine, arone, aronenao, và tinymember.

Cơ chế lây nhiễm và thực thi

Mỗi bản phát hành bị xâm nhập đều thêm một dòng duy nhất vào manifest của nó: một phụ thuộc vào proc-macro1, một tên miền giả mạo (typosquat) của crate proc-macro2 cực kỳ phổ biến. Mã nguồn thư viện của proc-macro1 là một bản sao thực của proc-macro2, giúp quá trình build hoàn tất bình thường mà không gây nghi ngờ.

Tuy nhiên, build script sẽ lắp ghép địa chỉ host của payload và máy chủ điều khiển (C2) từ các đoạn mã base64 tại thời điểm build. Sau đó, nó cài đặt một trình xác thực chứng chỉ tùy chỉnh để bỏ qua kiểm tra TLS, cho phép kết nối không an toàn. Nó chọn một trong bốn payload tùy thuộc vào hệ điều hành và kiến trúc CPU.

  • Trên Unix và macOS: Nó ghi các byte vào /tmp/rust-setup, cấp quyền thực thi và chạy độc lập với địa chỉ C2 là đối số đầu tiên.
  • Trên Windows: Nó ghi một tập lệnh PowerShell vào thư mục %TEMP%, chạy ẩn thông qua trình khởi chạy VBScript dưới wscript.exe, sau đó thoát khỏi quy trình con để Cargo không phải chờ đợi.

Chiến thuật phân phối dựa trên việc tài khoản chủ sở hữu đã "yank" (rút lại) các phiên bản arrayref từ 0.3.5 đến 0.3.9 cùng lúc với việc xuất bản bản độc hại. Điều này khiến Cargo đưa ra cảnh báo "hãy cân nhắc cập nhật lên phiên bản không bị yank", dẫn dụ người dùng nâng cấp lên bản 0.3.10 độc hại.

Phạm vi ảnh hưởng và các mối liên hệ

Dữ liệu từ crates.io API cho thấy arrayref có hơn 245 triệu lượt tải xuống mọi thời đại và 403 crate khác phụ thuộc vào nó. Các thư viện lớn như winit, tiny-skia đều nằm trong chuỗi phụ thuộc này. Ngay sau khi phát hiện, các dự án như blake3, blake2b_simdblake2s_simd đã nhanh chóng loại bỏ phụ thuộc vào arrayref trong các bản cập nhật mới.

Theo phân tích từ Wiz, mã độc giai đoạn 2 (stage-2) liên lạc qua HTTPS POST, duy trì sự hiện diện thông qua Registry Run key (Windows), LaunchAgent (macOS) và systemd (Linux). Nó có khả năng đánh cắp thông tin đăng nhập trình duyệt từ Chrome, Brave và Edge bằng cách truy vấn cơ sở dữ liệu SQLite.

Các chỉ số thỏa hiệp (IoCs):

  • Mạng: 23.254.165.112:9089 (payload host), 23.254.165.112:443 (C2), hwsrv-798836.hostwindsdns.com
  • Tệp tin: /tmp/rust-setup, %TEMP%\rust-setup.ps1, %TEMP%\rust-setup-launch.vbs
  • Mã máy: rust-crate_0.1.0, _0.2.0, _0.3.0, _0.4.0
  • Tài khoản: dtolney (mạo danh), droundy (chính chủ, bị xâm nhập)
  • Email: [email protected] (giả mạo siêu dữ liệu tác giả)

Wiz cho biết cơ sở hạ tầng này có sự trùng lặp đáng kể với các cuộc tấn công chuỗi cung ứng gần đây của Triều Tiên, như vụ xâm nhập Mastra npm và axios. Microsoft quy kết hoạt động của Mastra cho Sapphire Sleet, trong khi Google (GTIG) quy kết vụ axios cho tác nhân MIDNIGHT NEPTUNE (UNC1069).

Hiện tại, Cargo vẫn chưa có cơ chế "cooling windows" để trì hoãn các phụ thuộc mới xuất bản, mặc dù một đề xuất tương tự đã bước vào giai đoạn bình luận cuối cùng ngay trước khi cuộc tấn công xảy ra.