Tác giả: Joker&Thinking
Đầu tháng 7 năm 2025, nhóm bảo mật SlowMist nhận được yêu cầu trợ giúp từ một người dùng là nạn nhân, yêu cầu hỗ trợ phân tích nguyên nhân khiến tài sản được mã hóa của anh ta bị đánh cắp. Cuộc điều tra phát hiện ra rằng sự cố bắt nguồn từ việc người dùng này sử dụng một dự án mã nguồn mở zldp2002/solana-pumpfun-bot được lưu trữ trên GitHub, từ đó dẫn đến một vụ trộm tiền điện tử bí mật. Để biết chi tiết, hãy xemCông cụ Solana phổ biến của GitHub chứa các bẫy trộm tiền điện tử ẩn.
Gần đây, một người dùng khác đã sử dụng một dự án mã nguồn mở tương tự - audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot, dẫn đến việc đánh cắp tài sản được mã hóa và đã liên hệ với nhóm bảo mật SlowMist. Để phản hồi, nhóm đã phân tích sâu hơn phương thức tấn công.
Quy trình phân tích
Phân tích tĩnh
Trước tiên, chúng tôi sử dụng phân tích tĩnh để tìm ra các bẫy do kẻ tấn công đặt ra. Sau khi phân tích, người ta phát hiện ra rằng mã đáng ngờ nằm trong tệp cấu hình /src/common/config.rs, chủ yếu tập trung ở phương thức create_coingecko_proxy(): Từ mã, có thể thấy rằng phương thức create_coingecko_proxy() đầu tiên gọi import_wallet(), sau đó gọi import_env_var() để lấy khóa riêng.

Trong phương thức import_env_var(), nó chủ yếu được sử dụng để lấy thông tin cấu hình biến môi trường trong tệp .env.
Trong quá trình gọi, nếu biến môi trường tồn tại, nó sẽ trả về trực tiếp; nếu không tồn tại, nó sẽ nhập nhánh Err(e) và in ra thông báo lỗi. Do tồn tại vòng lặp {} không có điều kiện thoát, tài nguyên sẽ tiếp tục bị tiêu thụ.

PRIVATE_KEY(khóa riêng tư) và các thông tin nhạy cảm khác cũng được lưu trữ trong tệp .env.

Quay lại phương thức import_wallet(), khi import_env_var() được gọi để lấy PRIVATE_KEY (khóa riêng), mã độc sẽ xác định độ dài của khóa riêng:
Sau đó, mã độc sử dụng Arc để đóng gói thông tin khóa riêng nhằm hỗ trợ chia sẻ đa luồng.

Quay lại phương thức create_coingecko_proxy(), sau khi lấy được thông tin khóa riêng thành công, mã độc sẽ giải mã địa chỉ URL độc hại.

Phương pháp này trước tiên lấy hằng số được mã hóa cứng của HELIUS_PROXY đã mã hóa (địa chỉ máy chủ của kẻ tấn công).

Sau đó, mã độc giải mã HELIUS_PROXY (địa chỉ máy chủ của kẻ tấn công) bằng bs58, chuyển đổi kết quả đã giải mã thành một mảng byte và tiếp tục chuyển đổi mảng byte thành chuỗi UTF-8 thông qua from_utf8().
Bằng cách viết một tập lệnh, địa chỉ thực của HELIUS_PROXY sau khi giải mã có thể được khôi phục như sau:

