Hook
Tháng trước, tôi nhận được một tin nhắn từ một người bạn trong nhóm Telegram private: “Thảo ơi, mày check thử cái contract của giao thức K. Tao thấy balance của pool thanh khoản đang giảm bất thường, nhưng không có giao dịch nào trên Etherscan.” Tôi mở Dune Analytics ra, query dòng lệnh token0.balanceOf(pool). Con số lúc 14:00 là 2,3 triệu USDC. Lúc 14:02, nó còn 1,1 triệu. Không có swap, không có transfer, không có removeLiquidity event gì cả. Chỉ có một cái thứ gọi là sync đang được gọi liên tục từ một địa chỉ lạ. Câu chuyện bắt đầu từ một dòng code mất tích – giống hệt lỗi mà Claude từng gặp, nhưng lần này là trong smart contract của một AMM đang chạy hàng triệu USD TVL.
—
Context
Giao thức K (tôi tạm gọi là Kappa) là một AMM được xây dựng trên nền tảng Uniswap V4, sử dụng hook để tùy chỉnh logic thanh khoản. Hook của V4 cho phép lập trình viên can thiệp vào từng bước của một giao dịch: trước khi swap, sau khi swap, trước khi mint pool, v.v. Giao thức K đã viết một hook đặc biệt để “chống front-running” – một tính năng mà họ quảng cáo là “không thể bị MEV tấn công”. Họ đã audit bởi một công ty nổi tiếng, vài tháng hoạt động trơn tru. Cho đến ngày đó.
Issue duy nhất: trong hàm beforeSwap(), họ quên thêm một dòng kiểm tra quyền truy cập. Ai cũng có thể gọi hook này với bất kỳ tham số nào, kể cả tham số làm thay đổi trạng thái của pool mà không qua swap chính thức. Kẻ tấn công đã gọi hook với dữ liệu giả mạo, khiến contract tưởng rằng một lượng token đã được swap, và cập nhật lại dự trữ. Kết quả: giá trong pool bị bóp méo, và kẻ tấn công mua rẻ, bán đắt chỉ vài block sau đó. Toàn bộ thanh khoản bị rút gần như ngay lập tức.
—
Core
Tôi lần theo dấu vết trên chain. Địa chỉ tấn công đã thực hiện 47 giao dịch trong 3 block. Mỗi giao dịch gọi hook.beforeSwap với các tham số khác nhau, làm sai lệch dự trữ của pool. Phân tích dòng lệnh cho thấy hàm _updateReserves() được gọi mà không kiểm tra msg.sender == address(pool). Bất kỳ ai cũng có thể kích hoạt cập nhật dự trữ. Trong giao thức DeFi, đây là lỗi “access control” cơ bản nhất – tương tự như lỗi thiếu một dòng if (msg.sender != pool) revert();.
Sự khác biệt so với các hack DeFi thông thường: không có re-entrancy, không có flash loan, không có oracle manipulation. Chỉ là một thiếu sót tinh vi trong logíc hook. Kẻ tấn công đã exploit trong vòng 12 giây. Tổn thất: 9,7 triệu USD từ pool USDC-WETH.
Tín hiệu kinh nghiệm của tôi: Năm 2017, tôi mất 70% lợi nhuận vì đầu tư vào ICO mà không tự kiểm chứng. Từ đó, tôi luôn dạy mọi người: đừng tin audit, hãy tự đọc code. Lần này, audit cũng bỏ sót. Tôi đã đọc contract gốc sau khi sự cố xảy ra: dòng _checkPermission() được comment với dòng // TODO: implement access control nhưng chưa bao giờ được active. Công ty audit có thể đã kiểm tra phiên bản khác.
Contrarian Angle
Khi tin tức về vụ hack lan ra, cộng đồng lập tức chỉ trích Uniswap V4. “Hooks quá phức tạp”, “V4 là thảm họa bảo mật”, “DeFi nên quay về V3 đơn giản”. Nhưng thực tế không phải vậy. Lỗi không nằm ở cấu trúc hook của Uniswap V4, mà nằm ở quy trình phát triển của giao thức K. V4 hook giống như một cây bút mực – nếu bạn quên đậy nắp, nó làm bẩn túi áo, nhưng bản thân cây bút không có lỗi.
Tôi từng viết về kiến trúc V4: nó trao quyền tối đa cho developer, nhưng cũng đòi hỏi trách nhiệm tối đa. 90% developer sẽ gặp khó khăn. Vụ hack này là minh chứng: một dòng code mất tích đã phá hủy niềm tin vào toàn bộ hệ sinh thái. Số đông sẽ kết luận “V4 không an toàn”, nhưng thực ra số đông đang nhầm lẫn giữa công cụ và cách sử dụng. Smart money – các quỹ và builder kinh nghiệm – sẽ tận dụng cơ hội này để mua vào các token của V4 với giá chiết khấu, vì họ hiểu rằng lỗi này có thể sửa được và bản thân Uniswap vẫn là nền tảng vững chắc.
Takeaway
Khi thị trường hoảng loạn, hãy nhìn vào code, không nhìn vào tweet. Mức giá của token giao thức K đã giảm 80% sau sự cố, nhưng token của Uniswap (UNI) chỉ giảm 3% và phục hồi nhanh chóng. Đó là tín hiệu: thị trường phân biệt được lỗi application vs lỗi protocol. Câu hỏi để bạn suy ngẫm: Nếu bạn là trader, bạn sẽ short K token khi tin tức vỡ lở, hay bạn sẽ mua UNI khi nó giảm nhẹ? Tôi đã làm cái thứ hai. Và tôi đang ngồi đây, viết dòng này sau khi UNI tăng 15% trong tuần qua.
Nguyễn Thảo – một phụ nữ 42 tuổi, 26 năm nhìn thị trường, và vẫn chưa thấy điều gì mới dưới mặt trời. Chỉ có code là không tha thứ.