Cảnh báo: Crate Rust arrayref bị xâm nhập, phát tán mã độc trong quá trình biên dịch

20 tháng 8, 2026·6 phút đọc

Một phiên bản bị xâm nhập của crate arrayref phổ biến trên crates.io đã âm thầm thêm mã độc vào quá trình biên dịch, đánh cắp dữ liệu thông qua việc tải và thực thi file nhị phân từ xa. Sự cố này nhấn mạnh rủi ro bảo mật chuỗi cung ứng phần mềm ngày càng gia tăng, đặc biệt là đối với các thư viện mã nguồn mở được sử dụng rộng rãi.

Cảnh báo: Crate Rust arrayref bị xâm nhập, phát tán mã độc trong quá trình biên dịch

Cảnh báo: Crate Rust arrayref bị xâm nhập, phát tán mã độc trong quá trình biên dịch

Một sự cố bảo mật nghiêm trọng vừa được phát hiện trong hệ sinh thái Rust. Các phiên bản bị xâm nhập của crate arrayref phổ biến đã được tải lên crates.io, chứa mã độc được kích hoạt ngay khi dự án của bạn được biên dịch. Sự việc này cho thấy mối đe dọa ngày càng tinh vi đối với chuỗi cung ứng phần mềm mã nguồn mở.

Sự cố xảy ra vào ngày 20 tháng 8 năm 2026, khi một phiên bản bị xâm nhập của crate arrayref xuất hiện trên crates.io. Phiên bản 0.3.10 này đã thêm một dependency độc hại có tên là proc-macro1 — một crate giả mạo được thiết kế để lừa các nhà phát triển. Khi một dự án sử dụng arrayref phiên bản xấu này được biên dịch, script xây dựng (build script) của proc-macro1 sẽ âm thầm tải và chạy một file nhị phân từ xa trên máy của lập trình viên.

Các gói phần mềm liên quan

  • arrayref 0.3.10: Phiên bản bị xâm nhập, được tải lên bởi tài khoản droundy (đã bị chiếm quyền). Đã bị gỡ bỏ.
  • proc-macro1 (tất cả các phiên bản): Crate giả mạo, được tải lên bởi tài khoản dtolney giả dạng nhà phát triển nổi tiếng David Tolnay (dtolnay). Toàn bộ crate đã bị gỡ bỏ.
  • append-only-vec 0.1.9: Cũng bị đánh dấu là độc hại, liên quan đến cùng một tác nhân.

Lưu ý: proc-macro1 không phải là proc-macro2 — crate thật mà các tác giả macro thường sử dụng. Mã nguồn của proc-macro1 là một bản sao nguyên vẹn của proc-macro2, do đó quá trình biên dịch vẫn diễn ra bình thường, khiến mã độc khó bị phát hiện.

Cơ chế hoạt động của mã độc

Điểm xâm nhập

arrayref vốn là một crate nhỏ, chỉ chứa bốn macro, không có dependency cho đến phiên bản 0.3.9. Phiên bản 0.3.10 giữ nguyên mã nguồn nhưng thêm một dòng dependency trong tệp Cargo.toml:

[dependencies.proc-macro1]
version = "1.0.107"

Chỉ một dòng này đã đủ khiến Cargo tải về và biên dịch proc-macro1 mỗi khi dự án sử dụng arrayref. Ngay cả khi mã nguồn không trực tiếp gọi đến proc-macro1, Cargo vẫn biên dịch tất cả các dependency được khai báo.

Script xây dựng độc hại

Phần lõi của mã độc nằm trong script xây dựng (build.rs) của proc-macro1 phiên bản 1.0.107. Script này:

  1. Che giấu địa chỉ máy chủ: Mã độc lưu trữ địa chỉ máy chủ dưới dạng các mảnh base64 và ghép chúng lại trong quá trình biên dịch, khiến cho việc phát hiện bằng các công cụ quét mã đơn giản trở nên khó khăn.
  2. Tải file nhị phân: Script kết nối đến máy chủ 23[.]254[.]165[.]112:9089 qua một kết nối TLS không xác thực chứng chỉ, cho phép chấp nhận mọi chứng chỉ, kể cả chứng chỉ tự ký.
  3. Thực thi không đồng bộ: Tùy thuộc vào hệ điều hành, file nhị phân được tải về sẽ được lưu và chạy ở các vị trí khác nhau:
    • Unix: Lưu tại /tmp/rust-setup và chạy ở chế độ nền.
    • Windows: Lưu script PowerShell tại %TEMP%\rust-setup.ps1 và được khởi chạy ẩn thông qua một script VBScript.

