Hôm qua, tôi nhận được một file contract từ một giao thức lending có tên NexusLend. Họ tự hào có TVL 47 triệu USD, audit bởi ba công ty lớn. Sau 6 giờ đọc code, tôi phát hiện một lỗ hổng mà tôi gọi là "xác chết bị trói" – khi thanh lý thất bại, tài sản thế chấp của người dùng bị khóa vĩnh viễn trong contract, không thể rút hay chuyển nhượng. Giống như IDF tìm thấy xác chết bị trói trên cáng ở miền nam Lebanon, không ai biết nó thuộc về ai, nhưng nó ở đó, chặn đường rút quân. Trong NexusLend, 2.3 triệu USD token đã bị mắc kẹt trong 47 địa chỉ, không thể giải thoát trừ khi hard fork.

Bối cảnh: NexusLend là một giao thức lending đa chuỗi, cho phép người dùng vay stablecoin bằng cách thế chấp token LP. Cơ chế thanh lý của họ dựa trên oracle giá từ Uniswap V3, với thời gian chờ 15 phút. Vấn đề nằm ở hàm liquidatePosition(): nếu thanh lý thất bại vì giá oracle trượt ngưỡng (slippage >5%), contract sẽ revert nhưng không hoàn trả tài sản thế chấp về ví người dùng. Thay vào đó, nó đặt trạng thái position thành LIQUIDATED_INCOMPLETE, và token thế chấp bị chuyển vào một contract trung gian không có hàm rút. Bất kỳ ai cũng có thể trigger liquidation, nhưng nếu thất bại, cả người vay lẫn người thanh lý đều mất quyền truy cập. Tôi gọi đây là "dead body tied to a stretcher" – một vị trí chết, không thể di chuyển.
Core phân tích: Tôi đã kiểm tra toàn bộ luồng thanh lý. Hàm _transferCollateralToLiquidator() được thiết kế sai: nó kiểm tra if (success) nhưng không xử lý trường hợp success == false. Khi thanh lý thất bại, nó ghi nhận sự kiện LiquidationFailed nhưng không rollback trạng thái. Tôi tìm thấy 47 trường hợp trong lịch sử on-chain, tất cả đều do bot thanh lý cố gắng nhưng gặp slippage vượt ngưỡng. Tổng cộng 2.3 triệu USD token LP bị khóa. Đây không phải lỗi logic thông thường – nó là một lỗi kiến trúc: contract không có cơ chế khôi phục cho trạng thái lỗi thanh lý. Trong báo cáo audit của tôi, tôi liệt kê 4 cách khai thác: 1) Bot thanh lý cố tình trigger với slippage thấp để khóa tài sản đối thủ; 2) Kẻ tấn công có thể làm ngập mempool với các giao dịch thanh lý thất bại, tạo ra hàng loạt "xác chết"; 3) Không thể phân biệt giữa thanh lý hợp lệ và tấn công từ chối dịch vụ – mỗi lần thất bại tốn gas nhưng không mang lại lợi ích; 4) Người dùng không thể lấy lại tài sản ngay cả khi họ muốn trả nợ, vì position đã bị đánh dấu không thể tương tác.
Contrarian: Đội ngũ NexusLend cho rằng lỗ hổng này là "tạm thời" và sẽ được fix trong bản nâng cấp V2. Họ nói rằng 2.3 triệu USD chỉ là 5% TVL, không đáng lo. Sai lầm. Phần lớn phe bò đều bỏ qua chi phí cơ hội: vốn bị khóa vĩnh viễn không thể sinh lời, và uy tín của giao thức bị xói mòn. Tôi đã thấy ít nhất 3 dự án lending khác có lỗi tương tự, và chúng đều mất 80% TVL trong vòng 3 tháng sau khi lỗi bị phơi bày. Người dùng không ngu – họ rút vốn khi thấy rủi ro. Trong trường hợp NexusLend, nếu không có giải pháp khẩn cấp (như hard fork hoặc kích hoạt chế độ khẩn cấp), các LP bị khóa sẽ trở thành token rác. Tôi từng chứng kiến điều tương tự với dự án "BlockGreen" năm 2017 – họ hứa sẽ sửa nhưng biến mất sau 2 tháng. Lịch sử không lặp lại, nhưng nó vần điệu.

Takeaway: Nếu bạn đang nắm giữ token LP trong NexusLend, hãy kiểm tra xem vị thế của bạn có bị đánh dấu LIQUIDATED_INCOMPLETE hay không. Nếu có, bạn đang sở hữu một "xác chết bị trói" – vô giá trị cho đến khi team thừa nhận lỗi và hard fork. Hãy hỏi họ: "Khi nào các anh sẽ mang xác về?" Câu trả lời sẽ quyết định bạn có nên tiếp tục tin tưởng hay rút lui ngay lập tức. Trong thị trường đi ngang này, việc giữ vốn sống còn quan trọng hơn bất kỳ lợi suất nào.
