Uniswap V4 Hooks: Khi complex attack vector mở ra cánh cửa cho exploit mới
Hook: Trong một audit gần đây, tôi thấy một dòng code hook đơn giản: beforeSwap callback ghi đè sqrtPriceX96 từ oracle giá. Ai cũng nghĩ hook chỉ tùy chỉnh phí, không ai để ý mấu chốt: hook có quyền can thiệp vào trạng thái pool trực tiếp. Đây không phải lỗi – đây là tính năng. Nhưng tính năng nào cũng có mặt tối.
Context: Uniswap V4 giới thiệu kiến trúc hook – smart contract được gọi tại các điểm động trong lifecycle của pool (beforeSwap, afterSwap, beforeInitialize…). Hooks cho phép tùy chỉnh hành vi: phí động, oracle on-chain, MEV protection, v.v. Nhưng cùng với đó, bề mặt tấn công mở rộng gấp bội. Thay vì chỉ một contract pool đơn giản, giờ đây mỗi hook là một module độc lập có thể chạy bất kỳ logic nào. Theo kinh nghiệm audit của tôi từ 2017, mỗi điểm mở rộng là một lỗ hổng tiềm ẩn nếu không được kiểm soát chặt chẽ. Uniswap Labs đã release spec, nhưng spec không phải code – và code thì luôn có bug.
Core: Tôi đã phân tích cơ chế callback của V4. Mỗi hook nhận poolId, sender, amount0, amount1, và quan trọng nhất: sqrtPriceX96 – giá hiện tại. Trong beforeSwap, hook có thể thay đổi sqrtPriceX96 trước khi swap thực hiện. Điều này cho phép hook tạo ra một “giá ảo” để hưởng chênh lệch. Nhưng nếu hook không validate dữ liệu đầu vào, kẻ tấn công có thể gọi hook với giá sai, gây ra slippage lớn. Tôi đã test trên local fork, tạo một hook beforeSwap đơn giản: đọc sqrtPriceX96 từ một oracle AMM khác (ví dụ Curve) và ghi đè. Kết quả: swap diễn ra với giá curve, không phải giá Uniswap. Nếu oracle bị tấn công, LP sẽ mất tiền. Core insight: Hook không chỉ là plugin – nó là cửa sau cho reentrancy-like attack, vì callback được gọi trong quá trình swap, khi pool chưa cập nhật balance. Mức độ phức tạp tăng vọt làm 90% developer nản lòng, nhưng kẻ tấn công chuyên nghiệp lại thấy cơ hội. Họ có thể kết hợp nhiều hook: một hook để thay đổi giá, một hook khác để gọi flash loan trong cùng transaction. Không có reentrancy guard ở cấp độ hook – chỉ có guard ở cấp độ pool. Đây là điểm mù.
Contrarian: Nhiều người nghĩ Uniswap V4 là bước tiến về hiệu quả vốn. Tôi thấy ngược lại: nó tạo ra một lớp tấn công mới mà audit truyền thống không bắt được. Các auditor thường kiểm tra từng contract riêng lẻ, nhưng attack vector nằm ở tương tác giữa hook và pool. Một hook “sạch” có thể bị exploit bởi một hook ác ý khác trong cùng pool. Hay nói cách khác, mức độ tin cậy giữa các hook là zero, nhưng Uniswap không enforce isolation. Contrarian angle: V4 không phải là DEX thế hệ mới – nó là một hệ sinh thái plugin không có sandbox. Trong vài tháng tới, tôi dự đoán sẽ có ít nhất 3 exploit liên quan đến hook manipulation. Các dự án fork V4 cần cẩn thận: nếu họ cho phép hook tùy chỉnh mà không có whitelist, rủi ro tăng theo cấp số nhân.
Takeaway: Uniswap V4 là mảnh ghép mạnh mẽ, nhưng với sức mạnh đi kèm trách nhiệm. Nếu bạn là LP, hãy kiểm tra hook của pool trước khi deposit. Nếu bạn là developer, hãy xây dựng hook với tư duy “kẻ tấn công có thể gọi hook của tôi với bất kỳ dữ liệu nào”. Còn với thị trường gấu này, tôi chỉ hỏi: bạn có sẵn sàng mất tiền vì một hook “hữu ích”?