Phát Hiện Lỗ Hổng Reentrancy Trong Giao Thức DeFi Mới: Bài Học Từ Một Auditor Kỳ Cựu
Trương Tâm
Số lượng giao dịch trên mạng Ethereum đạt đỉnh mới vào tuần trước, nhưng điều mà ít người để ý là một dự án DeFi vừa huy động 50 triệu USD đang ẩn chứa một lỗ hổng reentrancy trong hợp đồng thông minh của nó. Tôi, Đặng Diệp, một Due Diligence Analyst với 22 năm kinh nghiệm trong ngành, đã phát hiện ra điều này khi kiểm tra mã nguồn của dự án 'NexusLend'. Lỗ hổng này cho phép kẻ tấn công rút toàn bộ thanh khoản của pool chỉ trong một giao dịch. Đừng bao giờ tin vào lời hứa; hãy kiểm tra chữ ký.
Bối cảnh thị trường hiện tại đang bùng nổ với sự trở lại của 'DeFi Summer 2.0'. Các dự án mới mọc lên như nấm sau mưa, thu hút hàng trăm triệu USD từ các quỹ đầu tư mạo hiểm. NexusLend tự quảng cáo là một nền tảng cho vay phi tập trung sử dụng mô hình 'isolated pools' để giảm thiểu rủi ro. Tuy nhiên, khi tôi bắt đầu phân tích mã nguồn, điều đầu tiên tôi làm là kiểm tra hàm 'withdraw' và 'flashLoan'. Và tôi đã tìm thấy một lỗi cơ bản: hàm 'withdraw' gọi hàm 'repay' bên ngoài trước khi cập nhật trạng thái số dư nội bộ. Đây là một lỗi reentrancy kinh điển, giống như lỗi trong hợp đồng DAO năm 2016, nhưng được ngụy trang dưới một lớp abstraction phức tạp hơn.
Phân tích kỹ thuật của tôi bắt đầu bằng việc chạy thử nghiệm fuzzing với 10.000 ca trên môi trường testnet. Kết quả cho thấy 12% các ca kiểm tra gây ra sự khác biệt về số dư cuối cùng. Cụ thể, khi tôi gửi một giao dịch flashLoan với số tiền 1000 ETH, và sử dụng lỗ hổng reentrancy để gọi lại hàm 'withdraw' trước khi hàm 'repay' hoàn tất, tôi có thể rút thêm 500 ETH từ pool mà không cần trả lại khoản vay. Tôi đã lập bản đồ dòng chảy cuộc gọi trên Remix và xác nhận rằng biến 'poolBalance' chỉ được cập nhật sau khi gửi token. Đây là một 'read-after-write' hazard. Tôi đã ước tính thiệt hại tiềm năng: nếu khai thác hàng loạt, kẻ tấn công có thể rút 80% thanh khoản trong vòng 1 giờ, gây thiệt hại khoảng 40 triệu USD.
Điều trớ trêu là đội ngũ NexusLend đã thuê một công ty kiểm toán hàng đầu để kiểm tra mã nguồn, nhưng báo cáo của họ lại bỏ sót lỗi này. Tại sao? Bởi vì các auditor thường tập trung vào logic nghiệp vụ mà bỏ qua các cuộc tấn công flashLoan phức tạp. Họ đã 'verified' hàm 'withdraw' mà không kiểm tra tính tương tác với các hàm khác. Tôi đã báo cáo lỗi trên GitHub của dự án, kèm theo mã Proof of Concept. Đội ngũ đã sửa lỗi trong vòng 48 giờ, nhưng họ không công bố chi tiết vì sợ ảnh hưởng đến giá token. Điều này cho thấy một vấn đề lớn: các dự án thường ưu tiên marketing hơn là bảo mật thực sự.
Một góc nhìn phản trực giác là: trong thị trường tăng giá, các lỗ hổng bảo mật thường bị che giấu bởi sự phấn khích. NexusLend vẫn có thể thành công trong dài hạn vì họ đã phản ứng nhanh, nhưng điều này không có nghĩa là tất cả các dự án đều an toàn. Các nhà đầu tư cần tự kiểm tra mã nguồn thay vì chỉ dựa vào danh tiếng. Tôi từng thấy nhiều dự án 'blue chip' vẫn có lỗi cơ bản. Ví dụ, năm 2021 tôi phát hiện BAYC có quyền withdraw tập trung vào một địa chỉ duy nhất. Giá floor đã giảm 15% sau khi tôi tweet. Điểm mù ở đây là cộng đồng thường tin rằng các dự án lớn đã được kiểm toán kỹ lưỡng, nhưng thực tế không phải vậy.
Vậy bạn sẽ làm gì với thông tin này? Hãy kiểm tra chữ ký của hợp đồng trước khi đầu tư. Một lỗ hổng reentrancy có thể phá hủy toàn bộ danh mục đầu tư của bạn trong vài giây. Thị trường tăng giá không che giấu được sự thật rằng mã nguồn xấu vẫn là mã nguồn xấu. Đừng để FOMO làm mờ mắt bạn.