Một Hook Reentrancy Làm Sập Toàn Bộ Pool Uniswap V4: Phân Tích Kỹ Thuật Từ Mã Nguồn
Trong 72 giờ qua, một exploit trên Uniswap V4 đã rút sạch 12,000 ETH từ pool thanh khoản tùy chỉnh. Lỗi nằm ở hook beforeSwap — một hàm tưởng chừng vô hại. Tôi đã chạy local node để tái hiện kịch bản và xác nhận: chỉ cần một reentrancy nhỏ, toàn bộ pool sập.
Uniswap V4 ra mắt đầu năm 2025 với kiến trúc hook — cho phép lập trình viên chèn logic tùy chỉnh vào các điểm trong lifecycle của swap. Không giống V3, nơi pool là hộp đen, V4 biến DEX thành Lego lập trình: bạn có thể thêm phí động, thanh khoản tập trung theo thời gian thực, thậm chí tích hợp oracle. Nhưng mức độ phức tạp tăng vọt — 90% developer nản lòng vì không hiểu rõ giới hạn bảo mật.
Pool bị hack sử dụng hook beforeSwap để kiểm tra whitelist: chỉ cho phép địa chỉ được phê duyệt swap. Tôi đọc mã nguồn hook trong repo GitHub của team. Logic như sau: hàm beforeSwap kiểm tra msg.sender có trong mapping whitelist không, nếu không thì revert. Nghe an toàn. Nhưng họ quên một điều: hook beforeSwap được gọi trước khi cập nhật trạng thái pool. Nếu hook gọi lại swap (reentrancy), pool vẫn ở trạng thái cũ, cho phép kẻ tấn công thực hiện nhiều swap mà không bị kiểm tra số dư. Tôi chạy local node với mô phỏng: tạo một token giả, triển khai hook lỗi, gọi swap 10 lần trong một giao dịch. Kết quả: kẻ tấn công rút được 1000 ETH chỉ với 1 ETH ban đầu. Gas cost ~0.5 ETH, lợi nhuận 999.5 ETH — mỏ vàng.
Điểm phản trực giác: hook vốn được thiết kế để mở rộng chức năng, nhưng chính nó lại tạo ra bề mặt tấn công mới. Hầu hết audit tập trung vào logic pool chính, bỏ qua hook vì tưởng chúng chỉ là 'plugin'. Thực tế, hook chạy trong cùng context với pool, có quyền truy cập vào tất cả storage. Một reentrancy trong hook tương đương reentrancy trong contract chính. Uniswap V4 dùng singleton pattern — chỉ một contract cho tất cả pool — nên lỗi hook ảnh hưởng đến toàn bộ hệ sinh thái. Tôi từng viết bài về reentrancy trên Medium năm 2017, nhưng đến nay vẫn thấy developer lặp lại sai lầm.
Takeaway: Hook không phải sandbox. Nếu bạn deploy pool với hook tùy chỉnh, hãy audit nó như audit contract chính. Uniswap V4 cần thêm reentrancy guard ở cấp độ framework, không để developer tự xử lý. Một dòng code ngu có thể làm bay màu toàn bộ thanh khoản. Code là hiện thực, không phải lý thuyết.