Cách thức lây lan

Một chi tiết đặc biệt nguy hiểm là tài khoản bị chiếm quyền đã thu hồi (yank) các phiên bản cũ hơn của arrayref (từ 0.3.5 đến 0.3.9). Việc thu hồi này khiến Cargo hiển thị cảnh báo khuyến khích nhà phát triển cập nhật lên phiên bản mới nhất, tức phiên bản độc hại 0.3.10. Đây là một chiến thuật tấn công tinh vi, lợi dụng chính công cụ quản lý gói để phát tán mã độc.

Mô tả về cuộc tấn công chuỗi cung ứngMô tả về cuộc tấn công chuỗi cung ứng

Chỉ số nhận diện sự xâm nhập (IoC)

Nếu bạn nghi ngờ hệ thống của mình bị ảnh hưởng, hãy kiểm tra các dấu hiệu sau:

LoạiChỉ sốChi tiết
Mạng23.254.165.112:9089Máy chủ tải payload (HTTPS)
Mạng23.254.165.112:443Máy chủ C2, được truyền cho payload như đối số đầu tiên
File (Unix)/tmp/rust-setupFile thực thi được tải về
File (Windows)%TEMP%\rust-setup.ps1Script PowerShell được tải về
File (Windows)%TEMP%\rust-setup-launch.vbsScript launcher VBScript
Stage 2rust-crate_0.1.0, _0.2.0, _0.3.0, _0.4.0Tên file nhị phân tùy thuộc vào OS và kiến trúc

Ảnh hưởng và khuyến nghị cho cộng đồng Rust tại Việt Nam

arrayref là một crate rất phổ biến, được sử dụng gián tiếp (transitive dependency) qua nhiều thư viện lớn khác như tiny-skia, sctk-adwaita, và winit. Điều này có nghĩa là hầu hết các dự án GUI xây dựng trên egui, eframe, hay iced đều có khả năng bị ảnh hưởng. Crate này đã có hơn 245 triệu lượt tải trong lịch sử, cho thấy mức độ phổ biến rất lớn.

Cộng đồng phát triển phần mềm tại Việt Nam, đặc biệt là các nhóm đang phát triển ứng dụng desktop hoặc nhúng, cần kiểm tra ngay các dự án có sử dụng các thư viện nói trên.

Cảnh báo bảo mật chuỗi cung ứngCảnh báo bảo mật chuỗi cung ứng

Các bước cần thực hiện ngay:

  • Không cập nhật lên phiên bản arrayref 0.3.10 và kiểm tra ngay Cargo.lock (tệp khóa phiên bản) của dự án để xem có dính arrayref 0.3.10 hoặc proc-macro1 hay không.
  • Nếu đã lỡ biên dịch một dự án có chứa mã độc, hãy quét hệ thống để tìm các file rust-setup (trên Unix) hoặc rust-setup.ps1 (trên Windows).
  • Xoay vòng (rotate) tất cả các khóa bí mật (API keys, SSH keys, mật khẩu) lưu trên máy bị ảnh hưởng.
  • Theo dõi các hoạt động mạng bất thường đến từ các địa chỉ IP đã nêu.
  • Luôn kiểm tra kỹ lưỡng các dependency mới trước khi thêm vào dự án, đặc biệt là các gói có tên gần giống với các gói nổi tiếng (typosquatting).

Sự cố này là một lời nhắc nhở mạnh mẽ rằng ngay cả những crate phổ biến, được tin dùng nhất cũng có thể trở thành mục tiêu tấn công. Việc sử dụng các công cụ quét bảo mật tự động và kiểm tra thường xuyên Cargo.lock là vô cùng quan trọng trong quy trình phát triển phần mềm hiện đại.

Kết thúc bài viếtKết thúc bài viết

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