72 giờ. Đó là khoảng thời gian một pool thanh khoản trên Arbitrum mất 40% tổng giá trị LP trước khi bất kỳ ai phát hiện. Tôi mở hợp đồng thông minh của pool đó, thấy một dòng code quen thuộc: msg.sender.call{value: amount}("") không có kiểm tra trạng thái. Reentrancy cơ bản. Nhưng điều làm tôi khó chịu không phải là lỗi — mà là team dev đã biết trước rồi.
Pool này thuộc về một giao thức AMM mới ra mắt trên Arbitrum, tự xưng là "phi tập trung hoàn toàn" với cơ chế thanh khoản tập trung kiểu Uniswap v3. Họ claim đã audit bởi một công ty bảo mật có tên tuổi. Tôi request link audit — họ đưa tôi một bản PDF 20 trang, không có hash trên-chain, không có signature. Audit giấy. 72 giờ sau khi pool chạy, hacker rút 400 ETH từ pool ETH-USDC, tương đương 1.2 triệu USD lúc đó. LP không thể withdraw vì contract bị drain mất liquidity.

Tôi phân tích mã nguồn từ Etherscan. Hợp đồng chính sử dụng mô hình cặp giống Uniswap v2, nhưng thêm một hàm skim() đặc biệt cho phép người dùng gửi token rác vào pool để thao túng giá. Kết hợp với lỗi reentrancy trong hàm swap(), attacker có thể gọi lại skim() trước khi cập nhật số dư, tạo ra chênh lệch giá ảo. Cụ thể: attacker deposit 1 ETH, thực hiện swap với lượng small, trong khi swap() gọi callback đến contract của attacker, callback đó gọi skim() để đẩy thêm token rác vào pool làm lệch tỷ giá, rồi swap lần hai với giá tốt hơn. Kết quả: 400 ETH rút ra chỉ với 10 ETH vốn ban đầu.
Điểm mù bảo mật: team dev nghĩ rằng reentrancy chỉ xảy ra khi có callback rõ ràng (như ERC-777), nhưng họ quên rằng msg.sender.call trong Solidity luôn có thể tạo reentrancy nếu msg.sender là một contract. Họ đã thêm nonReentrant modifier vào swap() nhưng quên áp dụng cho skim(). Sai lầm kinh điển. Tôi đã thấy lỗi này 5 lần trong sự nghiệp audit của mình, từ ICO 2017 đến các pool DeFi 2021. Đáng thất vọng.

Góc nhìn phản trực giác: Cái gọi là "audit" không phải là tấm khiên bảo vệ. Trong thị trường đi ngang hiện tại, các team dev thường cắt giảm chi phí — audit một lần, không update, không kiểm tra chéo. Họ dựa vào danh tiếng của công ty audit thay vì tự kiểm tra. Và kết quả là những lỗi cơ bản như reentrancy vẫn tồn tại. Tôi từng viết bài về điều này năm 2022: 80% lỗ hổng DeFi đến từ việc sao chép code Uniswap mà không hiểu bối cảnh. Pool này cũng vậy.
Takeaway: Bất kỳ pool thanh khoản nào có hàm skim(), sync(), hoặc flashLoan() mà không có reentrancy guard — hãy coi chừng. Trong thị trường tích lũy này, hacker đang rình rập những dự án lười biếng. Và nếu team dev không dám show source code trước khi launch, đừng tin vào cái gọi là "audit PDF". Câu hỏi cho bạn: Bạn có biết pool mình đang stake có hàm skim() không?
