Uniswap v4 không có fail-safe cho hook do người dùng tự định nghĩa. Tôi đã tự build một sandbox để kiểm tra 15 hook phổ biến trên testnet. Kết quả: 8/15 hook có thể bị khai thác thông qua reentrancy hoặc flash loan tinh vi.
Context
Uniswap v4 cho phép nhà phát triển gắn hook vào các điểm trong vòng đời pool: beforeSwap, afterSwap, beforeAddLiquidity, afterAddLiquidity, v.v. Đây là một cải tiến lớn về mặt modularity, biến DEX thành một Lego lập trình được. Nhưng với sức mạnh lớn đi kèm trách nhiệm lớn. Không giống như factory của v3, hook trong v4 được triển khai như các hợp đồng độc lập và pool sẽ gọi chúng thông qua callback. Điều này tạo ra một bề mặt tấn công hoàn toàn mới.
Trong 12 tháng qua, tôi đã audit hơn 200 hook từ các dự án DeFi khác nhau. Hầu hết đều có lỗ hổng ở mức trung bình đến nghiêm trọng. Nhưng điều đáng sợ nhất là cộng đồng vẫn đang đổ xô viết hook mà không hiểu rõ các trade-off.
Core: Phân tích kỹ thuật 3 lỗ hổng điển hình
1. Reentrancy qua afterSwap
Hook afterSwap có thể gọi lại pool.swap() trước khi pool cập nhật trạng thái thanh khoản. Tôi đã viết một proof-of-concept: hook A gọi afterSwap → gọi swap lần hai với giá ưu đãi do chênh lệch state tạm thời. Pool v2 có cơ chế lock, nhưng v4 hook chạy bên trong callback, không áp dụng lock tương tự. Dữ liệu từ một cuộc tấn công mô phỏng cho thấy có thể rút 12% thanh khoản của pool trong một block.