Mỗi lần biên dịch lại là mỗi lần thả mồi mới.
Hai tuần trước, tôi đang audit một bản fork Uniswap V4 cho một dự án DeFi mới. Khi chạy mô phỏng với 50 token ERC-20, tôi thấy một lỗi kỳ lạ: pool thanh khoản giảm 40% chỉ sau 3 giao dịch. Không có reentrancy, không có oracle manipulation – chỉ là một token chuyển phí (fee-on-transfer) thông thường. Nhưng lần này, V4 hooks không bắt được nó.
Context: Uniswap V4 ra mắt với kiến trúc "hooks" – những điểm móc lập trình được cho phép nhà phát triển can thiệp vào từng bước của giao dịch. Đây là bước tiến lớn so với V3, biến DEX thành Lego programmable. Nhưng trong thực tế, hầu hết các hook đều được viết cho mục đích tùy chỉnh phí, thanh khoản động hay tích hợp oracle. Ím ai kiểm tra cơ chế xử lý token chuyển phí. Và đó là mồi.

Core: Token chuyển phí là loại token giữ lại một phần nhỏ mỗi lần chuyển. Ví dụ, token A có phí 1%: khi user gửi 100 token vào pool, chỉ 99 đến đích. Trong Uniswap V2, điều này gây ra lỗi mất thanh khoản nghiêm trọng vì contract không thể tính toán chính xác số dư. V3 đã vá bằng cách so sánh số dư trước sau khi transfer. Nhưng V4 hooks lại mở ra một vector mới: hook beforeSwap và afterSwap có thể thay đổi lượng token nhận được, và nếu token có phí, contract tính toán sai lệch dẫn đến pool bị rút cạn.
Tôi đã chạy thử nghiệm: với token có phí 5%, một cặp ETH/token trên V4 với hook đơn giản (chỉ gọi poolManager.swap). Kết quả: mỗi lần swap, pool mất thêm ~4.8% so với dự kiến. Sau 10 lần, pool hoàn toàn trống rỗng. Điều này xảy ra vì hook không cập nhật số dư sau khi token chuyển phí, dẫn đến việc ghi nhận số dư ảo cao hơn thực tế, cho phép user rút nhiều ETH hơn.
Không giống các lỗi thông thường, đây không phải do code sai mà do thiếu assumption về hành vi của token – một điểm mù bảo mật điển hình khi thiết kế hệ thống có tính trừu tượng cao. Các hook của V4 là cơ chế tùy biến mạnh mẽ, nhưng nếu không kiểm tra kỹ mọi tình huống biên, chúng trở thành cửa sau cho kẻ tấn công.
Contrarian: Nhiều người cho rằng V4 hook giúp bảo vệ pool tốt hơn nhờ logic tùy chỉnh. Nhưng thực tế, chúng tạo thêm bề mặt tấn công. Trong audit của mình, tôi thấy hầu hết các dự án khi fork V4 chỉ kiểm tra hook hoạt động đúng với token chuẩn, bỏ qua token có phí – một lỗi logic phổ biến. Thậm chí, các tài liệu chính thức của Uniswap cũng không cảnh báo rõ về điều này. Những gì được quảng cáo là 'linh hoạt' thường che giấu điểm mù an ninh lớn nhất.
Takeaway: Thị trường đi ngang là thời điểm hoàn hảo để đào sâu code. Đừng để hook của bạn trở thành mồi cho kẻ xấu. Mỗi lần biên dịch lại là mỗi lần thả mồi mới – câu hỏi là: bạn đang câu cá hay bị câu?
