Security Lab đã theo dõi các NFT của TreasuryDAO trên Arbitrum. Đã có nhiều giao dịch bất thường trên thị trường giao dịch và tin tặc đã lấy được một số NFT miễn phí thông qua các sơ hở. Chuangyu Blockchain Security Lab sẽ theo dõi và phân tích sâu về sự cố này.
Phân tích sự việc
Các thông tin cơ bản
Mã hash của giao dịch: 0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b
TreasureMarketplace:0x2E3b85F85628301a0Bce300Dee3A6B04195A15Ee
TreasureMarketplaceBuyer:0x812cdA2181ed7c45a35a691E0C85E231D218E273
Các bước tấn công
Hacker đã gọi hàm buyItem của TreasureMarketplaceBuyer để mua NFT, nhưng chúng ta có thể thấy từ inputData rằng thông số _quantity được truyền vào là 0. Mặc dù số NFT mua đến là 0, nhưng những kẻ tấn công đã quản lý để có được NFT số [5490] và không có token trong Tokens Tranferred.
Tấn công vào hệ thống
Theo phân tích ở trên, cốt lõi của vấn đề có thể xuất hiện trong chức năng buyItem của TreeMarketplaceBuyer. Sau khi phân tích theo dõi, thấy rằng sau khi người dùng gọi hàm, hợp đồng đầu tiên sẽ tính giá mà người dùng mua NFT, tính tổng giá theo số lượng NFT mua và chuyển token vào hợp đồng; sau đó gọi hàm buyItem của fundMarketplace để mua NFT mà người dùng cần mua từ Marketplace, gửi đến TreeMarketplaceBuyer và cuối cùng gửi NFT đến tài khoản của người dùng. Quan sát các dòng 43-46, người ta thấy rằng việc chuyển giao NFT sang định dạng ERC-721 không được đánh giá về mặt số lượng, và nếu _quantity tại thời điểm này là 0, người dùng vẫn sẽ nhận được NFT.
Tiếp tục với hàm buyItem của fundMarketplace, người ta thấy rằng khi hợp đồng thay thế NFT khỏi chợ, nó chỉ cần đáp ứng điều kiện: ListItem.quantity> = _quantity và sau đó bắt đầu chuyển NFT sang hợp đồng RealityMarketplaceBuyer và nếu _quantity tại thời điểm này là 0, NFT vẫn sẽ được chuyển đến TheTreasureMarketplaceBuyer.
Dựa trên phân tích ở trên, ta thấy rằng khi kẻ tấn công gọi hàm buyItem của TreasureMarketplaceBuyer để mua NFT, nếu giá trị của tham số _quantity là 0, bởi vì hợp đồng không đánh giá số lần chuyển NFT và giá tính được khi đó totalPrice = _pricePerItem * _quantity =0, Kết quả là kẻ tấn công sẽ có thể lấy được NFT ERC-721 trên thị trường miễn phí.
Tóm tắt
Nguyên nhân chính của cuộc tấn công này là do phía dự án đã không đưa ra các phán đoán đầy đủ về số lượng giao dịch chuyển NFT, và không tính đến hành vi mua số lượng mua bằng 0 NFT có chủ đích. Chuangyu Blockchain Security Lab cho biết đây là nhắc nhở rằng bất kỳ hoạt động nào liên quan đến chuyển token đều cần được xem xét cẩn thận và kiểm tra hợp đồng, các biện pháp kiểm soát rủi ro, kế hoạch dự phòng, … cần được thực hiện một cách hiệu quả.