# Solidityコンパイラの脆弱性解析と対策コンパイラは現代のコンピュータシステムの基本コンポーネントの一つであり、その機能は高級プログラミング言語のソースコードをコンピュータが実行可能な命令コードに変換することです。開発者やセキュリティ担当者は通常、アプリケーションコードのセキュリティに注目しますが、コンパイラ自体もコンピュータプログラムであるため、セキュリティの脆弱性が存在する可能性があり、場合によっては深刻なセキュリティリスクを引き起こすことがあります。例えば、ブラウザがJavaScriptコードをコンパイルして実行する際、解析エンジンの脆弱性によりリモートコード実行が引き起こされ、攻撃者が被害者のブラウザやさらにはオペレーティングシステムを制御することが可能になることがあります。また、C++コンパイラのバグもリモートコード実行などの重大な結果を引き起こす可能性があることが研究によって示されています。Solidityコンパイラにもセキュリティの脆弱性があります。開発チームのセキュリティ警告に基づき、複数のバージョンのSolidityコンパイラでセキュリティ問題が発見されました。! 【Solidityコンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/social/moments-7d1e882c0b106528437910218bf21f82)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/social/moments-c97428f89ed62d5ad8551cdb2ba30867)## セキュリティの提案開発者向け:- より新しいバージョンのSolidityコンパイラを使用すると、既知のセキュリティ問題が通常少なくなります。- ユニットテストケースを改善し、コードカバレッジを向上させることで、コンパイラによって引き起こされる問題を発見するのに役立ちます。- インラインアセンブリや複雑なABIのエンコード・デコードなどの操作を避け、新しい機能や実験的な機能を盲目的に使用しないこと。セキュリティ担当者向け:- 監査の際には、コンパイラが引き起こす可能性のあるリスクを無視しないでください。これはSWC-102のチェック項目です。- SDLプロセスで、コンパイラのバージョンアップを推進し、自動チェックの導入を検討します。- コンパイラの脆弱性の実際の影響を評価し、過度に恐れる必要はありません。いくつかの実用的なリソース:- Solidity公式のセキュリティ警報ブログ- Solidityリポジトリのバグリスト- 各バージョンのコンパイラバグリスト- Etherscanの契約ページのコンパイラ脆弱性の警告! 【Solidityコンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/social/moments-84f5083d8748f2aab71fd92671d999a7)つまり、Solidityコンパイラの脆弱性は、スマートコントラクトの実際の動作が期待したものと一致しない可能性があるため、開発者とセキュリティ専門家はこれに警戒し、リスクを低減するための適切な対策を講じるべきです。
Solidityコンパイラの脆弱性分析:見過ごせないスマートコントラクトのリスク
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コンパイラの脆弱性解析と対策】(https://img-cdn.gateio.im/webp-social/moments-84f5083d8748f2aab71fd92671d999a7.webp)
つまり、Solidityコンパイラの脆弱性は、スマートコントラクトの実際の動作が期待したものと一致しない可能性があるため、開発者とセキュリティ専門家はこれに警戒し、リスクを低減するための適切な対策を講じるべきです。