Nguy hiểm: Tấn công chuỗi cung ứng & mã độc ForceMemo chiếm quyền GitHub

Một chiến dịch mã độc mới, được theo dõi dưới tên ForceMemo, đang âm thầm xâm nhập hàng trăm tài khoản GitHub. Các tài khoản này sau đó được sử dụng để tiêm mã độc hại ẩn vào các kho lưu trữ Python, để lại rất ít dấu vết rõ ràng. Đây là một tấn công chuỗi cung ứng tinh vi nhắm vào cộng đồng phát triển.
Những trường hợp lây nhiễm sớm nhất được xác nhận có từ ngày 8 tháng 3 năm 2026. Chiến dịch này vẫn đang hoạt động mạnh mẽ, với nhiều kho lưu trữ mới bị ảnh hưởng mỗi ngày.
Tổng quan về Chiến dịch ForceMemo
Cuộc tấn công ForceMemo nhắm mục tiêu vào một loạt các dự án Python, bao gồm các ứng dụng web Django, mã nghiên cứu học máy, bảng điều khiển Streamlit, API Flask và các gói có thể cài đặt bằng pip.
Tác nhân đe dọa chèn mã độc hại đã bị che giấu vào các tệp Python được sử dụng rộng rãi như setup.py, main.py và app.py.
Bất kỳ nhà phát triển nào cài đặt gói trực tiếp từ một kho lưu trữ bị xâm nhập, hoặc sao chép và chạy mã bị ảnh hưởng, đều vô tình kích hoạt mã độc ForceMemo trên máy của họ.
Phương thức lây nhiễm và tác động ban đầu
Các nhà nghiên cứu của StepSecurity là những người đầu tiên xác định và công khai báo cáo về chiến dịch này. Họ đã đặt tên là ForceMemo dựa trên hai đặc điểm kỹ thuật nổi bật nhất của nó: sử dụng lệnh Git force-push để âm thầm ghi đè lịch sử kho lưu trữ và sử dụng giao dịch memo của blockchain Solana làm kênh chỉ huy và kiểm soát (C2).
Chiến dịch này đang trở thành một trong những tấn công chuỗi cung ứng phổ biến nhất nhắm vào hệ sinh thái Python trong những tháng gần đây.
Phân tích kỹ thuật Chi tiết Cuộc Tấn công
Hàng trăm kho lưu trữ Python trên hàng trăm tài khoản GitHub đã được xác nhận nhiễm cùng một loại mã độc. Con số này vẫn tiếp tục tăng lên, cho thấy quy mô và mức độ nghiêm trọng của mối đe dọa mạng này.
Nguồn gốc chiếm quyền tài khoản (GlassWorm Infostealer)
Nguồn gốc của việc chiếm quyền điều khiển GitHub đã được truy vết đến GlassWorm, một loại infostealer riêng biệt. GlassWorm lây lan thông qua các tiện ích mở rộng Visual Studio Code (VS Code) và Cursor độc hại.
Payload giai đoạn ba của GlassWorm chứa một module chuyên dụng để thu thập các mã thông báo GitHub (GitHub tokens). Các mã thông báo này được lấy từ bộ nhớ tiện ích mở rộng VS Code, trình quản lý thông tin đăng nhập Git và biến môi trường GITHUB_TOKEN.
Một khi bị đánh cắp, những thông tin đăng nhập này trao cho kẻ tấn công toàn quyền kiểm soát để ghi đè các kho lưu trữ của nhà phát triển. Điều này trực tiếp dẫn đến nguy cơ hệ thống bị xâm nhập một cách nghiêm trọng.
Các tài khoản như BierOne, wecode-bootcamp-korea và HydroRoll-Team mỗi tài khoản có sáu kho lưu trữ bị xâm phạm. Điều này cho thấy một thông tin đăng nhập bị đánh cắp có thể phơi bày toàn bộ tài khoản nhà phát triển như thế nào.
Kỹ thuật che giấu và Force-Push Git
Thay vì mở một pull request hoặc tạo một commit mới hiển thị, kẻ tấn công sử dụng một phương pháp tinh vi và âm thầm hơn. Phương pháp này đóng vai trò quan trọng trong việc thực hiện tấn công chuỗi cung ứng.
Kẻ tấn công lấy commit hợp lệ gần nhất trên nhánh mặc định, chèn mã độc đã được che giấu vào một tệp Python quan trọng, sau đó sử dụng lệnh force-push để đẩy commit đã sửa đổi trở lại kho lưu trữ.
Thông báo commit gốc, tên tác giả và ngày tác giả đều được giữ nguyên. Điều này khiến cho dường như không có gì thay đổi, gây khó khăn cho việc phát hiện các hành vi xâm nhập trái phép.
Dấu hiệu duy nhất của sự giả mạo là sự không khớp giữa ngày tác giả gốc và ngày committer thực tế, với khoảng cách dao động từ chín tháng đến chín năm trong các kho lưu trữ bị ảnh hưởng.
Email của committer cũng được đặt nhất quán là chuỗi "null". Đây dường như là một dấu vân tay của công cụ mà kẻ tấn công sử dụng.
Ví dụ, một trường hợp được ghi nhận là lệnh force-push đã thay thế một commit sạch vào ngày 10 tháng 3 năm 2026, lúc 21:58 UTC. Đây là một ví dụ điển hình về cách mã độc ForceMemo hoạt động.
Cơ chế hoạt động của Mã độc ForceMemo
Payload được chèn sử dụng ba lớp che giấu để tránh bị phát hiện: giải mã base64, giải nén zlib và giải mã XOR với khóa là 134.
Trước khi thực hiện bất kỳ hành động nào khác, mã độc sẽ kiểm tra xem hệ thống bị nhiễm có sử dụng ngôn ngữ hoặc múi giờ tiếng Nga hay không. Nếu có, nó sẽ ngừng thực thi hoàn toàn. Đây là một thực tiễn hoạt động phổ biến trong các nhóm tội phạm mạng.
Khi mã độc chạy, nó sẽ liên hệ với một ví blockchain Solana để lấy các lệnh tiếp theo. Cơ chế này giúp mã độc ForceMemo duy trì kết nối C2 một cách bền vững.
Vì dữ liệu blockchain không thể bị xóa hoặc kiểm duyệt, kẻ tấn công có thể đăng các URL payload cập nhật bất cứ lúc nào thông qua các memo trên chuỗi. Điều này làm cho cơ sở hạ tầng trở nên miễn nhiễm với các nỗ lực gỡ bỏ.
Mã độc cũng truy vấn chín điểm cuối RPC Solana riêng biệt làm phương án dự phòng, đảm bảo tính liên tục của kênh C2.
Chỉ dẫn Nhận diện và Biện pháp Khắc phục
Để bảo vệ hệ thống khỏi mã độc ForceMemo và giảm thiểu rủi ro bảo mật từ các tấn công chuỗi cung ứng tương tự, cần thực hiện các bước kiểm tra và phòng ngừa cụ thể.
Dấu hiệu nhận biết trên hệ thống phát triển
Các nhà phát triển nên tìm kiếm biến đánh dấu lzcdrtfxyqiplpd trong các tệp Python đã clone. Đây là một chỉ số mạnh mẽ của sự lây nhiễm.
grep -r "lzcdrtfxyqiplpd" .Kiểm tra sự hiện diện của tệp ~/init.json trong thư mục chính của người dùng. Sự xuất hiện bất ngờ của tệp này là một dấu hiệu cảnh báo.
ls -la ~/init.jsonTìm kiếm một thư mục node-v22.9.0 không mong muốn. Thư mục này cho thấy mã độc đã triển khai trình chạy payload của nó.
ls -la ~/node-v22.9.0Kiểm tra kho lưu trữ GitHub
Người duy trì kho lưu trữ nên xác nhận rằng nhánh mặc định của họ khớp với commit hợp lệ cuối cùng đã biết. Điều này giúp phát hiện các thay đổi không được ủy quyền.
git log --pretty=format:"%H %an %ae %ad %cn %ce %cd" -1Cần đặc biệt chú ý đến bất kỳ sự không khớp nào giữa ngày tác giả (author date) và ngày committer (committer date) trong các log gần đây. Sự chênh lệch này là dấu hiệu chính của một vụ xâm nhập mạng thông qua force-push.
Tham khảo thêm thông tin chi tiết về chiến dịch ForceMemo tại: StepSecurity Blog.







