Solidityコンパイラの脆弱性分析:見過ごせないスマートコントラクトのリスク

robot
概要作成中

Solidityコンパイラの脆弱性解析と対策

コンパイラは現代のコンピュータシステムの基本コンポーネントの一つであり、その機能は高級プログラミング言語のソースコードをコンピュータが実行可能な命令コードに変換することです。開発者やセキュリティ担当者は通常、アプリケーションコードのセキュリティに注目しますが、コンパイラ自体もコンピュータプログラムであるため、セキュリティの脆弱性が存在する可能性があり、場合によっては深刻なセキュリティリスクを引き起こすことがあります。

例えば、ブラウザがJavaScriptコードをコンパイルして実行する際、解析エンジンの脆弱性によりリモートコード実行が引き起こされ、攻撃者が被害者のブラウザやさらにはオペレーティングシステムを制御することが可能になることがあります。また、C++コンパイラのバグもリモートコード実行などの重大な結果を引き起こす可能性があることが研究によって示されています。

Solidityコンパイラにもセキュリティの脆弱性があります。開発チームのセキュリティ警告に基づき、複数のバージョンのSolidityコンパイラでセキュリティ問題が発見されました。

! 【Solidityコンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/webp-social/moments-7d1e882c0b106528437910218bf21f82.webp)

Solidityコンパイラの役割は、スマートコントラクトコードをEthereum仮想マシン(EVM)命令コードに変換することです。Solidityコンパイラの脆弱性とEVM自体の脆弱性を区別する必要があります。EVMの脆弱性は、仮想マシンが命令を実行する際のセキュリティ問題を指し、Ethereumネットワーク全体に影響を及ぼす可能性があります。一方、Solidityコンパイラの脆弱性は、SolidityをEVMコードに変換する際の問題を指し、Ethereumネットワークに直接影響を与えることはありませんが、生成されたEVMコードが開発者の予想と一致しない結果を招く可能性があります。

スマートコントラクトは通常、ユーザーの暗号通貨資産を関与させるため、コンパイラによるバグは深刻な結果を引き起こす可能性があります。契約のソースコードを監査するだけでは、コンパイラの脆弱性を発見するのは難しく、特定のバージョンとコードパターンを組み合わせて分析する必要があります。

以下のいくつかの実際のケースを通じて、Solidityコンパイラの脆弱性の具体的な形、原因、及び危険性を示します。

SOL-2016-9 HighOrderByteCleanStorage

この脆弱性は、以前のSolidityコンパイラのバージョンに存在します(>=0.1.6 <0.4.4)。

次のコードを考慮してください:

ソリディティ コントラクトC { uint32 a = 0x1234; uint32 b = 0; 関数 f() public { a += 1; } パブリック ビュー run()関数は (uint) { を返します。 bを返す; } }

変数bは変更されておらず、run()関数はデフォルト値0を返すべきですが、脆弱性のあるバージョンのコンパイラによって生成されたコードでは、run()は1を返します。

これは、EVMが32バイトのサイズのスタック要素を使用し、Solidityがuint32などの32バイト未満の型をサポートしているためです。コンパイラはデータの正確性を保証するために高位をクリアする操作を行う必要があります。加算オーバーフロー時に、コンパイラは高位を正しくクリアせず、オーバーフローした1ビットがストレージに書き込まれ、b変数を上書きしました。

SOL-2022-4 インラインアセンブリメモリ副作用

この脆弱性は>=0.8.13 <0.8.15バージョンのコンパイラーに存在します。

次のコードを考えてください:

ソリディティ コントラクトC { function f() public pure は (uint) { を返します。 アセンブリ { mstore(0, 0x42) } uint x; アセンブリ { x := mload(0) } xを返す; } }

コンパイラは最適化プロセスで、コードのサイズを縮小し、ガス消費を最適化するために制御フローとデータフローを分析します。しかし、この最適化はバグを引き起こすことが容易です。

この例では、コンパイラが最初のアセンブリブロックにおけるメモリ0への書き込みが冗長であると誤って判断し、それを削除したため、f()関数が正しい0x42ではなく0を返す結果となりました。

SOL-2022-6 Abi再エンコーディングヘッドオーバーフローと静的配列クリーンアップ

この脆弱性は、バージョン >= 0.5.8 および < 0.8.16 のコンパイラに影響します。

次のコードを考慮してください:

ソリディティ コントラクトC { function f(string[1] calldata a) public pure は (string memory) { を返します。 abi.decode(abi.encode(a)、 (string[1]))[0]; } }

通常、このコードはa変数の値"aaaa"を返すべきです。しかし、脆弱性のあるバージョンでは空の文字列""が返されます。

これは、Solidityがcalldata型の配列に対してabi.encode操作を行う際に、誤っていくつかのデータをクリアしてしまい、隣接するデータが変更されて、エンコードおよびデコードされたデータが不一致になることを引き起こすためです。

注目すべきは、external callとemit eventの際にabi.encodeが暗黙的に行われるため、このような脆弱性が発生する確率が高いことです。

! 【Solidityコンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/webp-social/moments-c97428f89ed62d5ad8551cdb2ba30867.webp)

セキュリティの提案

開発者向け:

  • より新しいバージョンのSolidityコンパイラを使用すると、既知のセキュリティ問題が通常少なくなります。
  • ユニットテストケースを改善し、コードカバレッジを向上させることで、コンパイラによって引き起こされる問題を発見するのに役立ちます。
  • インラインアセンブリや複雑なABIのエンコード・デコードなどの操作を避け、新しい機能や実験的な機能を盲目的に使用しないこと。

セキュリティ担当者向け:

  • 監査の際には、コンパイラが引き起こす可能性のあるリスクを無視しないでください。これはSWC-102のチェック項目です。
  • SDLプロセスで、コンパイラのバージョンアップを推進し、自動チェックの導入を検討します。
  • コンパイラの脆弱性の実際の影響を評価し、過度に恐れる必要はありません。

いくつかの実用的なリソース:

  • Solidity公式のセキュリティ警報ブログ
  • Solidityリポジトリのバグリスト
  • 各バージョンのコンパイラバグリスト
  • Etherscanの契約ページのコンパイラ脆弱性の警告

! 【Solidityコンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp)

つまり、Solidityコンパイラの脆弱性は、スマートコントラクトの実際の動作が期待したものと一致しない可能性があるため、開発者とセキュリティ専門家はこれに警戒し、リスクを低減するための適切な対策を講じるべきです。

ETH0.25%
SOL0.38%
原文表示
このページには第三者のコンテンツが含まれている場合があり、情報提供のみを目的としております(表明・保証をするものではありません)。Gateによる見解の支持や、金融・専門的な助言とみなされるべきものではありません。詳細については免責事項をご覧ください。
  • 報酬
  • 5
  • リポスト
  • 共有
コメント
0/400
ColdWalletGuardianvip
· 08-06 10:09
まだ古いコンパイラを使う鉄のバカがいるのか
原文表示返信0
LayerZeroHerovip
· 08-06 02:28
コンパイラもあまり安定していませんね。
原文表示返信0
RektRecordervip
· 08-03 12:34
こんなに危険で、信じられない家族
原文表示返信0
BearMarketGardenervip
· 08-03 12:30
コンパイラもバグだらけで、寝ている間に資産がなくなってしまった。
原文表示返信0
SnapshotBotvip
· 08-03 12:27
コンパイラがまた問題を起こした 逃げた逃げた
原文表示返信0
いつでもどこでも暗号資産取引
qrCode
スキャンしてGateアプリをダウンロード
コミュニティ
日本語
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)