Ngày 18/8/2025, cộng đồng chấn động khi token $RANT – một memecoin vừa ra mắt chưa đầy hai tháng – bị khai thác trong một vụ tấn công tinh vi. Chỉ trong một giao dịch duy nhất, hacker đã rút sạch liquidity pool, bỏ túi hơn 312 WBNB, tương đương khoảng 245.000 USD.
Sự việc này nhanh chóng trở thành tâm điểm thảo luận trên các diễn đàn crypto. Đối với nhiều nhà đầu tư nhỏ lẻ, $RANT chỉ là một memecoin vô danh. Nhưng với giới lập trình và nghiên cứu bảo mật blockchain, đây là một điển hình cho thấy sự nguy hiểm của những đoạn code tưởng như vô hại.
Từ memecoin vui nhộn đến thảm họa
$RANT được triển khai trên BNB Chain vào ngày 3/7/2025, mang trong mình tham vọng trở thành một memecoin có “cơ chế đốt” độc đáo. Ý tưởng rất đơn giản: mỗi khi holder bán token, một phần liquidity sẽ bị burn, tạo ra sự khan hiếm giả định và khuyến khích nắm giữ dài hạn.
Chỉ hai ngày sau, đội ngũ phát triển đưa 150 WBNB vào pool PancakeSwap, khởi động giai đoạn thanh khoản. Mọi thứ dường như suôn sẻ. Nhưng ẩn sâu trong contract là một quả bom hẹn giờ – một hàm nội bộ tên _sellBurnLiquidityPairTokens
có khả năng bị gọi gián tiếp mỗi khi token được chuyển.
Trong thiết kế ban đầu, đây là một transfer hook, giúp tự động thực thi burn logic. Nhưng vì thiếu cơ chế kiểm soát quyền truy cập, bất kỳ ai cũng có thể kích hoạt nó.
Hacker ra tay: một kịch bản hoàn hảo
Ngày 17/8/2025, một địa chỉ ví bí ẩn đã tiến hành vụ tấn công. Chiến thuật của hacker được đánh giá là textbook exploit – vừa cổ điển, vừa chính xác đến từng bước.
-
Khởi động bằng flash loan
Hacker vay 2.813 WBNB từ một giao thức lending, đảm bảo có đủ đạn dược để thao túng pool. -
Làm lệch tỷ lệ cung cầu
Số WBNB vừa vay được swap lấy 96,6 triệu $RANT, khiến pool lệch mạnh: 10,7 triệu $RANT đổi 3.125 WBNB. -
Kích hoạt transfer hook
Hacker gửi $RANT trực tiếp vào contract. Hành động này khiến hàm_sellBurnLiquidityPairTokens
tự động chạy, burn một lượng lớn token trong pool. Do thiếu điều kiện ràng buộc, pool ngay lập tức mất cân bằng.Sau quá trình burn, tỷ lệ giá trở nên vô lý: chỉ còn 1 $RANT đối ứng với 3.125 WBNB.
-
Arbitrage và rút cạn
Với 3,8 triệu $RANT còn lại, hacker thực hiện swap ngược và hút sạch toàn bộ số WBNB trong pool.
Sau khi trả lại khoản flash loan ban đầu, ví hacker vẫn giữ lại 312 WBNB – khoản lợi nhuận ròng trị giá gần một phần tư triệu đô.
Toàn bộ chuỗi hành động diễn ra trong một giao dịch duy nhất, được ghi nhận tại địa chỉ:
0x2d9c1a00cf3d2fda268d0d11794ad2956774b156355e16441d6edb9a448e5a99
.
Cú sốc cho holder và bài học đắt giá
Đối với holder $RANT, kết cục là mất trắng. Liquidity pool bị drain, token gần như vô giá trị, niềm tin sụp đổ chỉ trong vài phút.
Trên X (Twitter), nhiều chuyên gia bảo mật bình luận rằng vụ việc này “không hề mới, nhưng luôn hiệu quả”. Cùng với hàng loạt vụ hack khác trên BSC từ đầu năm, tổng số thiệt hại đã lên đến hàng chục triệu USD.
Điểm chung của các sự cố là: code thiếu kiểm tra, audit hời hợt, và ham ra mắt nhanh để bắt trend memecoin.
Góc nhìn chuyên gia: phòng ngừa hơn chữa cháy
Theo các nhà nghiên cứu bảo mật, có ít nhất ba sai lầm chết người trong thiết kế contract $RANT:
-
Transfer hook không được giới hạn quyền truy cập: bất kỳ ai cũng có thể trigger burn.
-
Không có modifier an toàn như
onlyOwner
,nonReentrant
để hạn chế hành vi gọi hàm ngoài ý muốn. -
Thiếu kiểm thử kịch bản thực tế: không mô phỏng flash loan hoặc arbitrage trước khi triển khai.
Các chuyên gia khuyến nghị:
-
Dự án cần tiến hành audit chuyên sâu trước khi public.
-
Developer nên sử dụng Foundry hoặc Hardhat để mô phỏng kịch bản tấn công flash loan.
-
Người dùng cần cảnh giác, kiểm tra contract và audit report trước khi bỏ tiền.
Vụ $RANT không phải là vụ hack lớn nhất trong năm, nhưng là một ví dụ điển hình cho thấy chỉ một đoạn code nhỏ cũng có thể thổi bay hàng trăm nghìn USD.
Trong thế giới crypto, nơi mọi thứ đều minh bạch và tự động, “code is law”. Nhưng khi luật được viết cẩu thả, hậu quả lại do chính nhà đầu tư gánh chịu.
Đối với cộng đồng BSC, đây là lời cảnh tỉnh rõ ràng: trong một thị trường nơi memecoin mọc lên mỗi ngày, sự khác biệt giữa “cơ hội làm giàu” và “mất trắng” đôi khi chỉ nằm ở một dòng code.