2月3日午前(+8時台)、当社のシステムは、HypeBears NFTコントラクトに対する攻撃トランザクション0xfa97c3476aa8aeac662dae0cc3f0d3da48472ff4e7c55d0e305901ec37a2f704を報告しました。調査の結果、ERC721の_safeMint関数によって引き起こされたリエントランシー攻撃であることが判明しました。
原因
プロジェクトには、アカウントがミントできるNFTの数に制限があります。基本的に、NFTをミントしたかどうかを記録するaddressMintedというマップがあります。
NFTをミントする際、コードはOZリファレンス実装の_safeMint関数を使用します。この関数は、受信者がERC721トークンを受信できるかどうかを確認するため、safeです。これにより、ERC721トークンを処理できないコントラクトにNFTがミントされるのを防ぐことができます。以下は、ドキュメントによると:
toがスマートコントラクトを参照する場合、IERC721Receiver.onERC721Receivedを実装する必要があります。これはセーフ転送時に呼び出されます。以下のコードは、
_safeMint関数のOZ実装を示しています。

しかし、この外部関数呼び出しはセキュリティ上の脆弱性を生み出します。具体的には、攻撃者はonERC721Receivedコールバック内でリエントラント呼び出しを実行できます。例えば、脆弱なHypeBearsコントラクトでは、攻撃者はonERC721Receivedコールバック内でmintNFT関数を再度呼び出すことができます(addressMintedがまだ更新されていないため)。

攻撃
以下のスクリーンショットは、攻撃トランザクションを示しています。

教訓
SafeMintによって引き起こされるリスクは、セキュリティ研究者によって議論されてきました。link1 link2。しかし、依然として脆弱なコードと実際の攻撃を目にすることができます。QBridgeセキュリティインシデントのsafeTransferで示されているように、安全な関数を使用しても、安全なコントラクトが保証されるわけではありません😃。



