DeFi プラットフォーム Opyn スマート コントラクトの脆弱性の詳細な説明: 攻撃者は空手
PeckShield
2020-08-06 06:32
本文约1846字,阅读全文需要约7分钟
狡猾な攻撃者は、まず自分自身に対して偽装取引を開始し、この ETH の再利用可能な機能を利用して販売者のユーザーへの送金を再度開始し、それによって販売者から抵当に入れられたデジ

北京時間の2020年8月5日、DeFiオプションプラットフォームOpynのOpyn ETH Putスマートコントラクトがハッキングされ、約37万米ドルの損失が発生した。

Opyn は一般オプション契約であり、今年 2 月に保険プラットフォームに転換され、oToken を通じて取引可能な ETH プット オプションを DeFi プラットフォームに提供し、それによって ETH 市場価格を固定し、非常に不安定な DeFi 市場に相対的な安定性を提供します。

Opyn プラットフォームが攻撃されたことを知った後、PeckShield セキュリティ チームはすぐに問題の重要なポイントを特定しました。

攻撃者は、Opyn スマート コントラクト行使 (行使) インターフェイスには、受信した ETH の処理にいくつかの欠陥があり、そのコントラクトはトレーダーのリアルタイムの取引額をチェックしていないため、攻撃者は実際の取引を開始できることを発見しました。その後、売り手の抵当に入れられたデジタル資産を騙すために偽のトランザクションを挿入し、空手を実現します。

簡単に言えば、Opyn ETH Put スマート コントラクトの行使関数 Exercise() はトレーダーの ETH のリアルタイム検証を実行しないためです。 Opyn プラットフォームのビジネス ロジックによれば、プット オプションの買い手は、売り手によって抵当に入れられたデジタル資産を取得するために、対応する ETH の価値を売り手に転送します。狡猾な攻撃者は、まず自分自身に対して偽装取引を開始し、この ETH の再利用可能な機能を利用して販売者のユーザーへの送金を再度開始し、それによって販売者から抵当に入れられたデジタル資産をだまし取ります。

副題

脆弱性の詳細なプロセス分析

まず、Opyn プラットフォームのビジネス ロジックについて話しましょう。ユーザーが Opyn コントラクトを使用して権利行使、つまり先物売買 (権利行使) を行うとき、買い手は対応する量の ETH または ERC20 トークンをトークンに送金する必要があります。その後、契約により買い手の対応する oToken が破棄され、買い手は売り手が抵当に入れた不動産を取得します。

画像の説明

図 1. 渡されたボールト アドレスのリストは、exercise() 関数でループされます

画像の説明

図 2. 契約に渡された ETH を再利用して担保資産を取得する

ほとんどの DeFi プロジェクトと同様に、関数が ERC20 トークンを処理する場合、コードの 1882 行に示すように transferFrom() を使用して、msg.sender から address(this) に送金します。

ただし、関数で処理する資産がETHの場合は処理方法が全く異なります。 Solidity では、msg.value は、Payable インターフェイスを呼び出すときにコントラクトの呼び出し元によってコントラクトに転送された ETH の量を意味し、これは単なる値であるため、コントラクト コードの 1879 行目で、msg.value == amtUnderlyingToPay を確認してください。コントラクトが実際に amtUnderlyingToPay の金額の ETH を受け取ったことを確認するだけであり、msg.value の値には影響しません。

ただし、上で述べたように、_exercise() 関数は Exercise() 内で周期的に呼び出されるため、コントラクトが実際に ETH を受け取るのは 1 回だけですが、ループ中に再利用できるという事実が生じます。

画像の説明

図 3. 攻撃トランザクション分析

図 3 では、Bloxy ブラウザーによって表示される呼び出しプロセスによる攻撃プロセスを示しています。攻撃者は多くの注文を消費しているため、トランザクションの 1 つを例として攻撃ロジックを示します。

1. 攻撃者は最初に Uniswap から 75 oETH を購入し、さらなるコール機能の実行の準備をしました。

2. 攻撃者は空売りオプションの売り手として Vault アドレスを作成し、75 oETH を鋳造するために 24,750 USDC を抵当に入れましたが、これらのオプションは売却しませんでした。これは、攻撃者が 75 ETH を 330 の価格で売却する権利を同時に購入したことを意味します。 ;

副題

修理の提案

PeckShield セキュリティ チームは、Solidity では、コントラクトがローカル変数 msgValue を使用して受信した ETH (つまり msg.value の値) を保存できることを提案しています。このように、後続のステップで msgValue を操作することで、どれだけの ETH が費やされたかを正確にマークすることができ、資産の再利用を回避できます。さらに、address(this).balance を使用してコントラクト残高を確認し、msg.value が再利用されるリスクを回避することもできます。

PeckShield
作者文库