7月18日、当社のDeFiRangerシステムは、いくつかの疑わしいトランザクションを報告しました。手動分析の結果、これらのトランザクションがArray Financeへの攻撃であることを確認しました。以下では、攻撃トランザクションを使用して、攻撃プロセスと脆弱性の根本原因を説明します。
攻撃トランザクション
このブログで使用する攻撃トランザクションは次のとおりです。 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa
攻撃フロー

図1に示すように、攻撃者はAAVEからフラッシュローンを借りて、186.62 WETHの利益を得ました(このブログではWETHとETHを明示的に区別していません)。

詳細な攻撃プロセスを図2に示します。
- まず、攻撃者はArray Financeの
buy関数を呼び出しました。攻撃者は45.91 WETHを使用してArray Financeが発行した430 ARRAYトークンを取得しました。 - 次に、攻撃者は非公開ソースのコントラクト(Array Collater - 0xa800cda5)の
joinPool関数を5回呼び出しました。攻撃者は676,410.58 DAI + 679,080.46 USDC + 901.82 WETH + 20 WBTC + 20 renBTCを預け入れ、Array Collaterが発行した726.38 aBPTトークンを取得しました。 - 攻撃者は
sell関数を呼び出して430 ARRAYトークンを燃焼させ、77.17 aBPTトークンを取得しました。 - 最後に、攻撃者はArray Collaterの
exitPool関数を呼び出しました。攻撃者は前の2つのステップで取得した804.55 aBPTトークンを燃焼させ、748,271.55 DAI + 751,225.08 USDC + 997.62 WETH + 22.63 WBTC + 22.74 renBTCを取得しました。
図2から、攻撃者はステップ5(図2:sell関数を呼び出す)で利益を得ていることがわかります。これは、取得した77.17 aBPTトークンが、ステップ3(図2:buy関数を呼び出す)で預け入れた49.9142 WETHよりも価値があるためです。以下では、この攻撃が可能になった理由を理解するためにコードを分析します。
コードの脆弱性
以下のコードは、Array Financeのsell関数を示しています。この関数では、Array Financeは攻撃者が所有するARRAYトークンの残高を使用し、内部の_sell関数を呼び出して、ARRAYトークンを売却して取得できるaBPTトークンの数を計算します。

以下は_sell関数の実装です。calculateLPtokensGivenArrayTokensを呼び出して、特定の数のARRAYトークンが与えられた場合に取得できるaBPTトークンの数を取得します。その後、この関数はARRAYトークンを燃焼させ、aBPTトークンを返します。

以下はcalculateLPtokensGivenArrayTokens関数の実装です。

amountLPTokenの計算に影響を与える4つの引数があることに注意してください。saleTargetAmountを読んだ後、次の式を推測します。
arraySmartPool.totalSupply() * (1 - (1 - amount / ARRAY.totalSupply()) ^ (1000000 / reseveRatio))
arraySmartPoolはArray Collaterのスマートコントラクトアドレス(0xa800cda5)です。攻撃者がフラッシュローンから借りた資金をArray Collaterに預け入れると、arraySmartPool.totalSupply()の値が増加します(以下の表を参照)。
TxnIndex: 64 arraySmartPool.totalSupply(): 110162296218708026400
TxnIndex: 107 arraySmartPool.totalSupply(): 165243444328062039600
TxnIndex: 150 arraySmartPool.totalSupply(): 247865166492093059400
TxnIndex: 193 arraySmartPool.totalSupply(): 371797749738139589100
TxnIndex: 236 arraySmartPool.totalSupply(): 557696624607209383650
TxnIndex: 280 arraySmartPool.totalSupply(): 836544936910814075475
arraySmartPoolのコードを読むことで、このロジックを確認できます。以下はarraySmartPoolのjoinPool関数です。

この関数は、まずSmartPoolManager.joinPool関数を呼び出して、msg.senderから取得する必要のあるトークン数(actualAmountsIn)を計算します。その後、各トークンについて_pullUnderlying関数を呼び出して、トークンをarraySmartPoolに預け入れます。最後に、_mintPoolShareと_pushPoolShareを呼び出してaBPTトークンを発行し、発行されたaBPTトークンをmsg.senderに転送します。
arraySmartPoolはPCTokenから継承されていることに注意してください。_mintPoolShare関数は_mint関数を呼び出します。以下にそれを示します。
_mint関数はvarTotalSupply変数を増加させます。この変数はtotalSupply()によって直接返されます。したがって、この値はjoinPoolの各呼び出しで増加します。
利益推定
| 攻撃アドレス | 攻撃トランザクション | 利益 (ETH) |
|---|---|---|
| 0x1337 | 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa | 186.62073907323577 |
| 0x1b4fb735b51a25b280499710d02f50e4f772949664f9eb088e9d968b41ca2a1c | 59.338842936817095 | |
| 0x356ae8a278754551d9d2ae7dc0ea876b37c342ff2d010bee14aa253bb0b6030b | 18.827787420260467 | |
| 0x388fd59eab65b6034c96c01a21197eb2889d6507f84ff07e553749c541563962 | 5.880854505948256 | |
| 0xf4227ca3c8e8b5c8a0b10f034c6dee6556788c618e4cd289dc343b3247e85add | 0.4327422187881 | |
| 合計 | 271.1009661550497 | |
| 0x80d2 | 0xf061f8fc19c894ec37310ff59977ec97de55fd1494f1b1e66ae89188552d5c60 | 1.8414029470248867 |
| 合計 | 1.8414029470248867 | |
| 合計 | 272.9423691020746 |
まとめ
要約すると、攻撃者は、aBPTトークンのtotalSupplyに依存するArray Financeの価格メカニズムが操作可能であるという脆弱性を悪用しました。この脆弱性は、当社の研究論文DeFiRanger: Detecting Price Manipulation Attacks on DeFi Applicationsで議論されています。
謝辞
Junjie Fei、Yufeng Hu、Ziling Lin、Siwei Wu、Lei Wu、Yajin Zhou @BlockSec (姓のアルファベット順)
BlockSecについて
BlockSecは、2021年に世界的に著名なセキュリティ専門家グループによって設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、Web3の世界のセキュリティとユーザビリティを強化し、その大規模な普及を促進することに尽力しています。この目標を達成するために、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3ビルダーが暗号通貨の世界を効率的にサーフィンするためのMetaDock拡張機能を提供しています。
現在までに、MetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなどの300社を超える著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを受け取っています。
公式ウェブサイト:https://blocksec.com/ 公式Twitterアカウント:https://twitter.com/BlockSecTeam



