新興の高性能ブロックチェーン プラットフォームとして、Sui は多くの革新的なテクノロジーと独自性を備えていると同時に、さまざまなアプリケーション シナリオに高速で安全なトランザクション エクスペリエンスを提供することに重点を置いています。 Sai に関する基本的な知識については、「Exploring Sui: Technology and Contract Security Behind High Performance」を参照してください。ブロックチェーンで一般的に使用されている他のプログラミング言語(Solidityなど)とは異なり、SuiはMove言語を使用しており、再入攻撃や整数オーバーフローなど、Solidityによくある脆弱性問題をある程度解決できます。 、二重支出、DoS 攻撃、コンパイラの問題はありますが、開発者がコードにエラーを導入することを防ぐことはできません。したがって、開発者は、スマート コントラクトのセキュリティを確保するために、それらを使用する場合、いくつかの独自の機能や機能を理解し、注意を払う必要があります。
SlowMist セキュリティ チームは、Sui コミュニティが共有するセキュリティ開発プラクティスを統合および吸収し、長年にわたって蓄積された独自のセキュリティ監査経験と組み合わせて、Sui-Move 契約監査入門をリリースしました。これは、開発者がセキュリティ リスクをより深く理解できるようにすることを目的としています。スマート コントラクトを作成し、潜在的なセキュリティ脅威を軽減する実用的なソリューションを提供します。
スペースの制限のため、この記事では、Sui-Move コントラクト監査の概要の一部のみを記載します。GitHub での Watch、Fork、Star を歓迎します: https://github.com/slowmist/Sui-MOVE-Smart-Contract-。 Auditing-Primer/blob/main/README_CN.md。
1. モジュールの宣言と可視性
1.1 「public(friend)」機能(Sui最新版では「public(friend)」が「public(package)」に置き換えられます)
定義: 指定されたフレンド モジュールのみがアクセスできるように関数を宣言するために使用されます。これにより、「パブリック」と「プライベート」の間で、よりきめ細かいアクセス制御が提供されます。
例:
1.2 「エントリー」機能
定義: 「entry」関数はモジュールのエントリ ポイントであり、トランザクション ブロック内からの直接呼び出しを許可します。パラメーターはトランザクション ブロックへの入力から取得する必要があり、ブロック内の以前のトランザクションの結果や変更されたデータにすることはできません。さらに、「entry」関数は「drop」機能を持つ型のみを返すことができます。
例:
定義: 「entry」関数はモジュールのエントリ ポイントであり、トランザクション ブロック内からの直接呼び出しを許可します。パラメーターはトランザクション ブロックへの入力から取得する必要があり、ブロック内の以前のトランザクションの結果や変更されたデータにすることはできません。さらに、「entry」関数は「drop」機能を持つ型のみを返すことができます。
例:
1.3 「パブリック」機能
定義: 「パブリック」関数は、外部対話に適したトランザクション ブロックや他のモジュールから呼び出すことができます。 「エントリ」関数のようなパラメータや戻り値の制限はなく、通常は機能を外部に公開するために使用されます。
例:
2. オブジェクト管理
2.1 オブジェクトの一意性
定義: 各Suiオブジェクトには一意の「objID」があり、チェーン上のオブジェクトの一意性が保証されます。
2.2 梱包と開梱
意味:
- 直接ラッピング: スイ オブジェクトを別のオブジェクトのフィールドとして使用します。ラッピングを解除するときにラッピング オブジェクトを破棄する必要があります。
- オブジェクトのパッケージ化: パッケージ化されたオブジェクトは別のオブジェクトの一部となり、独立して存在しなくなります。オブジェクトの ID は、解凍後も変更されません。
2.3 カスタム転送戦略
定義: 「suit::transfer::transfer」を使用してカスタム転送戦略を定義します。「store」機能を持つオブジェクトの場合は、「sui::transfer::public_transfer」を通じて作成できます。
2.4 オブジェクトのプロパティ
定義:Sui オブジェクトのプロパティには、「コピー」、「ドロップ」、「ストア」、および「キー」が含まれ、オブジェクトの動作を決定します。
2.5 オブジェクトの権限チェック
- アドレス所有オブジェクト
定義: 特定のアドレス (アカウント アドレスまたはオブジェクト ID) によって所有されるオブジェクト。オブジェクトの所有者のみがこれらのオブジェクトにアクセスして操作できます。
- 不変オブジェクト
定義: 不変オブジェクトは変更または転送できず、誰でもアクセスできます。グローバル アクセスが必要だが変更する必要はないデータに適しています。
- 共有オブジェクト
定義: 共有オブジェクトは複数のユーザーがアクセスして操作でき、分散アプリケーションなどのシナリオに適していますが、コンセンサスが必要なため、操作コストが高くなります。
- ラップされたオブジェクト
定義: オブジェクトのラップとは、あるオブジェクトを別のオブジェクトに埋め込むことです。ラップされたオブジェクトは独立して存在しないため、ラッピング オブジェクトを通じてアクセスする必要があります。
3. セキュリティチェック
3.1 数値オーバーフローチェック
定義: オブジェクトのラップとは、あるオブジェクトを別のオブジェクトに埋め込むことです。ラップされたオブジェクトは独立して存在しないため、ラッピング オブジェクトを通じてアクセスする必要があります。
3. セキュリティチェック
3.1 数値オーバーフローチェック
Sui のスマート コントラクトは、デフォルトで数値オーバーフロー チェックを実行します。
3.2 再入チェック
いわゆるリエントランシー攻撃は、通常のコントラクト コール トランザクションに予期しない (外部) コールを挿入する行為で、これによりビジネス コール プロセス全体が変更され、違法な利益が得られます。外部コントラクト呼び出しが関与する場合は常に、潜在的な再入リスクが存在する可能性があります。現在のリエントランシーの問題は、単一機能のリエントランシー、クロスファンクションのリエントランシー、クロスコントラクトのリエントランシーの 3 つのカテゴリに分類できます。 Move 言語のいくつかの機能は、再入攻撃に対する自然な保護を提供します。
- Move には動的呼び出しはなく、すべての外部呼び出しは最初に使用を通じてインポートする必要があります。つまり、外部呼び出しは予期され、決定されます。
- ネイティブ トークン転送がない場合、フォールバック機能がトリガーされます。
- Move では、リソース モデルにより、一度に 1 つの実行コンテキストのみがリソースにアクセスできることが保証されます。これは、関数の実行が完了しない場合、実行が完了するまで他の関数は同じリソースにアクセスできないことを意味します。
1. オーバーフロー監査
注: Move は、数学的演算を実行するときにオーバーフロー チェックを実行します。演算がオーバーフローすると、トランザクションは失敗します。ただし、Move はビット操作のオーバーフロー チェックを実行しないことに注意してください。
位置特定: コード内でビット演算が実行される位置を見つけ、オーバーフローの危険性があるかどうかを確認します。
2. 算術精度エラー監査
注: Move には浮動小数点型はありません。したがって、算術演算を実行する場合、演算結果を浮動小数点数で表現する必要がある場合、精度誤差が発生する可能性があります。精度誤差を完全に回避するのは場合によっては困難ですが、最適化と合理的な設計によってその影響を軽減できます。
位置付け: 算術演算、特に精度誤差を引き起こす可能性のある計算を含むコードのすべての部分をレビューし、これらの演算が契約ロジックや数値精度に悪影響を与えないことを確認し、精度誤差を軽減するための最適化の推奨事項を作成します。
3. 条件付き競争監査
注:Sui のバリデーターは、ユーザーが送信したトランザクションを並べ替えることもできるため、監査では、同じブロック内のトランザクションの並べ替えによる利益の問題に依然として注意を払う必要があります。
位置:
- 関数が呼び出される前に、コントラクトのデータ状態を管理することは期待されていますか?
- 関数実行中にコントラクトデータの状態を管理する必要があるかどうか。
- 関数呼び出し後にコントラクトデータの状態を管理することは期待されていますか?
4. アクセス制御監査
注: ユーザーの入金額を直接更新できる機能など、契約内の特定の主要な機能は内部呼び出しに限定する必要があります。これらの機能が誤って外部に公開されると、権限制御がバイパスされ、セキュリティ上の脆弱性が発生したり、資産が損失したりする可能性があります。したがって、アクセス許可を厳密に設定して、承認されたロールまたはモジュールのみがこれらの関数を呼び出せるようにするか、関数が内部でのみ使用できるようにする必要があります。
位置付け: すべての関数、特に外部に公開すべきではない関数のアクセス制御設定をチェックして、それらの関数が内部でのみ呼び出せることを確認する必要があります。公開すべきではない機能インターフェイスが公開されていることが判明した場合は、高リスクとしてマークされ、修正提案が行われなければなりません。
5. オブジェクト管理監査
注:Sui では、オブジェクトを共有オブジェクト (共有オブジェクト) に変換できます。これは、オブジェクトのアクセス権がプライベートからパブリックに変更される可能性があることを意味します。したがって、使用されるすべてのオブジェクトを精査して、各オブジェクトが静的であるか共有であるかを判断する必要があります。オブジェクトがプライベート オブジェクトから共有オブジェクトに誤って変換されていないか特に注意してください。これにより、権限のないユーザーがこれらのオブジェクトにアクセスし、潜在的なセキュリティ リスクが生じる可能性があります。
位置付け: モジュールに関係するすべてのオブジェクトを整理および分析し、オブジェクトのタイプと権限設定を確認して、オブジェクトの権限がビジネス要件と一致していることを確認します。プライベート オブジェクトが誤って共有オブジェクトに変換されたことが判明した場合は、潜在的なリスクとしてフラグを立て、修正を推奨する必要があります。
6. トークン消費の監査
位置付け: モジュールに関係するすべてのオブジェクトを整理および分析し、オブジェクトのタイプと権限設定を確認して、オブジェクトの権限がビジネス要件と一致していることを確認します。プライベート オブジェクトが誤って共有オブジェクトに変換されたことが判明した場合は、潜在的なリスクとしてフラグを立て、修正を推奨する必要があります。
6. トークン消費の監査
注:Sui のトークン モデルは他のチェーンのトークン モデルとは異なります。 Sui では、オブジェクトがトークンを保持できるようになり、トークン オブジェクトを他のオブジェクト内にネストして分割することができます。したがって、トークンの消費が関係するシナリオでは、セキュリティの問題や予期せぬ損失を避けるために、トークンの管理と流通に特別な注意を払う必要があります。
位置:
- 消費量が正確であることを確認してください。
- トークンオブジェクトが正しく転送されたことを確認してください。
- トークンの分割と結合が正当であるかどうかを確認します。
- オブジェクトへのトークンのバインドを確認します。
7. フラッシュローン攻撃の監査
注:Sui's Moveにはフラッシュローン(ホットポテト)の使用法もあります。ユーザーは一度の取引で多額の資金を借り入れて好きなだけ利用することができ、取引内で資金を返却するだけで済みます。悪意のあるユーザーは通常、フラッシュ ローンを使用して自分の資金を拡大し、価格操作などの大規模な資金攻撃を実行します。
ポジショニング: プロトコル自体のアルゴリズム (報酬、金利など) とオラクル マシンへの依存が合理的かどうかを分析します。
8. 権限の脆弱性監査
注:Sui の Move コントラクトでは、パーミッションの抜け穴はビジネス ニーズと機能設計に密接に関係しているため、より複雑なモジュールに遭遇した場合は、各メソッドの呼び出しパーミッションをプロジェクト パーティに確認する必要があります (ここでのパーミッションは通常、関数を指します)。可視性と関数呼び出しの権限)。
位置:
- すべての関数メソッドの可視性と呼び出し権限をチェックして確認します。プロジェクトの評価段階で、プロジェクト当事者は設計ドキュメントの提供を要求され、設計ドキュメントの記述に基づいて権限が確認されます。
- プロジェクト チームのロールの権限の範囲を整理します。プロジェクト チームのロールの権限がユーザーの資産に影響を与える場合、権限が過剰になる可能性があります。
- 外部関数で渡されたオブジェクトのタイプを分析します。それが何らかの特権関数である場合、一部の特権オブジェクトが参加する必要があります。
9. 契約アップグレードのセキュリティ監査
注: Move では、外部モジュールは use キーワードを通じてインポートされます。スイの契約はアップグレード可能ですが、公開された契約パッケージは不変オブジェクトであり、一度公開すると取り消したり変更したりすることはできないことに注意してください。契約アップグレードの本質は、更新された契約を新しいアドレスで再発行し、古いバージョンの契約のデータを新しい契約に移行することです。したがって、契約のアップグレード プロセス中は特別な注意を払う必要があります。
- 「init」関数: 「init」関数は、契約が初めてリリースされるときにのみ実行され、その後の契約のアップグレードが発生したときに再度トリガーされることはありません。
- コントラクトをアップグレードしても依存関係は自動的に更新されません。コントラクト パッケージが外部パッケージに依存している場合、外部パッケージがアップグレードされても、契約パッケージはアップグレードされたコントラクト アドレスを自動的に指しません。したがって、新しい依存関係を指定するには、契約パッケージを手動でアップグレードする必要があります。
位置付け: 契約のアップグレード プロセス中にデータ移行ロジックの詳細な検査を実施し、移行操作が安全かつ正確であることを確認し、重要なデータの欠落や更新への依存の問題を回避する必要があります。
10. 外部通話のセキュリティ監査
注: 外部モジュールの使用状況の監査項目と同様に、Move での外部呼び出しでは最初に外部モジュールをインポートする必要があるため、理論上、外部呼び出しの結果は開発者が期待するものであり、主に必要なのは外部モジュールの安定性です。
位置付け: 外部からインポートされたライブラリをチェックする必要があります。
11. 戻り値の確認
注: 他のスマート コントラクト言語と同様に、Move コントラクトでは、特定の関数の戻り値をチェックする必要があります。これらの戻り値の処理を無視すると、キーロジックが正しく実行されず、セキュリティ上の問題が発生する可能性があります。
位置付け: コード内のすべての関数呼び出しの戻り値、特に外部呼び出しや重要なステータス更新を伴う関数呼び出しの戻り値を確認する必要があります。戻り値が処理または検証されない場合、予期しない動作が発生する可能性があるため、潜在的なリスク ポイントとしてマークする必要があります。
12. サービス拒否監査
注: サービス拒否 (DoS) 攻撃は、コード ロジック エラー、互換性の問題、またはその他のセキュリティの脆弱性によって引き起こされる可能性があり、スマート コントラクトが適切に機能しなくなることがあります。このような問題は、契約の可用性に影響を与えたり、契約を完全に麻痺させたりする可能性があります。
12. サービス拒否監査
注: サービス拒否 (DoS) 攻撃は、コード ロジック エラー、互換性の問題、またはその他のセキュリティ脆弱性によって引き起こされる可能性があり、スマート コントラクトが適切に機能しなくなることがあります。このような問題は、契約の可用性に影響を与えたり、契約を完全に麻痺させたりする可能性があります。
位置:
- ビジネス ロジックの堅牢性をチェックして、さまざまな状況下で正常に実行できること、およびエラーや抜け穴によって契約が中断されないことを確認することに重点を置きます。
- 外部モジュールと対話する部分に注意し、それらの互換性を確保して、外部依存関係の問題によるサービスの中断を防ぎます。
13. ガス最適化監査
注: Ethereum と同様に、Sui にも Gas メカニズムがあり、モジュール スクリプトの呼び出しはすべて Gas を消費します。したがって、長くて複雑なコードを最適化する必要があります。
位置:
- 分離できるかどうかを確認するための複雑な呼び出しが必要です。
- 関数の内部実行の効率を最適化できるかどうかを確認するために、高頻度の呼び出しが必要になります。
14. 設計ロジックの監査
注: 設計ロジック監査の焦点は、ビジネス プロセスとコードの実装をチェックして、設計上の欠陥や期待からの逸脱がないかどうかを確認することです。予期されるロジックと一致しないコード実装は、予期しない動作やセキュリティ リスクにつながる可能性があります。
位置:
- さまざまな役割の権限と範囲に基づいて、ビジネス プロセス内で考えられる呼び出しパスを分類します。
- 各ビジネス プロセスに関係するデータの範囲を決定し、データ操作がビジネス設計と一貫していることを確認します。
- 実際のコール パスと予想されるビジネス プロセスを比較し、予期しない結果につながる可能性のあるコール状況を特定して分析します。
15. その他
上記表現に反映されていない内容。
開発者にとって、これらのベスト プラクティスに従うことで、スマート コントラクトのセキュリティを効果的に向上させ、潜在的なセキュリティ リスクを軽減できます。このベストプラクティスが、より多くの開発者が安全で信頼できるスマートコントラクトを作成し、ブロックチェーンテクノロジーの健全な発展を促進するのに役立つことが期待されています。
参照:
[1] https://intro.sui-book.com/
[2] https://docs.sui.io/
[3] https://move-dao.github.io/move-book-zh/introduction.html
著者 | 勝利!
編集者リサ
全てのコメント