Một reentrancy nhỏ, toàn bộ pool sập.

Mới tuần trước, một giao thức lending trên Optimism mất 2.5 triệu USD vì lỗi reentrancy cơ bản. Code là hiện thực, không phải lý thuyết. Tôi đã tự chạy local node để kiểm chứng logic thật của contract bị hack.
Đây là câu chuyện về một dòng code tưởng chừng vô hại, nhưng đã mở ra cánh cửa cho kẻ tấn công rút sạch pool thanh khoản.
Context: Cơ Chế Giao Thức
Giao thức này sử dụng mô hình lending/borrowing truyền thống: người dùng deposit tài sản, nhận lại aToken (giống aToken của Aave). Khi rút, contract gọi hàm withdraw(), tính toán số aToken cần đốt, sau đó transfer tài sản gốc về ví.
Vấn đề nằm ở hàm withdraw() khi kết hợp với một callback hook cho phép contract gọi lại ví người dùng sau khi transfer. Cụ thể: