Back to Blog

NFTコントラクトにおけるコード再入:セキュアなスマートコントラクト開発

Code Auditing
2022年8月5日
5 min read

はじめに

EthereumにおけるNFTエコシステムの隆盛と、それに伴うセキュリティ問題の増加を鑑み、本シリーズではこれらのセキュリティ問題を紹介し、開発者向けにコントラクトを安全に保つための提案を行います。本稿では、NFTコントラクトにおけるリエントランシー問題と、関連する脆弱性の軽減策について解説します。

リエントランシーとは

Wikipediaによると

コンピューティングにおいて、コンピュータプログラムまたはサブルーチンは、複数の invoc者が複数のプロセッサで安全に並行して実行できる場合、または単一のプロセッサシステムで、リエントラントなプロシージャは、その実行の途中で中断され、以前の invoc者が実行を完了する前に安全に再度呼び出される(「再入力」される)ことができる場合、リエントラントであると呼ばれます。

スマートコントラクトでは、関数が別のコントラクトの外部呼び出しを実行し、その外部呼び出しが元の関数呼び出しが返される前に元の関数(または他の関数)をさらに呼び出す場合に、リエントランシーが発生する可能性があります。外部呼び出しが信頼できないエンティティ(例:悪意のあるコントラクト)によって制御されている場合、予期せぬ結果につながる可能性があります。これは、一部の関数では結果がコントラクトの状態に依存するためです。コントラクトの状態は、外部呼び出しの後に更新されます。しかし、関数のリエントラントな呼び出しは、更新された状態ではなく、古い状態を使用します。

リエントランシーは、スマートコントラクトにおける一般的な問題です。例えば、MakerDAO攻撃や、Uniswap上のERC777などが挙げられます(BlockSec Academyでリエントランシーを検索)。

NFTにおけるリエントランシー

NFTコントラクトでは、開発者が見落としがちな暗黙的な外部関数呼び出しが存在する場合があります。これには onERC721Received および onERC1155Received 関数が含まれます。onERC721Received 関数は、受信側コントラクトがNFTを処理できるかどうかを確認するために設計されています(NFTが永久にロックされるのを防ぐため)。この関数は、ERC721コントラクトの safeTransferFrom および _safeMint で呼び出されます。ERC1155コントラクトにも同様のものが存在します。これらの外部関数呼び出しにより、コントラクト開発者に気づかれずにリエントランシーが発生する可能性があります。

シングルファンクションリエントランシー

シングルファンクションリエントランシーは、リエントランシー攻撃のより単純な形態です。この種のリエントランシー攻撃では、再入力される関数は元の関数と同じです。攻撃者は、関数の最初の呼び出しが完了する前に、関数を繰り返し呼び出すことができます。NFTコントラクトでは、これは通常 mint 操作に関連する関数で発生します。

例えば、一部のNFTプロジェクトでは、各ユーザーに無料でNFTをミントする機会を与えたり、プロジェクト全体の最大供給量を設定したり、1人のユーザーが保有できるNFTの最大量を設定したりする場合があります。通常、これらの制約は実際のミント操作の前にチェックされます。しかし、これらの制約に関連する状態が safeMint 関数の後に更新される場合、攻撃者はこのミント関数に再入力して制約を回避できます。これは、関連する状態がこの関数の最初の呼び出しと同じであるためです。以前のブログで投稿されたHypeBearsのリエントランシー攻撃がその例です。

より複雑なシングルファンクションリエントランシーは、safeMint 関数がループ内で使用され、制約がループの開始前にチェックされる場合に発生します。このシナリオでは、一部の状態が外部呼び出しの前に自動的に更新されるとしても、ループがすでに開始され、検証がループの開始前に行われるため、ループ内の残りの safeMint 関数呼び出しは引き続き検証を回避できます。

例えば、別の投稿で示されている例では、mintNFT 関数は、ユーザーがミントしたいNFTの数と現在の供給量を合計しても最大供給量を超えないかどうかをチェックします。safeMint 関数は、onERC721Received 外部呼び出しの前に総供給量を更新します。攻撃者は、safeMint 関数が一度に総供給量を1ずつしか増やさないため、依然としてこれを悪用できます。したがって、攻撃者がループ内の safeMint の最初の関数呼び出しで mintNFT 関数に再入力すると、総供給量は、mintNFT の最初の呼び出しでミントされるNFTの量ではなく、古い供給量に1を加えたものになります。

クロスファンクションリエントランシー

攻撃者は、同じ関数に入力する代わりに、元の関数と状態を共有または依存する別の関数に入力できます。以前のブログでは、RevestケースとOMNIケースでいくつかのケースを詳細に説明しました。

まとめと提案

NFTスマートコントラクト開発者がリエントランシーの脅威を軽減するための提案を以下に示します。

  1. コードでChecks-Effects-Interactionsパターンを使用してください。
  2. 外部呼び出しを導入するサードパーティライブラリを使用する際は注意してください。NFTコントラクトでは、onERC721Received および onERC1155Received 関数の暗黙的なコールバックに注意してください。

本シリーズの他の記事を読む

BlockSecについて

BlockSecは、2021年に世界的に著名なセキュリティ専門家チームによって設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、Web3の普及を促進するために、新興のWeb3世界のセキュリティとユーザビリティの向上に尽力しています。この目的のため、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3開発者が仮想通貨の世界を効率的にサーフィンするためのMetaSuites拡張機能を提供しています。

現在までに、MetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの有力な投資家から2回の資金調達ラウンドで数千万米ドルを獲得しています。

公式ウェブサイト:https://blocksec.com/

公式Twitterアカウント:https://twitter.com/BlockSecTeam

Sign up for the latest updates
安全な保管を超えて、第2部:ウォレットの暗号技術を安全に実装する
Security Insights

安全な保管を超えて、第2部:ウォレットの暗号技術を安全に実装する

攻撃者は、保護された秘密鍵のコピーを読み取らずに、その秘密鍵を復元できるのでしょうか。『Beyond Secure Storage』の第2部では、乱数の品質不足、エントロピーの損失、署名用ノンスの不備によって鍵の予測や復元が可能になった6件の事例を検証します。そこから鍵生成と署名に関する実装要件を導き出し、決済機関がコードレビューと導入済みシステムのテストを通じて、それらをどう評価できるかを説明します。

安全な保管を超えて、第1部:安全な決済・署名ワークフローの設計
Security Insights

安全な保管を超えて、第1部:安全な決済・署名ワークフローの設計

攻撃者が秘密鍵を盗まずに、認可されていない操作が有効な署名を得ることは、なぜ可能なのでしょうか。「安全な保管の先へ」第1回では、Bitget、Bybit、Binanceなどの事例を通じて、支払い要求、トランザクションの構築、署名、実行、決済の各段階における認可の不備を検討します。そのうえで、認可されていない操作を防ぎ、損失を抑えるための設計原則を導き出し、レビュー、監査、ペネトレーションテスト、演習によって、それらの防御策をどう検証できるかを説明します。

NEAR Intentsの悪用:返金処理の欠陥とセキュリティ上の教訓
Security Insights

NEAR Intentsの悪用:返金処理の欠陥とセキュリティ上の教訓

NEAR Intentsへの攻撃では、過大な払い戻しイベントを利用し、預け入れた資産が返還された後も内部残高を維持しました。本分析では、レシートの処理の流れと、合計3,865,021 USDTに上るBNB Chainでの7件の出金を再構成します。また、これらの資金流出とプロジェクトが報告した全額回収を区別し、NEARスマートコントラクトの開発と監査におけるセキュリティ上の考慮事項を示します。

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
NFTコントラクトにおけるコード再入:セキュアなスマートコントラクト開発