CVE-2021-39137 は、数日前に報告され修正された脆弱性です。しかし、すべてのEthereumノードがパッチを適用したわけではありません。この脆弱性が悪意のあるトランザクションによって悪用されていることを確認しました。
攻撃トランザクション
https://tx.blocksecteam.com/tx/0x1cb6fb36633d270edefc04d048145b4298e67b8aa82a9e5ec4aa1435dd770ce4
このトランザクションは、アドレス0x4に対するSTATICCALLを含んでいます。これはプリコンパイルされたスマートコントラクトdataCopyです。引数は以下の通りです。
inOffset = 0, inSize = 32, retOffset = 7, retSize = 32.
0x4 スマートコントラクト

図1
STATICCALLのターゲットが0x4プリコンパイル済みコントラクトであるため、図1のRunPrecompiledContract関数が実行されます。

図2

図3
図2/3によると、0x4スマートコントラクトは単にinポインタへの参照を返します。
図4
図5
図4はSTATICCALLオペコードのコードです。751行目では、argsはEVMメモリの[inOffset 〜 inOffset + inSize]、つまりMem[0:32]を指しています。
図5と0x04(図2/3)のコードロジックの分析によると、戻り値(ret)はargsと同じメモリへの参照です。つまり、Mem[0:32]を指します。
脆弱性
脆弱性のあるコード(バージョン1.10.7)では、762行目がretの内容をMem[retOffset : retOffset + retOffset]、つまりMem[0:32]をMem[7:7+32]にコピーします。**この操作により、誤ってretの内容が変更されます。**これは、0x4プリコンパイル済みコントラクトの戻り値が変更されたことを意味します。
修正されたバージョン(1.10.8)では、retのコピーを作成します(766行目)。767行目のコピーはretの内容を変更できないため、これにより脆弱性が修正されます。
CVE-2021–39137の脆弱性は、ノードがタイムリーにパッチを更新しなかったために、悪意のあるトランザクションによって悪用されました。この欠陥は、Ethereum仮想マシンのメモリ操作における不具合が原因でしたが、バージョン1.10.8で修正されています。システムのセキュリティを確保するため、すべてのEthereumノードは速やかに最新バージョンにアップデートすることを推奨します。
謝辞
攻撃の分析は、Siwei Wu、Yufeng Hu、Lei Wu、Yajin Zhou@BlockSec



