SafeTransferFrom có thực sự an toàn không?

Bài viết này được dịch máy
Xem bản gốc

Hợp đồng NFT ERC721 cung cấp hai tùy chọn để chuyển NFT: transferFromsafeTransferFrom . Bạn có thể thắc mắc liệu safeTransferFrom có ​​an toàn hơn transferFrom không? Câu trả lời là có hoặc không. Hãy chia nhỏ nó ra:

  • Sự an toàn của safeTransferFrom : Phương pháp này bao gồm kiểm tra để đảm bảo người nhận có thể xử lý chính xác NFT ERC721. Điều này có nghĩa là NFT ít có khả năng bị "kẹt" hơn nếu người nhận là hợp đồng thiếu chức năng xử lý NFT cần thiết.

  • Cảnh báo về an toàn: Mặc dù safeTransferFrom cung cấp biện pháp bảo vệ cho chính NFT nhưng nó không đảm bảo sự an toàn cho hợp đồng của bạn. Trên thực tế, nó có thể gây ra lỗ hổng cho các cuộc tấn công reentrancy. Điều này là do nó kích hoạt một chức năng trong hợp đồng người nhận nếu người nhận là một hợp đồng khác.

Hãy đi sâu vào một ví dụ thực tế. Vào ngày 25 tháng 1 năm 2024, kẻ tấn công đã khai thác lỗ hổng reentrancy trên các hợp đồng NBLGAME . Tổng giá trị ước tính của số tiền khai thác được là khoảng 180.000 USD.

Tổng quan

Kẻ tấn công : https://optimistic.etherscan.io/address/0x1fd0a6a5e232eeba8020a40535ad07013ec4ef12 Hợp đồng tấn công: https://optimistic.etherscan.io/address/0xe4d41bdd6459198b33cc795ff280cee02d91087b Hợp đồng dễ bị tổn thương: https://optimistic.etherscan.io /địa chỉ/0x5499178919c79086fd580d6c5f332a4253244d91 Tấn công TX: https://optimistic.etherscan.io/tx/0xf4fc3b638f1a377cf22b729199a9aeb27fc62fe2983a65c4d14b99ee5c5b2328

Phân tích khai thác

Lỗ hổng bị khai thác bắt nguồn từ lỗ hổng reentrancy trong hàm withdrawNft do nó sử dụng safeTransferFrom khi trả về NFT.

Kẻ tấn công trước tiên gửi NFT sau đó đặt cọc NBL vào hợp đồng. Trong khi withdrawNFT , hợp đồng sẽ gửi lại NFT trước, sau đó trả lại Token đã đặt cọc sau. Vì safeTransferFrom kích hoạt chức năng onERC721Received của hợp đồng của kẻ tấn công nên kẻ tấn công có cơ hội. Trạng thái của hợp đồng không nhất quán vì số tiền NBL đã đặt cược vẫn chưa được khấu trừ. Tại thời điểm này, số lượng NBL đặt cược được lưu trữ theo amount nên kẻ tấn công đã tận dụng onERC721Received để bắt đầu lệnh gọi withdrawNFT , gửi lại NFT trở lại hợp đồng một cách hiệu quả để gọi withdrawNFT .

Lần rút tiền thứ hai đã lấy thành công số token NBL đã đặt cược. Sau đó, lần rút tiền đầu tiên cũng khấu trừ số token NBL khỏi amount được lưu trữ trước đó, số tiền này vẫn còn nguyên do đăng ký lại. Việc khai thác đã thành công và kẻ tấn công đã nhận được gấp đôi số token đặt cọc.

Phần kết luận

Khi làm việc với hợp đồng thông minh ERC721 NFT, hãy luôn lưu ý rằng chức năng safeTransferFrom sẽ kích hoạt onERC721Received ở người nhận để họ có thể dễ bị tấn công vào lại. Dưới đây là hai cách hiệu quả để giảm thiểu rủi ro này:

  • Mẫu kiểm tra-Hiệu ứng-Tương tác : Mẫu này nhấn mạnh việc cập nhật các biến trạng thái của hợp đồng của bạn trước khi thực hiện bất kỳ lệnh gọi bên ngoài nào. Điều này ngăn kẻ tấn công thao túng trạng thái của hợp đồng trong cuộc gọi bên ngoài.

  • ReentrancyGuard : Cân nhắc sử dụng cơ chế ReentrancyGuard trong tất cả các chức năng công khai/bên ngoài. Điều này thêm một công cụ sửa đổi ngăn các chức năng được nhập lại trước khi cuộc gọi ban đầu hoàn tất.

Để bảo mật tối đa, bạn nên áp dụng cả hai phương pháp trong hợp đồng của mình bất cứ khi nào có thể. Mặc dù ReentrancyGuard phải chịu một khoản chi phí gas nhỏ nhưng nó cung cấp thêm một lớp bảo vệ chống lại các cuộc tấn công reentrancy.

Cảm ơn đã đọc Verichains! Đăng ký miễn phí để nhận bài viết mới và hỗ trợ công việc của tôi.

Nguồn
Tuyên bố từ chối trách nhiệm: Nội dung trên chỉ là ý kiến của tác giả, không đại diện cho bất kỳ lập trường nào của Followin, không nhằm mục đích và sẽ không được hiểu hay hiểu là lời khuyên đầu tư từ Followin.
Thích
Thêm vào Yêu thích
Bình luận