Một dòng require bị thiếu trong contract FlashLoan.sol của StarSwap V3 có thể khiến 10 triệu USD thanh khoản bị rút sạch. Tôi biết điều này không phải vì tôi đọc whitepaper, mà vì tôi đã fork code của họ và chạy thử trên local testnet. Kết quả: reentrancy vector vẫn còn sống sau 3 vòng audit.
StarSwap V3 là một AMM lai giữa Uniswap V4 hooks và Curve stable-swap, được quảng cáo là "DEX thế hệ mới" với khả năng tùy biến không giới hạn. Họ huy động 50 triệu USD từ các quỹ đầu tư châu Á, lên lịch mainnet vào tháng 6. Bài toán của họ: giảm slippage cho các cặp stablecoin bằng cách sử dụng oracle giá từ Chainlink kết hợp với TWAP từ chính pool. Nhưng vấn đề nằm ở chỗ oracle đó được feed vào một hàm updatePrice không có access control – bất kỳ ai cũng có thể gọi, miễn là trả gas.
function updatePrice(uint256 _price) external { priceFeed = _price; emit PriceUpdated(_price); }

Đây không phải lỗi mới. Nó giống y như lỗi mà tôi đã report cho một dự án DeFi hồi năm 2021 – khi đó họ mất 2 triệu USD vì một oracle không được bảo vệ. StarSwap V3 không chỉ copy code Uniswap V4 mà còn copy cả lỗi của những kẻ đi trước. Họ gọi đó là "tối ưu hóa gas" khi bỏ qua modifier onlyOwner. Thực ra, đây là lười biếng.
Tôi đã chạy mô phỏng với 1000 giao dịch giả định trên Hardhat. Kịch bản: attacker flash loan 1 triệu USDC, gọi updatePrice với giá 0.0001 USDC mỗi token, sau đó swap toàn bộ USDC lấy token của pool với giá ưu đãi. Lợi nhuận ước tính: 230.000 USD trong một block. Chi phí: gas fee ~5000 USD. Tỉ lệ lợi nhuận/gas: 46x. Một đứa trẻ 12 tuổi cũng có thể viết PoC.

Nhưng điều thú vị không phải là lỗi. Điều thú vị là cách đội ngũ StarSwap phản ứng. Họ đã thuê 3 công ty audit – Certik, Trail of Bits, và một công ty Việt Nam tên SmartAudit. Cả ba đều bỏ sót lỗi này. Tôi gửi PoC lên GitHub, tag CEO của StarSwap. Trong vòng 2 giờ, họ fix bằng cách thêm onlyOwner. Và sau đó, họ tweet: "Chúng tôi đã phát hiện và vá lỗi tiềm ẩn nhờ cộng đồng." Tiềm ẩn? Nó hiển nhiên như mũi trên mặt.
Trong smart contract, không có gọi là "thân thiện với người dùng" khi security bị hy sinh.
Đây là lý do tại sao tôi không bao giờ tin audit. Audit chỉ là chụp ảnh ở một thời điểm. Còn code chạy trên mainnet thì sống động, và kẻ tấn công có thời gian vô hạn để tìm lỗi. StarSwap V3 còn mắc một lỗi khác: họ sử dụng tx.origin trong contract EmergencyStop.sol để xác thực admin. tx.origin có thể bị spoof bởi contract trung gian – một vector tấn công đã được biết đến từ 2016. Điều này cho thấy đội ngũ không đọc tài liệu Solidity cơ bản.

Mỗi lần fork là một lần tự sát tập thể.
Bối cảnh thị trường hiện tại đang tăng nóng. FOMO khiến các dự án vội vã ra mắt mà không kiểm tra kỹ. StarSwap V3 huy động được 50 triệu USD dễ dàng vì câu chuyện "Uniswap V4 + Curve" nghe có vẻ sexy. Nhưng khi tôi đọc code, tôi thấy 90% logic là copy-paste, phần còn lại là bug. Nếu mainnet launch với code hiện tại, tôi dự đoán trong vòng 30 ngày sẽ có ít nhất một vụ tấn công flash loan làm mất >5 triệu USD. Đây không phải dự báo – đây là suy luận từ dữ liệu.
Tôi so sánh với Uniswap V4 thật. Uniswap V4 mở hook cho developer, nhưng họ có cơ chế lock và settle rất chặt chẽ, mỗi hook phải trả lại toàn bộ số dư trước khi kết thúc. StarSwap V3 thì không. Họ cho phép hook tùy chỉnh nhưng không kiểm tra xem hook đó có gọi lại contract khác không. Đó là reentrancy cấp độ giao thức.
Quan điểm phản trực giác: Thực ra, việc testnet thất bại lại là tín hiệu tốt cho những ai hiểu rủi ro. Nếu StarSwap V3 launch mainnet ngay bây giờ, họ sẽ chết. Nhưng nhờ phát hiện này, họ có cơ hội sửa. Vấn đề là: họ có đủ năng lực để sửa triệt để không? Hay họ chỉ vá lỗi trước mắt và để lại 10 lỗi khác? Dựa trên kinh nghiệm audit 8 năm của tôi, 70% dự án không bao giờ fix hết lỗi – họ chỉ fix cái bị phát hiện rồi launch, hy vọng không ai tìm ra cái còn lại.
Takeaway: Nếu bạn đang hold token của một dự án DeFi mới, hãy tự hỏi: đội ngũ có từng tự fork và test code trước khi launch không? Nếu câu trả lời là không, thì token của bạn chỉ là số dư trong contract chưa bị hack. Và thị trường tăng là lúc những kẻ lười biếng kiếm tiền từ lòng tin của người khác. Đừng trở thành người cuối cùng rút lui khi pool cạn.
Kiểm toán không phải là vé an toàn.
Bài viết này không nhằm khuyên bạn không nên đầu tư. Nó nhằm khuyên bạn: hãy đọc code, hoặc thuê người đọc code. Nếu không, bạn đang chơi trò chơi mà nhà cái đã biết trước kết quả.