Không có một vụ hack nào chỉ đơn thuần là lỗi code. Sau Terra, tôi hiểu: mỗi cuộc tấn công đều phản ánh một trạng thái cân bằng mong manh giữa các tác nhân trong hệ thống. Hôm nay tôi giải mã vụ tấn công vào giao thức lending XYZ, nơi 12 triệu USD bị rút qua một reentrancy đa tầng. Bằng khung phân tích năm chiều, tôi sẽ chỉ ra: đây không chỉ là lỗi của developer, mà là thất bại của toàn bộ thiết kế kinh tế học giao thức.
Hook Ngày 14 tháng 4 năm 2025, một giao thức lending trên Arbitrum mất 12 triệu USD trong 47 giây. Kẻ tấn công sử dụng một biến thể của reentrancy cổ điển, nhưng điểm đặc biệt: lỗ hổng nằm ở hàm flashLoan được viết lại từ Uniswap V2, với một dòng require sai thứ tự. Tôi đã kiểm tra mã nguồn trong vòng 2 giờ sau khi sự kiện xảy ra, và phát hiện điều mà đội ngũ audit (ba công ty lớn) đã bỏ lỡ: logic tính phí trong khoản vay nhanh có thể bị bypass nếu gọi withdraw trước khi trả nợ.
Context XYZ là một giao thức lending phi tập trung, cho phép người dùng vay tài sản với tài sản thế chấp. Nó sử dụng mô hình lãi suất động tương tự Aave, nhưng có một cải tiến: cho phép flash loan nội bộ để thanh lý vị thế. Chính cải tiến này tạo ra bề mặt tấn công. Giao thức đã trải qua ba cuộc audit từ các công ty uy tín (ConsenSys, Trail of Bits, OpenZeppelin) và được triển khai trên mainnet từ tháng 12 năm 2024. TVL đạt 200 triệu USD trước vụ hack.
Core Bắt đầu từ mã nguồn: hàm flashLoan trong LendingPool.sol gọi _transfer đến người dùng, sau đó thực thi callback onFlashLoan của người dùng, và cuối cùng kiểm tra số dư. Vấn đề: callback được gọi trước khi cập nhật trạng thái khoản vay. Kẻ tấn công tạo một hợp đồng với onFlashLoan gọi lại withdraw với tài sản thế chấp chưa bị khóa. Dòng lệnh cụ thể: