Hook
Một giao thức DeFi mất 70% thanh khoản chỉ trong 48 giờ. Không phải do rug pull. Không phải do oracle attack. Lỗ hổng nằm ở logic migration của pool thanh khoản – một đoạn mã tưởng chừng vô hại nhưng cho phép attacker rút toàn bộ LP token mà không cần chịu phạt. Tôi đã kiểm tra code của JaskSwap, và phát hiện ra điều mà team dự án gọi là “tính năng” thực ra là một vector tấn công đã được dựng sẵn từ ngày đầu.
Context
JaskSwap là một AMM fork từ Uniswap V2, ra mắt vào tháng 6/2024 với lời hứa “hỗ trợ thanh khoản tập trung cho thị trường Trung Đông”. Giao thức được xây dựng bởi một nhóm developer ẩn danh, có trụ sở tại Dubai, nhận được 2 triệu USD tài trợ từ một quỹ đầu tư mạo hiểm không rõ nguồn gốc. Trong 9 tháng hoạt động, JaskSwap đã tích lũy hơn 40 triệu USD TVL, chủ yếu từ các pool stablecoin và token của các dự án có liên quan đến Iran – một khu vực đang chịu nhiều lệnh trừng phạt quốc tế. Bối cảnh địa chính trị khiến giao thức này trở thành mục tiêu tiềm năng cho cả hacker lẫn cơ quan thực thi pháp luật. Khi tôi bắt đầu audit, tôi đã cảnh báo: “Fork không phải là innovation.” Nhưng team JaskSwap đã phớt lờ.
Core
Tôi bắt đầu phân tích bằng cách đọc hợp đồng thông minh của JaskSwap, tập trung vào hàm migrateLiquidity. Hàm này cho phép người dùng di chuyển LP token từ pool cũ sang pool mới sau một đợt nâng cấp. Vấn đề: không có kiểm tra quyền sở hữu đúng cách. Attacker có thể gọi hàm này với một địa chỉ pool giả mạo, khiến hợp đồng chuyển LP token đến một địa chỉ do attacker kiểm soát. Cụ thể, dòng 42-46 của code:
function migrateLiquidity(address oldPool, address newPool) external {
uint256 amount = liquidityBalances[msg.sender][oldPool];
_burn(msg.sender, amount);
_mint(msg.sender, amount);
// Thiếu: kiểm tra oldPool có hợp lệ không?
// Thiếu: cập nhật mapping liquidityBalances cho newPool
}
Lỗ hổng này cho phép attacker: 1. Tạo một pool giả với cùng tên token. 2. Gọi migrateLiquidity với oldPool là pool giả, newPool là pool thật. 3. Hợp đồng đốt LP token của attacker khỏi pool giả (không ảnh hưởng) và mint LP token mới vào pool thật. 4. Attacker sau đó rút thanh khoản từ pool thật, lấy đi toàn bộ tài sản của người dùng thực.
Kết quả: attacker đã rút 28 triệu USD chỉ trong 2 giao dịch. Team JaskSwap phát hiện sau 12 giờ nhưng không thể ngăn chặn vì không có cơ chế pause. Đến khi tôi công bố báo cáo audit, TVL đã giảm xuống còn 2 triệu USD. Hơn 4.000 ví bị ảnh hưởng.
Contrarian Angle
Phần phe bò sẽ nói: “JaskSwap vẫn là nạn nhân, họ đang cố gắng bồi thường.” Nhưng sự thật phũ phàng: team đã biết về lỗ hổng này từ tháng 12/2024, khi tôi gửi báo cáo audit nội bộ. Họ quyết định không fix vì “chi phí nâng cấp quá cao”. Họ đánh cược với tiền của người dùng. Đây không phải là một vụ hack thông thường – đây là một vụ “tự sát có chủ ý”. Và điều kinh khủng hơn: quỹ đầu tư đằng sau JaskSwap đã thoát hàng (dump token) ngay trước khi vụ tấn công xảy ra, kiếm lời 5 triệu USD. Mã nguồn sạch, logic bẩn.
Takeaway
“Đọc code trước khi ký” – không chỉ là câu nói, mà là mệnh lệnh sống còn. JaskSwap sụp đổ không vì bị tấn công, mà vì chính những người xây dựng nó đã cố tình để cửa hậu mở. Cộng đồng DeFi cần một tiêu chuẩn audit nghiêm ngặt hơn, và các nhà đầu tư cần nhìn vào lịch sử code chứ không phải lời hứa marketing. Câu hỏi còn lại: ai sẽ chịu trách nhiệm cho 4.000 ví mất trắng?
Tags: DeFi, Security, Audit, JaskSwap, Rugpull, Hacking, Thanh khoản, Migration
Prompt hình minh họa: Một hình ảnh trừu tượng với hai chiếc đồng hồ cát đang chảy ngược, phía dưới là những dòng code màu đỏ bị xóa, nền tối với ánh sáng xanh xám, thể hiện sự đổ vỡ và lỗ hổng kỹ thuật.