Hãy nhìn vào dòng code này. Một hàm withdraw với modifier onlyOwner nhưng không có kiểm tra số dư. Đã audit logic chưa? Hay chỉ nhìn qua dashboard? Tôi đã thấy điều này trong ít nhất ba giao thức lending mới ra mắt trong quý này. Thị trường tăng đang che giấu mọi thứ.
Context
Thị trường tăng 2024-2026 đã tạo ra một làn sóng các giao thức lending mới, hứa hẹn lợi suất 2-3 chữ số. Nhưng trong 5 năm audit DeFi, tôi nhận thấy một mô hình lặp lại: khi giá token tăng, các nhóm phát triển vội vã ra mắt sản phẩm, bỏ qua các kiểm tra bảo mật cơ bản. Họ dựa vào các bản audit thương mại – vốn chỉ kiểm tra bề mặt – và tin rằng “thị trường tăng sẽ không có hack”. Sai lầm. Thị trường tăng không chỉ che giấu lỗi kỹ thuật; nó còn khuyến khích hành vi liều lĩnh.
Gần đây, tôi đã audit độc lập một giao thức lending mới gọi là “NexoLend” (tên giả, nhưng lỗi là thật). Giao thức sử dụng mô hình pool thanh khoản đơn giản, với các hàm deposit, withdraw, borrow, repay. Từ whitepaper, mọi thứ có vẻ chuẩn – nhưng khi tôi mở mã nguồn, tôi thấy ngay một vấn đề.
Core
Audit xong rồi? Hãy đợi vài block.
Tôi bắt đầu bằng cách kiểm tra hàm withdraw. Dưới đây là mã giả rút gọn:
function withdraw(uint256 amount) external onlyOwner {
// không có kiểm tra số dư
token.transfer(msg.sender, amount);
}
onlyOwner? Đây là một modifier hạn chế chỉ admin mới có thể rút. Nhưng nếu admin key bị lộ? Hoặc nếu owner là multisig mà một người có thể ký? Lỗ hổng này không chỉ là thiếu kiểm tra số dư, mà còn là thiết kế quyền hạn quá tập trung. Trong một giao thức DeFi thực sự, rút tiền nên được kiểm soát bởi người dùng, không phải admin.
Tôi tiếp tục kiểm tra logic tính lãi suất. Họ dùng mô hình lãi suất động dựa trên utilization rate. Nhưng công thức lại bị sai: họ nhân utilization rate với hệ số cố định mà không có giới hạn. Khi utilization rate vượt 100% (do lỗi rounding), lãi suất trở nên âm, cho phép người dùng vay với lãi suất âm và kiếm lời từ không khí. Đây là lỗi kinh điển trong các giao thức non-standard AMM.
Dựa trên kinh nghiệm audit của tôi, tôi xây dựng một checklist cho các giao thức lending:
- Kiểm tra hàm rút tiền: Có kiểm tra số dư không? Có chỉ cho phép người dùng rút tiền của chính họ không?
- Kiểm tra logic lãi suất: Có dấu hiệu overflow/underflow? Có giới hạn utilization rate không?
- Kiểm tra oracle: Giá từ đâu? Có dễ bị thao túng không? (Các giao thức mới thường dùng oracle giá đơn lẻ)
- Kiểm tra reentrancy: Có dùng
nonReentrantkhông? Nếu không, có guard nào khác không?
NexoLend thất bại ở cả bốn điểm. Tôi báo cáo lỗi cho nhóm, và họ nói: “Sẽ fix trong bản nâng cấp sau.” Sau? Khi nào? Khi ai đó khai thác? DeFi bảo mật: không có điểm kết thúc.
Contrarian
Đây là góc nhìn phản trực giác: Thị trường tăng không phải là thời điểm an toàn để đầu tư vào các dự án mới; nó là thời điểm nguy hiểm nhất. Lý do: các nhóm phát triển chịu áp lực ra mắt nhanh để bắt kịp đà tăng, họ thuê auditor rẻ, và cộng đồng FOMO bỏ qua các dấu hiệu cảnh báo. Tôi đã chứng kiến điều này trong chu kỳ 2021 với các giao thức như Titan, Iron Finance, và gần đây là một số dự án Friend.tech fork.
Điểm mù bảo mật lớn nhất là giả định rằng audit thương mại là đủ. Các công ty audit lớn thường kiểm tra cơ bản, bỏ qua các tương tác phức tạp giữa các hợp đồng. Một audit độc lập, như tôi làm, mới thực sự tìm được lỗi sâu. Nhưng ngay cả audit của tôi cũng có giới hạn. Không có audit nào đảm bảo an toàn 100%.
Takeaway
DeFi không phải là nơi dành cho người tin vào “code is law” mà không hiểu luật. Mỗi block mới là một cơ hội cho kẻ tấn công. Câu hỏi không phải là “liệu dự án này có bị hack không?” mà là “khi nào nó sẽ bị hack?”. Trước khi đầu tư vào bất kỳ giao thức lending mới nào, hãy tự mình đọc mã nguồn. Hoặc ít nhất, hãy gửi nó cho tôi. Tôi không sợ bytecode.