Threat Intelligence: Phân tích robot mã nguồn mở Solana đánh cắp tiền điện tử

Bài viết này được dịch máy
Xem bản gốc

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 crypto và đã liên hệ với đội ngũ bảo mật SlowMist . Để phản hồi, đội ngũ đã phân tích thêm phương thức tấn công.

Tác giả: Joker&Thinking, Công nghệ SlowMist

Biên tập: KrsMt.

bối cảnh

Đầu tháng 7 năm 2025, đội ngũ bảo mật SlowMist nhận được yêu cầu hỗ trợ từ một người dùng nạn nhân, yêu cầu hỗ trợ phân tích nguyên nhân dẫn đến việc tài sản crypto 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, dẫn đến một vụ trộm tiền điện tử bí mật. Để biết chi tiết, hãy xem Công cụ Solana phổ biến trên GitHub có bẫy trộm ẩ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 crypto và đã liên hệ với đội ngũ bảo mật SlowMist . Để phản hồi, đội ngũ đã phân tích thêm phương thức tấn công.

Quá trình phân tích

Phân tích tĩnh

Đầu tiên, chúng tôi sử dụng phân tích tĩnh để tìm các bẫy do kẻ tấn công đặt ra. Sau khi phân tích, chúng tôi phát hiện mã đáng ngờ nằm trong tệp cấu hình /src/common/config.rs, chủ yếu nằm trong phương pháp create_coingecko_proxy():

Như có thể thấy từ mã, phương pháp create_coingecko_proxy() đầu tiên gọi import_wallet(), phương pháp đó gọi import_env_var() để lấy private key.

Trong phương pháp import_env_var(), phương thức này chủ yếu được sử dụng để lấy thông tin cấu hình biến hoàn cảnh trong tệp .env.

Trong quá trình gọi, nếu biến hoàn cảnh 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 thông báo lỗi. Vì có vòng lặp {} không có điều kiện thoát, nên tài nguyên sẽ tiếp tục bị tiêu tốn.

Thông tin nhạy cảm như PRIVATE_KEY (private key) cũng được lưu trữ trong tệp .env.

Quay lại phương pháp import_wallet(), trong đó import_env_var() được gọi để lấy PRIVATE_KEY (private key), mã độc sẽ xác định độ dài của private key:

Nếu độ dài private key nhỏ hơn 85, phần mềm độc hại sẽ in ra thông báo lỗi và vì có vòng lặp {} không có điều kiện thoát nên tài nguyên sẽ tiếp tục bị tiêu tốn và phần mềm độc hại sẽ không thể thoát ra bình thường;

Nếu độ dài private key lớn hơn 85, hãy sử dụng Solana SDK để chuyển đổi chuỗi Base58 thành đối tượng Keypair, trong đó thông tin private key.

Sau đó, mã độc sử dụng Arc để đóng gói thông tin private key nhằm hỗ trợ chia sẻ đa luồng.

Quay lại phương pháp create_coingecko_proxy(), sau khi lấy được thông tin private key, mã độc sẽ giải mã địa chỉ URL độc hại.

Phương pháp này đầu tiên lấy hằng số được mã hóa cứng HELIUS_PROXY (đị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 bằng 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:

http://103.35.189.28:5000/api/wallets
Sau khi giải mã thành công URL (http://103.35.189.28:5000/api/wallets), mã độc đầu tiên sẽ tạo một máy trạm HTTP và chuyển đổi thông tin private key 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 private key đã chuyển đổi trong đó. Bằng cách xây dựng một yêu cầu POST, private key và dữ liệu khác được gửi đến máy chủ được trỏ đến bởi URL trên, đồng thời bỏ qua kết quả phản hồi.

Bất kể kết quả trả về của máy chủ là gì, mã độc vẫn sẽ tiếp tục chạy để tránh sự chú ý của người dùng.

Ngoài ra, phương pháp 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; tên của phương pháp này cũng được ngụy trang và gây nhầm lẫn.

Thông qua phân tích, chúng ta có thể biết rằng phương pháp 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 pháp main() trong main.rs.

Trong phương pháp new() của tệp cấu hình src/common/config.rs, mã độc sẽ tải tệp .env trước rồi mới gọi phương pháp 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 mục lụ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.

// Mã hóa địa chỉ gốc HELIUS_PROXY:
2HeX3Zi2vTf1saVKAcNmf3zsXDkjohjk3h7AsnBxbzCkgTY99X5jomSUkBCW7wodoq29Y
// Giải mã địa chỉ máy chủ gốc
https://storebackend-qpq3.onrender.com/api/wallets

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ế 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 trong tệp .env bằng private key thử nghiệm mà bạn vừa tạo.

Tiếp theo, 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, trong đó có chứa thông tin PRIVATE KEY.

Chỉ báo thỏa hiệp (IoC)

IP:

103.35.189.28

Tên miền:

storebackend-qpq3.onrender.com

SHA256:

07f0364171627729788797bb37e0170a06a787a479666abf8c80736722bb79e8 - Pumpfun-pumpswap-sniper-copy-trading-bot-master.zip

ace4b1fc4290d6ffd7da0fa943625b3a852190f0aa8d44b93623423299809e48 - pumpfun-pumpswap-sniper-copy-trading-bot-master/src/common/config.rs

Kho chứa độc hại:

https://github.com/audiofilter/pumpfun-pumpswap-sniper-copy-trading-bot

Các phương pháp triển khai tương tự:

https://github.com/BitFancy/ Solana-MEV-Bot-Optimized

Solana

https://github.com/blacklabelecom/SAB-4

Solana

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ắt

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 mã 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 private key 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 hết sức cảnh giác với các dự án GitHub từ các nguồn không xác định, đặc biệt là khi liên quan đến ví hoặc hoạt động private key . 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 hoàn cảnh độ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 xác định.

Để biết thêm kiến thức về an toàn, vui lòng tham khảo "Sổ tay tự cứu Blockchain Dark Forest" do SlowMist biên soạn:

https://github.com/slowmist/Blockchain-dark-forest-selfguard-handbook/blob/main/README_CN.md

Tuyên bố miễn trừ trách nhiệm: Là một nền tảng thông tin blockchain, các bài viết được đăng trên trang web này chỉ đại diện cho quan điểm cá nhân của tác giả và khách mời, và không liên quan gì đến quan điểm của Web3Caff. Thông tin trong bài viết chỉ mang tham khảo và không cấu thành bất kỳ lời khuyên hay ưu đãi đầu tư nào. Vui lòng tuân thủ luật pháp và quy định hiện hành của quốc gia hoặc khu vực của bạn.

Nguồn
Tuyên bố từ chối trách nhiệm: Nội dung trên chỉ là ý kiến của tác giả, không đại diện cho bất kỳ lập trường nào của Followin, không nhằm mục đích và sẽ không được hiểu hay hiểu là lời khuyên đầu tư từ Followin.
Thích
Thêm vào Yêu thích
Bình luận