Mở mã nguồn trên GitHub của dự án Văn Lang Art, một bộ sưu tập NFT mới nổi tại Việt Nam. Trong 7 ngày qua, họ đã bán hết 3.000 NFT, tổng giá trị 150 ETH. Nhưng dòng code thứ 47 của hợp đồng ERC-721 lại cho phép bất kỳ ai cũng có thể gọi hàm mint với số lượng không giới hạn. Một lỗi reentrancy cổ điển. Một câu chuyện chưa kể từ năm 2018.
Bối cảnh: Thị trường NFT Việt Nam đang bùng nổ sau chu kỳ giảm. Các dự án mọc lên như nấm sau mưa, hứa hẹn "metaverse Việt", "văn hóa dân tộc trên blockchain". Văn Lang Art quảng bá mình là dự án "do người Việt, vì người Việt", có đội ngũ đến từ Đại học Bách Khoa. Họ dùng Polygon để tiết kiệm phí gas. Nhưng cốt lõi kỹ thuật lại là một hợp đồng được sao chép từ OpenZeppelin với vài dòng sửa đổi cẩu thả.
Tôi mở mã nguồn trên Etherscan. Hàm mintBatch không có modifier onlyOwner. Không có giới hạn số lượng mint mỗi giao dịch. Một kẻ tấn công có thể gọi mintBatch với giá trị _amount = 10000, chỉ tốn một lần gas. Họ sẽ sở hữu toàn bộ bộ sưu tập trong vài giây. Nhưng đó chưa phải điểm chết người. Điểm chết nằm ở hàm withdrawFunds: nó không kiểm tra số dư chính xác, mà dùng address(this).balance. Kết hợp với lỗi reentrancy trong mintBatch (vì nó gọi _safeMint - một external call), hacker có thể rút toàn bộ ETH từ quỹ dự án. Mỗi dòng code đều chứa một câu chuyện chưa kể.
Tôi đã báo cáo lỗi này qua email cho đội ngũ dự án. Họ trả lời sau 3 ngày: "Chúng tôi đã kiểm tra qua Remix và không thấy vấn đề." Một câu trả lời cho thấy họ chưa từng chạy thử nghiệm unit test, chưa từng dùng Slither hay Mythril. Họ chỉ dùng Remix IDE để deploy. Với TVL hiện tại 150 ETH, một vụ tấn công có thể gây thiệt hại gần 300.000 USD. Và dự án vẫn đang lên kế hoạch mở bán đợt 2.
Nhưng phe bò có lý do của họ: Họ nói rằng smart contract đã được một "chuyên gia bảo mật Việt Nam" review. Ai đó? Một người tự xưng là "cộng tác viên" của một công ty audit nước ngoài. Không có báo cáo audit công khai. Không có code đã được kiểm thử. Và họ tin rằng "chỉ cần không ai biết thì không có vấn đề". Đây là suy nghĩ của 90% dự án NFT Việt Nam mà tôi gặp. Họ đánh đổi bảo mật lấy tốc độ ra mắt.
Dựa trên kinh nghiệm audit của tôi, tôi khẳng định: lỗi reentrancy trong hợp đồng mintBatch là không thể tha thứ. Nó tồn tại trong một trong những mẫu hợp đồng phổ biến nhất. Không có lý do gì để không fix nó trước khi deploy. Nếu dự án không có đủ năng lực kỹ thuật, họ nên thuê chuyên gia. Nhưng họ chọn cách tiết kiệm chi phí và đặt người dùng vào rủi ro.
Kết luận: Bạn có muốn NFT của mình nằm trong một hợp đồng mà bất kỳ ai cũng có thể mint và rút tiền không? Câu hỏi sẽ trở nên thực tế khi một script bot quét mã nguồn và phát hiện lỗ hổng. Văn Lang Art chỉ là một trong số hàng trăm dự án tương tự. Thị trường giảm sẽ cuốn trôi những dự án thiếu chuyên nghiệp. Đã đến lúc cộng đồng Việt Nam đòi hỏi audit công khai trước khi FOMO.