Đã audit logic chưa?
Đêm 14/7/2025, một giao dịch flash loan trị giá 120 triệu USDC được khởi tạo trên Arbitrum. Trong vòng 7 block – khoảng 14 giây – một hacker vô danh đã rút sạch 18 triệu USDC từ pool USDC.e của Aave v3. Cột mốc: không có cảnh báo, không có pause contract, không có multisig can thiệp kịp. Ba giờ sau, đội ngũ Aave công bố báo cáo sơ bộ: lỗ hổng nằm ở hàm repayWithCollateral – một tính năng được audit bốn lần bởi ba công ty khác nhau.
Hãy nhìn vào dòng code này. Hàm repayWithCollateral cho phép người dùng trả nợ bằng tài sản ký quỹ thay vì stablecoin – một tối ưu gas thông minh. Nhưng trong logic tính liquidationThreshold, nhóm phát triển đã quên cập nhật user.healthFactor sau khi gọi hàm. Kết quả: hacker có thể vay 100% giá trị tài sản, sau đó dùng flash loan để inflate giá oracle, rồi gọi repayWithCollateral với một lượng nhỏ, khiến hệ thống tính toán sai healthFactor. Vòng lặp: vay – inflate – repay – withdraw – lặp lại 14 lần trong một giao dịch.
Đây không phải lỗi mới. Năm 2022, Cream Finance bị hack 130 triệu USD với vector tương tự. Nhưng Aave v3 từng được ca ngợi là "bản thiết kế chống đạn". Điều gì đã sai?
Bối cảnh giao thức
Aave v3 ra mắt tháng 3/2022, mang đến ba tính năng cốt lõi: eMode (hiệu quả vay chéo tài sản cùng loại), portal (bridge), và cơ chế xử lý nợ linh hoạt. Hàm repayWithCollateral thuộc nhóm cuối – được thiết kế để giảm chi phí gas khi người dùng muốn tất toán nợ bằng tài sản khác. Trong whitepaper, nó được mô tả là "thao tác nguyên tử không rủi ro". Nhưng thực tế: mỗi lần gọi, hàm chỉ cập nhật user.totalCollateral và user.totalDebt, bỏ qua việc user.isolationMode có thể đang active.
Chính isolation mode tạo ra lỗ hổng. Khi một tài sản bị cô lập (isolation asset), nó không được phép làm tài sản thế chấp cho khoản vay khác. Nhưng repayWithCollateral không kiểm tra isolationMode trước khi ghi nhận collateral. Hacker exploit: chọn USDC.e làm isolation asset, vay 100% bằng ETH, sau đó dùng flash loan để đẩy giá ETH lên 30% trong block, gọi repayWithCollateral để "trả" một phần nhỏ bằng USDC.e – hệ thống ghi nhận toàn bộ ETH collateral vẫn còn, cho phép rút ETH ra ngoài.
Audit xong rồi? Hãy đợi vài block. Bốn audit đều kiểm tra unit test riêng lẻ, không ai mô phỏng kịch bản: flash loan đa block + isolation mode + oracle manipulation. Cấu trúc so sánh: nếu audit tập trung vào "tính đúng đắn của thuật toán" thay vì "tính toàn vẹn trong dòng thực thi"
