# OrionProtocolのリエントランシー攻撃の分析2023年2月2日、イーサリアムとバイナンススマートチェーン上のOrionProtocolが契約の脆弱性により再入攻撃を受け、合計約290万ドルの損失を被りました。その中には、イーサリアム上の2,844,766 USDTとBSC上の191,606 BUSDが含まれています。## 攻撃プロセス分析攻撃者はまず特製のToken契約を展開し、それに対して移転および承認操作を実行して、後続の攻撃の準備をしました。その後、攻撃者はあるDEXのswapメソッドを通じて借入を行い、ExchangeWithAtomic.swapThroughOrionPoolメソッドを呼び出してトークン交換を実施しました。交換のパスはUSDC → 攻撃者Token → USDTに設定されています。ExchangeWithAtomic.swapThroughOrionPool メソッドの実行中に、攻撃者のトークンコントラクトにコールバック関数が存在するため、Token.Transfer プロセス中に ExchangeWithAtomic.depositAsset メソッドが再度呼び出され、リエントランシー攻撃が実現します。 その結果、入金額は複数回合算され、最終的には攻撃者は出金操作を通じて過剰な利益を得ることになります。! [PoCによるOrionProtocolリエントランシー攻撃分析](https://img-cdn.gateio.im/social/moments-730464b2d4d7f6e0ff21a0289a2d5d680192837465674839201## 資金の流れ攻撃者の初期資金は、ある取引プラットフォームのホットウォレットから来ています。攻撃によって得られた1,651枚のETHのうち、657.5枚は攻撃者のウォレットアドレスに残っており、残りはミキシングサービスを通じて移転されています。! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-caac189901b7aaad5abd8be30bb4361a(## 脆弱性分析コアの脆弱性はdoSwapThroughOrionPoolと_doSwapTokens関数に存在します。重要な問題は、コントラクトがトークン転送を行った後にcurBalance変数を更新するため、再入攻撃の条件を生み出していることです。攻撃者はカスタムトークンのtransfer関数にコールバックロジックを追加することで、転送プロセス中に再びdepositAsset関数を呼び出し、curBalanceが誤って更新される結果を引き起こします。! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-7e21c34158a85d4c387fcdbec136d31b(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-24819b5154419e86ea523a25a9101f67(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-7c4bde9d6a35da4304844a3bbb934fae(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-7239f8886fe83c1da8b1b42545185811(## 脆弱性の再発研究者は部分的なPOCコードを提供し、攻撃プロセスをシミュレートしました。テスト結果は、攻撃者が脆弱性を利用して追加のUSDTを取得することに成功したことを示しています。! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-e5042932f0e1b7fa96e3f6e749231957(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-4bd31735de09c63c490488e887118038(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-cd401091e63ab21864f39cd650014b97(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-e010d0f0c02fb8bbc648f755b0ac464c(! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/social/moments-f3c5f9416cfb9b7b791d86eeffb933be(## セキュリティの提案1. コントラクト開発時は「チェック-効果-相互作用」(Checks-Effects-Interactions)モデルを厳守する必要があります。つまり、まず状態をチェックし、その後コントラクトの状態を更新し、最後に外部コントラクトと相互作用します。2. トークン交換機能を実現する際には、さまざまなトークンや交換経路がもたらすセキュリティリスクを考慮する必要があります。3. 資金操作に関わる重要な関数については、再入ロックを実装するか、OpenZeppelinのReentrancyGuardなどのセキュリティライブラリを使用するべきです。4. 定期的にコード監査とセキュリティ評価を行い、潜在的な脆弱性をタイムリーに発見し修正する。5. 取引金額制限やタイムロックなどのメカニズムを導入し、単一の攻撃によって引き起こされる可能性のある損失を減少させることを検討します。これらの対策を講じることで、プロジェクトチームはスマートコントラクトのセキュリティを効果的に向上させ、同様の攻撃を受けるリスクを低減することができます。
OrionProtocolが再入攻撃を受け、290万ドルの損失を出しました。セキュリティアドバイスの解析
OrionProtocolのリエントランシー攻撃の分析
2023年2月2日、イーサリアムとバイナンススマートチェーン上のOrionProtocolが契約の脆弱性により再入攻撃を受け、合計約290万ドルの損失を被りました。その中には、イーサリアム上の2,844,766 USDTとBSC上の191,606 BUSDが含まれています。
攻撃プロセス分析
攻撃者はまず特製のToken契約を展開し、それに対して移転および承認操作を実行して、後続の攻撃の準備をしました。その後、攻撃者はあるDEXのswapメソッドを通じて借入を行い、ExchangeWithAtomic.swapThroughOrionPoolメソッドを呼び出してトークン交換を実施しました。交換のパスはUSDC → 攻撃者Token → USDTに設定されています。
ExchangeWithAtomic.swapThroughOrionPool メソッドの実行中に、攻撃者のトークンコントラクトにコールバック関数が存在するため、Token.Transfer プロセス中に ExchangeWithAtomic.depositAsset メソッドが再度呼び出され、リエントランシー攻撃が実現します。 その結果、入金額は複数回合算され、最終的には攻撃者は出金操作を通じて過剰な利益を得ることになります。
! [PoCによるOrionProtocolリエントランシー攻撃分析](https://img-cdn.gateio.im/webp-social/moments-730464b2d4d7f6e0ff21a0289a2d5d68.webp0192837465674839201
資金の流れ
攻撃者の初期資金は、ある取引プラットフォームのホットウォレットから来ています。攻撃によって得られた1,651枚のETHのうち、657.5枚は攻撃者のウォレットアドレスに残っており、残りはミキシングサービスを通じて移転されています。
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-caac189901b7aaad5abd8be30bb4361a.webp(
脆弱性分析
コアの脆弱性はdoSwapThroughOrionPoolと_doSwapTokens関数に存在します。重要な問題は、コントラクトがトークン転送を行った後にcurBalance変数を更新するため、再入攻撃の条件を生み出していることです。攻撃者はカスタムトークンのtransfer関数にコールバックロジックを追加することで、転送プロセス中に再びdepositAsset関数を呼び出し、curBalanceが誤って更新される結果を引き起こします。
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-7e21c34158a85d4c387fcdbec136d31b.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-24819b5154419e86ea523a25a9101f67.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-7c4bde9d6a35da4304844a3bbb934fae.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-7239f8886fe83c1da8b1b42545185811.webp(
脆弱性の再発
研究者は部分的なPOCコードを提供し、攻撃プロセスをシミュレートしました。テスト結果は、攻撃者が脆弱性を利用して追加のUSDTを取得することに成功したことを示しています。
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-e5042932f0e1b7fa96e3f6e749231957.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-4bd31735de09c63c490488e887118038.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-cd401091e63ab21864f39cd650014b97.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-e010d0f0c02fb8bbc648f755b0ac464c.webp(
! [PoCによるOrionProtocolリエントランシー攻撃分析])https://img-cdn.gateio.im/webp-social/moments-f3c5f9416cfb9b7b791d86eeffb933be.webp(
セキュリティの提案
コントラクト開発時は「チェック-効果-相互作用」(Checks-Effects-Interactions)モデルを厳守する必要があります。つまり、まず状態をチェックし、その後コントラクトの状態を更新し、最後に外部コントラクトと相互作用します。
トークン交換機能を実現する際には、さまざまなトークンや交換経路がもたらすセキュリティリスクを考慮する必要があります。
資金操作に関わる重要な関数については、再入ロックを実装するか、OpenZeppelinのReentrancyGuardなどのセキュリティライブラリを使用するべきです。
定期的にコード監査とセキュリティ評価を行い、潜在的な脆弱性をタイムリーに発見し修正する。
取引金額制限やタイムロックなどのメカニズムを導入し、単一の攻撃によって引き起こされる可能性のある損失を減少させることを検討します。
これらの対策を講じることで、プロジェクトチームはスマートコントラクトのセキュリティを効果的に向上させ、同様の攻撃を受けるリスクを低減することができます。