Mổ xẻ một vụ rugpull: Code không biết nói dối, nhưng dev thì có
Lý Tuệ
Cộng đồng thường hỏi: làm sao để phát hiện rugpull trước khi nó xảy ra? Câu trả lời nằm trong mã nguồn. Tuần này tôi audit một dự án lending trên Solana có tên “SolVault” – TVL 8M, audit của một công ty tên “ShieldSec” (thực ra không tồn tại). Kết quả: ba lỗi cơ bản, trong đó có một hàm withdraw không kiểm tra owner. Điều đáng nói: đoạn code đó được comment là “quick fix pending review”. Mổ xẻ xong, không còn gì để ngoái lại.
Hype là kẻ thù của security. SolVault quảng cáo APY 34% cho lending pairs chính, nhưng real yield âm sau khi trừ phí giao thức. Nếu bạn bỏ qua layer kiểm toán, bạn sẽ thấy một lỗi logic kinh điển: hàm _updateDebt() gọi trước khi cập nhật state, tạo cơ hội flash loan reentrancy. Tôi đã tìm thấy pattern tương tự trong Yam Finance năm 2020 – cảnh báo bị phớt lờ, kết quả 15M bay hơi sau 48 giờ. Đây không phải lỗi kỹ thuật, là lỗi quản trị. Code im lặng, nhưng tôi nghe thấy tiếng kêu cứu.
Chúng ta cần check supply schedule của token gốc? SolVault mint token SVT không có cap, mint() gọi từ contract proxy không check paused. Một hacker exploit contract storage collision (do proxy pattern thiếu định nghĩa slot đúng) có thể mint vô hạn. Tôi không cần đoán, chỉ cần đọc file upgrade.json. Mỗi lần tôi thấy một proxy có _implementation trỏ đến address zero, tôi biết có vấn đề. Ở đây, proxy admin là một EOA không multi-sig. Một private key có thể wipe toàn bộ pool.
Không có gì là “safe” trong crypto. Vì vậy, tôi không xem audit như một certification, mà là một floor cho analysis. SolVault fail ở mọi tầng: không có timelock, không có pause module, không có rate limit trên withdraw. Đây không phải lỗi sơ đẳng, mà là cẩu thả có chủ đích. Tôi gọi đó là “scam by incompetence” – kẻ lừa đảo vì quá dốt cũng nguy hiểm không kém kẻ ác.
Nếu bạn hỏi tôi có nên đầu tư không? Tôi sẽ hỏi lại: bạn đã check hàm _beforeTokenTransfer chưa? Nếu không, đừng hỏi. Bài học: TVL không phải tín hiệu an toàn, chỉ là thanh khoản đang chờ bị đánh cắp. Khi hype chết, code vẫn còn đó – và nó sẽ phơi bày tất cả.