
編集者注: この記事は以下から引用しましたPeckShield(ID:PeckShield)、許可を得てOdailyによって転載されました。
編集者注: この記事は以下から引用しました
、許可を得てOdailyによって転載されました。
4月18日午前8時58分頃から、DeFiプラットフォームUniswapが再入可能の脆弱性を利用してハッカーから攻撃を受けた。 PeckShield セキュリティ チームはすぐに問題を特定し、ハッカーが Uniswap と ERC777 標準の互換性の欠陥を利用して再突入攻撃を実行していることを発見しました。
残念ながら、わずか 24 時間後の 4 月 19 日午前 8 時 45 分に、別の有名な DeFi プラットフォームである Lendf.Me も同様の方法でハッカーによる攻撃を受けました。
ハッカー攻撃の原理は次のとおりです。攻撃者は、イーサリアム ERC777 標準の transferFrom() コールバック メカニズムを使用して、内部で _callTokensToSend() コールバック関数を呼び出すときにトランザクションをハイジャックし、実際に更新する _move() 関数の前に悪意のある攻撃を実行します。バランス。
脆弱性攻撃の詳細については記事後半で詳しく紹介します。
Figure 1: ERC777 transferFrom()
画像の説明
副題
ERC777 標準ビジネス ポートフォリオの互換性の問題
標準拡張機能の機能の 1 つは、「フック」メカニズムを提供することです。これにより、通常のアドレスまたはコントラクトは、tokensToSend() フック関数を登録することでトークンの送信を制御または拒否できるようになります。これは元々、ERC20 に基づいてトークンのリスク管理インターフェースを強化したものであり、有益な改善です。ただし、DeFi プロジェクトの構成可能な性質により、異なる製品間でコントラクトが呼び出される場合、そのビジネス ロジックの複雑さも大幅に増加し、コード インジェクション攻撃の可能性が生じます。
Figure 2: ERC777-Compatible tokensToSend() Hijacking
画像の説明
Figure 3: OpenZeppelin's Exploit Demo (Hook Setup)
その後、攻撃者は従来の PC のフック関数と同じように、tokensToSend() 内であらゆる操作を行うことができます。以下の図に示すように、攻撃者は同じトランザクションに対して複数のトランザクションを実行する可能性があります。
Figure 4: OpenZeppelin's Exploit Demo (Hook Function)
画像の説明
Uniswap は、ERC777 の互換性問題を悪用して攻撃を実行した最初の企業です。 Bloxy の悪意のあるトランザクションのスクリーンショット (ハッシュ: 0x9cb1d93d6859883361e8c2f9941f13d6156a1e8daa0ebe801b5d0b5a612723c1) に示されているように、関数内で tokenToEthSwapInput() 呼び出しが行われます。これは、攻撃者が最初に取引為替レートを操作し、次に別の imBTC をより低価格でより多くの ETH と交換できることを意味します。
Figure 5: Uniswap Hack
Lendf.Me 攻撃分析 Figure 6: Lendf.Me Hack Uniswapが攻撃されてから約24時間後、別のDeFiプラットフォームLendf.Meもハッキングされた。以下は、攻撃トランザクションの 1 つのスクリーンショットです。図に示すように、実際の転送関数 transferFrom() が Supply() 関数内で呼び出されるとき、フックされた攻撃者のコントラクトには、Lendf.Me のdrawing() を盗む引き出し操作が埋め込まれます。 通常のビジネス ロジックでは、プロジェクト契約の残高から攻撃者が引き出した 290 imBTC が差し引かれることになることに注意してください。ただし、supply() が戻ったとき、残高はリセットされておらず、まだ 290 imBTC です (1,599 行目) )。攻撃者は、Lendf.Me で攻撃者の imBTC モーゲージ額を制御および変更し、十分な額の imBTC モーゲージがあれば、攻撃者はさまざまな流動的な取引ペアから 10 種類以上の利用可能な資産をすべて貸与できます (総資産価値は 25,236,849.44 米ドル)。 )。 Figure 7: Lendf.Me Hack Details 副題 上の図に示すように、攻撃者は利益を得た後、すぐに各トークンを関連アカウント 0xa9bf70 に転送し、その後、攻撃者は 1inch.exchange や ParaSwap などのプラットフォームを通じて、より人気のある WETH、PAX、BUSD およびその他のトークンを交換しました。 ETH、DAI、BAT トークンに数十回変換し、TUSD、USDT トークンを Aave 融資プラットフォームに入金します。これまでのところ、攻撃者とその関連アカウントの残高は上に示されています。画像の説明
画像の説明
副題 修理の提案 PeckShield セキュリティ チームは、開発者がこのような再入攻撃を防ぐために「チェック - 効果 - インタラクション」アプローチを使用できることを推奨します。たとえば、Lendf.Me の Supply() では、トークン残高が最初に更新されると、doTransferIn() が呼び出されます。これにより、攻撃がdrawr()後に残高をリセットすることが不可能になります。 一方で、ERC777の標準機能では必然的にフック機構が有効になるため、すべてのトランザクション機能でリエントラントのリスクを検出し、防止する必要があります。たとえば、supply() とdrawr() が同時に実行され、ミューテックスが追加された場合、攻撃者はsupply() 関数内でdrawr() 操作を実行できません。 無視できない最後の点は、DeFi ビジネス ポートフォリオの潜在的なシステミック リスクを真剣に考慮する必要があるということです。プラットフォーム側は、製品がオンラインになる前に確実なコード監査と脆弱性調査があることを確認するだけでなく、異なる製品のビジネスを組み合わせる場合は、異なるビジネス ロジックに起因する潜在的なシステミック リスク管理の問題を考慮してください。修理の提案