Các nhà nghiên cứu an ninh mạng đã cảnh báo về một cuộc tấn công chuỗi cung ứng phần mềm (software supply chain attack) mới mang mã hiệu SleeperGem nhắm vào hệ sinh thái Ruby. Cuộc tấn công này được phát hiện sau khi ba gem độc hại được đăng tải lên RubyGems với mục đích cuối cùng là cung cấp thêm các payload phụ.
Danh sách các gem độc hại được liệt kê dưới đây:
- git_credential_manager (phiên bản 2.8.0, 2.8.1, 2.8.2, 2.8.3) - Xuất bản ngày 18 tháng 7 năm 2026
- Dendreo (phiên bản 1.1.3, 1.1.4) - Xuất bản ngày 14 tháng 10 năm 2017
- fastlane-plugin-run_tests_firebase_testlab (phiên bản 0.3.2) - Xuất bản ngày 06 tháng 2 năm 2018
"Mỗi bản phát hành độc hại là một loader," StepSecurity cho biết trong một bản phân tích. "Nó lấy giai đoạn thứ hai từ một máy chủ Forgejo do kẻ tấn công kiểm soát, kiểm tra xem nó có đang chạy trong một build system hay không và sẽ bỏ qua nếu đúng như vậy. Trên máy tính của nhà phát triển, nó sẽ thả một native daemon và cài đặt persistence."
Một khía cạnh đáng chú ý của cuộc tấn công là "git_credential_manager" giả mạo Microsoft Git Credential Manager chính thức, trong khi hai gem còn lại đã không hoạt động trong nhiều năm trước khi nhận được các bản cập nhật độc hại. "Dendreo" được cập nhật lần cuối vào ngày 24 tháng 10 năm 2020 và "fastlane-plugin-run_tests_firebase_testlab" đã không hoạt động kể từ ngày 9 tháng 3 năm 2019 cho đến khi các phiên bản mới xuất hiện.
Một đặc điểm nhận dạng khác là các phiên bản này được xuất bản trực tiếp lên registry mà không có bất kỳ commit hoặc tag tương ứng nào trong các dự án nguồn.
Điều thú vị là "git_credential_manager" đã được thêm làm dependency cho năm gói khác, bao gồm "Dendreo" và "fastlane-plugin-run_tests_firebase_testlab", cho phép payload độc hại lây lan sang những người dùng hiện tại của các gói này:
- Dendreo
- fastlane-plugin-run_tests_firebase_testlab
- slackHtmlToMarkdown
- seo_optimizer
- array_fast_methods
Tất cả các gói nói trên, ngoại trừ "fastlane-plugin-run_tests_firebase_testlab", đều được duy trì bởi cùng một tài khoản ("LR-DEV"). Việc gem này thuộc về một người duy trì khác ("pinkroom") cho thấy có khả năng nhiều tài khoản đã bị xâm nhập để đẩy các phiên bản độc hại lên RubyGems.
Sau khi được cài đặt, malware nhúng trong các gói này sẽ quét hệ thống bị nhiễm để tìm khoảng 30 biến môi trường (environment variables), bao gồm các biến liên quan đến GitHub Actions, GitLab, CircleCI, Travis, Jenkins và Vercel. Nếu phát hiện thấy bất kỳ biến nào trong số đó, nó sẽ ngay lập tức thoát ra. Việc kiểm tra này được đánh giá là một nỗ lực cố ý nhằm tránh chạy trên các ephemeral CI runners và đảm bảo nó được thực thi trên máy tính của nhà phát triển.
Trong trường hợp của "git_credential_manager", mã độc sẽ được kích hoạt khi thư viện được gọi (required), khiến nó tải xuống hai payload từ một instance Forgejo công cộng ("git.disroot[.]org/git-ecosystem"): một shell script ("deploy.sh") và một binary gốc có cùng tên với công cụ mà gem đang giả mạo. Trên Windows, payload tải về sẽ được thực thi thông qua PowerShell.
Trong khi phiên bản 2.8.2 chỉ chuẩn bị các payload, phiên bản 2.8.3 của gem đã chuyển sang giai đoạn tiếp theo của cuộc tấn công. Điều này bao gồm việc sử dụng tập lệnh cài đặt để khởi chạy binary dưới dạng background daemon, sau đó thiết lập persistence bằng cách sử dụng một mục nhập cron và một dịch vụ người dùng systemd, đồng thời truy vấn các nhóm sudo và wheel.
"Nếu người dùng có thể chạy sudo mà không cần mật khẩu, tập lệnh sẽ tự chạy lại dưới quyền root, và khi chạy dưới quyền root, nó sẽ đặt một bản sao setuid root của shell hệ thống tại một đường dẫn được chọn để mô phỏng một tiện ích mạng," StepSecurity cho biết.
Người dùng đã cài đặt bất kỳ gem nào nói trên được khuyến cáo nên coi máy tính và các bí mật (secrets) liên quan là đã bị xâm nhập. Khuyến nghị xóa daemon tại "~/.local/share/gcm/", xóa các phương thức persistence, kiểm tra setuid shell tại "/usr/local/sbin/ping6" và thay đổi (rotate) tất cả thông tin đăng nhập.
"Một tài khoản RubyGems đã im hơi lặng tiếng trong sáu hoặc bảy năm dường như không có rủi ro đối với bất kỳ ai," nhà nghiên cứu Charlie Eriksen của Aikido Security cho biết. "Đó chính xác là loại tài khoản đáng để chiếm đoạt. Đó là nguồn gốc của cái tên SleeperGem: không phải là một tài sản của kẻ tấn công được cài cắm lâu dài, mà là một tài khoản thực tế, bình thường đã ngủ đông và trông đủ vô hại để chiếm quyền điều khiển mà không ai nhận ra."
RubyGems đóng vai trò là Dead Drop để trích xuất dữ liệu
Tiết lộ này được đưa ra hơn hai tháng sau khi RubyGems tạm dừng việc đăng ký tài khoản mới sau khi những kẻ xấu đẩy hàng chục gói độc hại như một phần của chiến dịch phát tán thư rác có phối hợp. Cùng thời điểm đó, các nhà nghiên cứu của Socket đã gắn cờ một chiến dịch song song làm tràn ngập registry với 150 gem lạm dụng chúng như một kênh trích xuất dữ liệu.
Đầu tháng này, Mend.io đã tiết lộ chi tiết về một cuộc tấn công chuỗi cung ứng phần mềm chưa từng được ghi nhận, sử dụng một bộ 14 gói RubyGems khác để lưu trữ dữ liệu thông tin đăng nhập bị đánh cắp.
Cụ thể, một tiện ích mở rộng trình duyệt độc hại đã được tìm thấy là thu thập thông tin đăng nhập thông qua một API có thể truy cập cục bộ, đóng gói thông tin vào các tệp .gem hợp lệ hoàn toàn bên trong trình duyệt bằng JavaScript và các Web APIs tiêu chuẩn, sau đó tải các gói đó trực tiếp lên RubyGems.org bằng mã API key RubyGems được mã hóa cứng.
"Dữ liệu thu được bao gồm mật khẩu văn bản thuần túy, khóa riêng SSH, thông tin đăng nhập AWS, các cụm từ hạt giống (seed phrases) của ví tiền điện tử, số An sinh xã hội, số thẻ tín dụng và chi tiết tài khoản ngân hàng trên 63 mục lưu trữ," Maciej Mensfeld nói.
"RubyGems không phải là cơ chế phân phối ở đây. Nó là dead drop: một tên miền tin cậy, có lưu lượng truy cập cao, nơi dữ liệu bị đánh cắp nằm đó cho đến khi kẻ tấn công quay lại lấy, ẩn mình giữa những bản tải lên thông thường của các nhà phát triển."