Tôi nhận được một hợp đồng ICO vào năm 2017. Hai tuần đọc từng dòng Solidity, tôi phát hiện một lỗi reentrancy trong hàm withdraw. 500 ETH đã được cứu. Hôm nay, tôi thấy lại pattern đó trong một dự án DeFi mới: YieldVault. Họ vừa huy động 50 triệu USD từ các quỹ lớn. Nhưng code của họ có một vấn đề mà tôi sẽ chỉ ra ngay sau đây.
## Context YieldVault là một giao thức yield farming trên Ethereum L2 (Arbitrum). Nó cho phép người dùng deposit token vào các pool thanh khoản và nhận lãi suất biến đổi. Hợp đồng chính của nó, Vault.sol, quản lý việc deposit và withdraw. Theo whitepaper, họ sử dụng mô hình 'optimistic accounting' để giảm gas cost. Nhưng chính mô hình này tạo ra một lỗ hổng bảo mật.
## Core Tôi đã fork code của họ từ GitHub (commit a3f2b1c) và chạy thử nghiệm trên hardhat local network. Hàm withdraw(uint256 amount) trong Vault.sol có đoạn code sau: