### Hook Một dự án NFT vừa huy động 15.000 ETH – gọi nó là PixelPride – đã bị tôi phát hiện lỗ hổng metadata ngay trong tuần đầu kiểm toán. Metadata URI có thể bị thay đổi sau mint mà không cần signature mới. Tôi viết exploit script chỉ ra rằng 80% bộ sưu tập trong dự án này có thể bị rug-pull chỉ bằng cách sửa một dòng JSON trên IPFS. Dự án vá lỗi sau 2 tuần, nhưng 3 bộ sưu tập fork từ code của họ đã mất tổng cộng 200 ETH.
### Context DeFi Summer 2020 đã dạy chúng ta rằng oracle manipulation có thể đánh sập pool thanh khoản. Nhưng NFT market – vốn được coi là “an toàn hơn” vì ít phức tạp – lại ẩn chứa một lớp rủi ro off-chain mà hầu hết audit bỏ qua: metadata. Khi bạn mint một NFT, hợp đồng thông minh chỉ lưu một URI trỏ đến dữ liệu ngoài chuỗi: hình ảnh, thuộc tính, quyền sở hữu. Nếu URI đó có thể bị chỉnh sửa sau mint, “quyền sở hữu” của bạn chỉ là ảo ảnh. PixelPride, một marketplace fork từ LooksRare, đã copy nguyên logic verify signature mà không kiểm tra tính bất biến của metadata. Đây là lỗi kinh điển: nhóm dev nghĩ rằng “chỉ cần signature đúng là an toàn”. Họ quên rằng metadata nằm ngoài tầm kiểm soát của on-chain.
### Core Đếm sai một, mất cả kho. Metadata lỗi – niềm tin sập. Tôi mất 3 ngày để đọc hợp đồng thông minh của PixelPride. Hàm updateMetadata cho phép chủ sở hữu (owner) thay đổi baseURI bất kỳ lúc nào, và không có cơ chế nào trên chuỗi để xác minh rằng metadata cũ đã bị khóa. Điều này có nghĩa: sau khi người dùng mint NFT với hình ảnh “hiếm”, kẻ tấn công (thường là owner) có thể gọi hàm setBaseURI và gán một URI mới trỏ đến hình ảnh rác hoặc thông tin sai lệch. Người dùng vẫn thấy token ID của họ tồn tại, nhưng nội dung bên trong đã bị thay thế. Tôi chạy thử nghiệm với 100 ETH giả trên mạng testnet: exploit thành công trong 2 block. Vấn đề nằm ở logic verifySignature – nó chỉ kiểm tra xem người ký có phải là owner hay không, chứ không kiểm tra xem nội dung metadata có bị thay đổi kể từ lần mint cuối cùng hay không. Thực tế, signature trong hợp đồng này chỉ dùng để xác thực hành động “mint”, không phải để xác thực dữ liệu off-chain. Đây là lỗi thiết kế cốt lõi. Khi tôi báo cáo với đội ngũ PixelPride, họ nói “chưa từng có ai khai thác”. Tôi trả lời: “Đây là proof-of-concept.” Ba tháng sau, một fork của họ – PixelDream – bị hack mất 300 ETH do cùng lỗ hổng. Tôi viết bài phân tích này không phải để khoe, mà để nhấn mạnh: dù contract có được audit 3 lần, nếu không kiểm tra off-chain metadata, bạn vẫn đang đặt cược vào lòng tin mù quáng.
### Contrarian Phần phe bò sẽ nói: “Nhưng thị trường NFT vẫn đang phát triển, người dùng quan tâm đến floor price hơn là metadata.” Sai. Floor price chỉ có ý nghĩa nếu tính xác thực của tài sản được đảm bảo. Khi người dùng mua một NFT với giá 10 ETH để làm profile picture, họ thực sự mua quyền sở hữu đối với dữ liệu hình ảnh đó. Nếu metadata có thể bị thay đổi, giá trị của NFT đó sụp đổ ngay lập tức. Hơn nữa, các sàn giao dịch thứ cấp (OpenSea, Blur) thường lấy metadata từ URI trong contract. Nếu URI thay đổi, ảnh hiển thị trên sàn cũng thay đổi, dẫn đến hiểu lầm và kiện tụng. Câu chuyện này cho thấy: ngay cả những dự án huy động vốn khủng cũng mắc lỗi sơ đẳng. Các nhà đầu tư đang FOMO vào NFT mà không kiểm tra xem contract có cho phép owner thay đổi metadata hay không. Đây là điểm mù của cả người mua lẫn auditor truyền thống.
### Takeaway Trước khi mint bất kỳ NFT nào, hãy kiểm tra hàm setBaseURI hoặc updateTokenURI trong contract. Nếu tồn tại, hãy hỏi đội ngũ dự án: “Ai có quyền gọi nó? Có cơ chế timestamp khóa metadata không?” Nếu câu trả lời mơ hồ, hãy nghĩ lại. Một dòng JSON có thể xóa sạch niềm tin – và cả tiền của bạn.