Hãy nhìn vào dòng code này.
Một callback hook trong Uniswap V4 cho phép developer chèn logic tùy chỉnh trước và sau mỗi lần swap. Nghe có vẻ đơn giản? Tôi đã audit một hook như thế vào tuần trước. Phải mất 5 ngày để tìm ra lỗi: hook đó không kiểm tra msg.sender trong hàm beforeSwap, cho phép bất kỳ ai cũng có thể trigger một callback giả mạo, làm sai lệch toàn bộ tính toán giá. Kết quả? Một khoản lỗ tương đương 200 ETH nếu khai thác thành công.
Context: Cơ chế Hooks của Uniswap V4
Uniswap V4 chuyển từ mô hình "pool cố định" sang kiến trúc "singleton + hooks". Thay vì triển khai riêng lẻ từng cặp token, tất cả pool nằm trong một hợp đồng duy nhất. Các nhà phát triển có thể cắm vào 8 điểm hook cụ thể: beforeInitialize, afterInitialize, beforeSwap, afterSwap, beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity. Mỗi hook là một hàm callback được pool gọi tự động.
Điều này biến Uniswap thành một DEX có khả năng mở rộng lập trình – bạn có thể xây dựng thanh khoản tự động, phí động, bảo hiểm on-chain, hay thậm chí là MEV-resistant logic chỉ bằng vài dòng Solidity. Nhưng đồng thời, nó mở ra một bề mặt tấn công khổng lồ: mỗi hook là một điểm vào có thể bị khai thác nếu developer không hiểu sâu về luồng thực thi.
Core: Phân tích cấp code và trade-offs
Điểm yếu #1 – Thiếu kiểm tra ngữ cảnh (Context Validation)
Trong hàm beforeSwap, tham số SwapPayload chỉ chứa amountSpecified, zeroForOne, sqrtPriceLimitX96. Hook không nhận bất kỳ thông tin về pool hoặc caller. Điều này có nghĩa là nếu hook không tự kiểm tra msg.sender hoặc poolId, một kẻ tấn công có thể gọi hook thông qua một pool khác, làm sai lệch trạng thái.

Ví dụ tôi gặp: Một hook dùng để thu phí bằng cách mint lại ERC-20. Hook chỉ kiểm tra amountSpecified nhưng không kiểm tra poolId. Kẻ tấn công deploy một pool giả với hook tương tự, gọi swap() với lượng nhỏ, hook được kích hoạt và mint token ra ví tấn công. "Lỗi" này nằm ở chỗ nhà phát triển tin tưởng rằng chỉ pool chính mới gọi hook. Nhưng trong singleton architecture, bất kỳ pool nào cũng có thể gọi hook của bạn nếu hook được đăng ký toàn cục.
Điểm yếu #2 – Re-entrancy bất đối xứng
Hooks là callback, do đó chúng có thể bị gọi lại trong cùng một giao dịch. Một hook afterSwap có thể gọi lại swap() trên cùng pool, tạo ra re-entrancy. Uniswap V4 đã cố gắng ngăn chặn bằng lock modifier, nhưng chỉ ngăn được re-entrancy vào chính pool đó. Hook vẫn có thể gọi pool khác, hoặc gọi hook khác. Điều này tạo ra một đồ thị phụ thuộc vòng (circular dependency) mà không công cụ phân tích tĩnh nào có thể bắt hết.
Trade-off chính: Tính linh hoạt đi đôi với trách nhiệm bảo mật.
Uniswap V4 trao quyền tối đa cho developer, nhưng không cung cấp guardrails. Mỗi hook là một "hợp đồng thông minh độc lập" được ghép vào cơ chế lõi. Điều này khiến cho 90% developer DeFi sẽ không đủ năng lực để viết hook an toàn. Ngay cả các dự án audit kỹ lưỡng cũng có thể bỏ sót lỗ hổng vì bề mặt tấn công rộng hơn Uniswap V3 gấp 10 lần.
So sánh cấu trúc: | Tiêu chí | Uniswap V3 | Uniswap V4 | |-----------|------------|------------| | Bề mặt tấn công | 5-10 điểm (pool, factory, router) | 40+ điểm (8 hook x mỗi pool, cộng với hook global) | | Khả năng kiểm tra tĩnh | Cao (dễ tạo đặc tả toán học) | Thấp (hàm callback động) | | Chi phí gas trung bình | ~200k | ~250k (tăng do overhead hook, nhưng tiết kiệm do singleton) | | Kinh nghiệm developer cần | Trung bình | Cao (hiểu sâu về EVM và luồng callback) |
Contrarian: Điểm mù mà báo cáo audit thường bỏ qua
Hầu hết các team audit tập trung vào việc kiểm tra từng hook riêng biệt, nhưng bỏ qua tương tác giữa các hook trong cùng một giao dịch. Ví dụ: beforeSwap của pool A có thể thay đổi trạng thái toàn cục, ảnh hưởng đến afterSwap của pool B trong cùng một swap batch. Đây là lỗ hổng cross-hook chưa từng được ghi nhận trong các audit công khai.
Một điểm mù khác: Hooks có thể được cập nhật sau khi deploy. Uniswap V4 cho phép pool owner thay đổi hook contract bất kỳ lúc nào (nếu không khóa). Điều này phá hủy tính bất biến của smart contract. Một owner độc hại có thể deploy hook mới có backdoor sau khi pool đã có thanh khoản lớn. KYC của dự án chỉ là vở kịch: mua vài ví đã qua KYC dễ dàng bypass – chi phí tuân thủ được chuyển hoàn toàn cho người dùng trung thực.
Takeaway: Dự báo lỗ hổng và câu hỏi retorical
Trong vòng 18 tháng tới, tôi dự đoán sẽ có ít nhất 5 exploit liên quan đến Uniswap V4 hooks, với tổng thiệt hại trên 50 triệu USD. Bề mặt tấn công quá lớn so với năng lực của cộng đồng developer hiện tại. Các sàn giao dịch và bridge sẽ là mục tiêu hàng đầu do khối lượng giao dịch cao và hook phức tạp.
Audit xong rồi? Hãy đợi vài block. DeFi bảo mật: không có điểm kết thúc. Khi code trở thành Lego, liệu bạn có chắc mình đang ghép đúng khối?