Vào ngày 21 tháng 6, một trong những MEV Bot hoạt động mạnh nhất trên mạng Ethereum, Jaredfromsubway.eth, đã trở thành mục tiêu của một cuộc tấn công 'bẫy mật ong' (honeypot attack) được thiết kế tinh vi, mất hơn 7,5 triệu USD tài sản mã hóa. Dưới đây là phân tích của đội ngũ bảo mật Beosin về vụ tấn công này và việc theo dõi dòng tiền bị đánh cắp.
Phân tích quy trình tấn công
Hợp đồng tấn công
- Hợp đồng điều phối (0xb84db016324e8f2bfdd8dd9c260338aee0a8df52): Chịu trách nhiệm ghi nhận trạng thái "vũ trang" (armed) của khối hiện tại và gọi các hợp đồng con để rút tiền trong giai đoạn cuối.- Hợp đồng kích hoạt (0x4de8c729a064ff6087cc84a4152969349e4feb98): Chịu trách nhiệm thiết lập trạng thái cặp giao dịch giả mạo trong cùng một khối, khiến đường đi arbitrage trông có thể thực thi.- Hợp đồng con / Hợp đồng token giả: Ngụy trang thành token ERC-20 bình thường, được dùng để nhận sự ủy quyền thực sự.- Hợp đồng Hub: Chịu trách nhiệm thanh toán một khoản lợi nhuận thực tế nhỏ, khiến MEV Bot nghĩ rằng có lợi nhuận.- Ring V2 pair: Cặp giao dịch Uniswap v2 giả mạo.- Hợp đồng token trung gian giả: Được dùng để xây dựng đường đi arbitrage nhiều bước, như fCAP, fUSDC.
Chìa khóa của cuộc tấn công: Lừa ủy quyền
Thông qua phân tích các giao dịch trên chuỗi, kẻ tấn công đã tạo ra nhiều nhóm giao dịch làm mồi nhử:
- USDC số lượng lớn: Bot kiếm được lợi nhuận khoảng 36.997120 USDC, nhưng để lại 20 USDC ủy quyền.- USDT số lượng lớn: Bot kiếm được lợi nhuận khoảng 37.053440 USDT, nhưng để lại 20 USDT ủy quyền.- WETH số lượng lớn: Bot kiếm được lợi nhuận khoảng 0.0179 WETH, nhưng để lại 16 WETH ủy quyền.- Các giao dịch số lượng nhỏ thì hoạt động bình thường, việc ủy quyền được sử dụng hết trong cùng giao dịch, nhằm giảm sự nghi ngờ.
Trong các giao dịch số lượng nhỏ, sau khi bot ủy quyền số token thực, hợp đồng con sẽ ngay lập tức chuyển đi số token thực đó, việc ủy quyền được sử dụng hết, trông hoàn toàn bình thường.
Còn trong các giao dịch số lượng lớn, hợp đồng con sẽ không gọi hàm transferFrom để chuyển token thực, mà thay vào đó, thông qua cặp giao dịch giả mạo để tạo ra token giả. Bot tưởng rằng mình đã hoàn thành các bước chuẩn bị swap bình thường, nhưng việc ủy quyền token thực vẫn được giữ nguyên.
Đây chính là cốt lõi của toàn bộ cuộc tấn công: Giao dịch nhỏ sử dụng hết ủy quyền bình thường, giao dịch lớn giữ lại ủy quyền.
Quy trình tấn công
Lấy giao dịch tấn công nhắm vào USDC làm ví dụ:
(1) Kẻ tấn công gọi hợp đồng điều phối, đặt khối hiện tại ở trạng thái "armed" (vũ trang).(2) Kẻ tấn công gọi hợp đồng kích hoạt, cập nhật trạng thái của nhiều cặp Ring V2 giả mạo.(3) MEV Bot phát hiện cơ hội arbitrage và thực thi giao dịch.
Quy trình nội bộ giao dịch của MEV Bot đại khái như sau:
(1) Hợp đồng MEV Bot ủy quyền một số lượng USDC lớn cho một hợp đồng con nào đó.(2) MEV Bot gọi hàm wrapTo/wrap của hợp đồng con.(3) Hợp đồng con vì trạng thái hiện tại là "armed", không tiêu thụ USDC thực, mà đúc token giả cho cặp giao dịch, ủy quyền USDC được giữ lại.(4) MEV Bot tiếp tục gọi hàm swap của cặp giao dịch giả mạo.(5) Cặp giao dịch ở bước nhảy thứ hai gửi token cho MEV Bot.(6) Hợp đồng hub thanh toán một khoản lợi nhuận USDC thực tế nhỏ cho MEV Bot.
Ví dụ về ủy quyền (approval)
Hash giao dịch: 0x0121e07a916c06eea3e7daf11893f3f0b95b9e1684124545ae14c32aee6029bb
Kết quả MEV Bot thấy: Một giao dịch arbitrage thành công, thu được lợi nhuận USDC thực tế. Nhưng việc ủy quyền USDC đã bị hợp đồng con giữ lại. Các quy trình tương tự được lặp lại riêng biệt cho USDC, USDT, WETH, cuối cùng hình thành nên một lượng ủy quyền lớn.
Hash giao dịch tấn công là:
0x2be8704f5a59b69e0b71f64aefdb99eb0e8ae9fb3926147c581910d71bcf3e65
Kẻ tấn công gọi vòng lặp drain của hợp đồng điều phối, calldata chứa 66 địa chỉ hợp đồng con, cùng với địa chỉ hợp đồng MEV Bot. Chỉ cần hợp đồng MEV Bot trước đó đã để lại số dư ủy quyền cho hợp đồng con, hợp đồng con có thể trực tiếp chuyển token thực tương ứng cho kẻ tấn công.
Kết quả cuối cùng:
- 20 ủy quyền USDC số lượng lớn đã bị tiêu thụ hoàn toàn.- 16 ủy quyền WETH số lượng lớn đã bị tiêu thụ hoàn toàn.- Một phần số dư ủy quyền USDT vẫn còn tồn tại, nhưng số dư USDT hiện đã không còn đủ.
Phân tích dòng tiền
Sau khi tấn công thành công, địa chỉ của kẻ tấn công (0x3e37f4A10d771Ba9dE44b6d301410b1BEdeA65d0) đã nhận được $2.87M USDC, $2.04M USDT và 1,474 WETH. Sau đó, kẻ tấn công đã chuyển đổi stablecoin thành ETH và chuyển đến 4 địa chỉ sau:
- 0xe3Da36E4bd1a5738fa5D6Ef4F0e4dF40bDeB5f17 (khoảng 1,000 ETH)- 0x74Dc5b93586D248D5Aec64b3586736FF0A0D0e65 (1,001 ETH)- 0xd8C125efCBc99408eC8723E9BBd81d1E8D39D845 (1,001 ETH)- 0x71d4416A7A85e08a5Fe7227Ca3B44Fc639e94e97 (1,423 ETH)
Trong đó, 0xe3Da3 đã chuyển 1,000 ETH vào Tornado Cash, ETH tại ba địa chỉ còn lại chưa có sự chuyển tiếp nào khác. Biểu đồ dòng tiền được thể hiện như sau:
Lời kết
Cuộc tấn công lần này cho thấy một phương thức tấn công có độ tinh vi cao: Kẻ tấn công không trực tiếp tấn công mã hợp đồng, mà dựa trên logic nghiệp vụ của MEV Bot, thông qua việc xây dựng các tình huống arbitrage tương ứng để đánh lừa MEV Bot thực hiện các ủy quyền có vẻ không có vấn đề, cuối cùng chuyển tài sản của nó đi. Đối với các robot arbitrage và MEV Bot, không nên chỉ dựa vào việc mô phỏng lợi nhuận để đánh giá độ an toàn của đường đi, đặc biệt khi đường đi arbitrage tồn tại các hợp đồng lạ, token giả mạo hoặc wrapper tùy chỉnh, cần phải thận trọng và có thể cân nhắc kiểm tra cưỡng chế sự thay đổi của allowance sau giao dịch.
Xem bài viết gốc