Sau khi giải mã thành công URL (http://103.35.189.28:5000/api/wallets), mã độc trước tiên tạo một máy khách HTTP và chuyển đổi thông tin khóa riêng tư thu được thành chuỗi Base58 bằng cách sử dụng to_base58_string().
Sau đó, mã độc sẽ xây dựng một thân yêu cầu JSON và đóng gói thông tin khóa riêng đã chuyển đổi trong đó, đồng thời gửi khóa riêng và dữ liệu khác đến máy chủ được trỏ đến bởi URL ở trên bằng cách xây dựng một yêu cầu POST, đồng thời bỏ qua kết quả phản hồi.
Bất kể máy chủ trả về kết quả gì, mã độc sẽ tiếp tục chạy để tránh sự chú ý của người dùng.

Ngoài ra, phương thức create_coingecko_proxy() cũng chứa các hàm thông thường như lấy giá để che giấu hành vi độc hại của nó; Bản thân tên của phương thức cũng đã được ngụy trang và có phần gây nhầm lẫn.

Qua phân tích, có thể thấy rằng phương thức create_coingecko_proxy() được gọi khi ứng dụng khởi động, cụ thể là trong giai đoạn khởi tạo tệp cấu hình của phương thức main() trong main.rs.

Trong phương thức new() của tệp cấu hình src/common/config.rs, mã độc trước tiên sẽ tải tệp .env rồi gọi phương thức create_coingecko_proxy().

Theo phân tích, địa chỉ IP của máy chủ nằm ở Hoa Kỳ.

(https://www.virustotal.com/gui/ip-address/103.35.189.28)
Người ta nhận thấy rằng dự án đã được cập nhật trên GitHub gần đây (ngày 17 tháng 7 năm 2025) và những thay đổi chính tập trung vào tệp cấu hình config.rs trong thư mục src.

Trong tệp src/common/config.rs, bạn có thể thấy mã hóa địa chỉ gốc của HELIUS_PROXY (địa chỉ máy chủ của kẻ tấn công) đã được thay thế bằng mã hóa mới.

Sau khi sử dụng tập lệnh để giải mã mã hóa địa chỉ gốc, có thể lấy được địa chỉ máy chủ gốc.

Phân tích động
Để quan sát trực quan hơn quá trình đánh cắp mã độc, chúng tôi đã sử dụng phương pháp phân tích động và viết một tập lệnh Python để tạo cặp khóa công khai và riêng tư Solana để thử nghiệm.

Đồng thời, chúng tôi xây dựng một máy chủ HTTP trên máy chủ có thể nhận các yêu cầu POST.

Viết một tập lệnh Python để tạo mã tương ứng với máy chủ thử nghiệm và thay thế mã này bằng mã địa chỉ máy chủ độc hại do kẻ tấn công ban đầu đặt, tức là HELIUS_PROXY (địa chỉ máy chủ của kẻ tấn công).

Sau đó, thay thế PRIVATE_KEY (khóa riêng tư) trong tệp .env bằng khóa riêng tư thử nghiệm vừa được tạo.

Tiếp theo, hãy khởi chạy mã độc và quan sát phản hồi của giao diện phía máy chủ.

Chúng ta có thể thấy rằng máy chủ thử nghiệm đã nhận thành công dữ liệu JSON do dự án độc hại gửi, dữ liệu này có chứa thông tin PRIVATE_KEY (khóa riêng tư).

Các chỉ số xâm phạm (IoC)
IP:
103.35.189.28
Tên miền:
text="">storebackend-qpq3.onrender.com
SHA256:
Kho dữ liệu độc hại:
https://github.com/audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot
Các kỹ thuật triển khai tương tự:
https://github.com/BitFancy/Solana-MEV-Bot-Optimized
https://github.com/0xTan1319/solana-copytrading-bot-rust
https://github.com/blacklabelecom/SAB-4
https://github.com/FaceOFWood/SniperBot-Solana-PumpSwap
https://github.com/Alemoore/Solana-MEV-Bot-Optimized
https://github.com/TopTrenDev/Raypump-Executioner-Bot
https://github.com/deniyuda348/Solana-Arbitrage-Bot-Flash-Loan
Tóm tắtKết luận
Trong phương thức tấn công được chia sẻ lần này, kẻ tấn công đã ngụy trang thành một dự án nguồn mở hợp pháp để lừa người dùng tải xuống và thực thi mã độc. Dự án này đọc thông tin nhạy cảm từ tệp .env cục bộ và truyền khóa riêng bị đánh cắp đến máy chủ do kẻ tấn công kiểm soát. Kiểu tấn công này thường kết hợp với các kỹ thuật tấn công xã hội, và người dùng có thể rơi vào bẫy nếu không cẩn thận.
Chúng tôi khuyến nghị các nhà phát triển và người dùng nên cảnh giác với các dự án GitHub không rõ nguồn gốc, đặc biệt là khi liên quan đến hoạt động của ví hoặc khóa riêng. Nếu thực sự cần chạy hoặc gỡ lỗi, bạn nên thực hiện trong một môi trường độc lập, không có dữ liệu nhạy cảm để tránh thực thi các chương trình và lệnh độc hại từ các nguồn không rõ.