目次
はじめに
読んでいる人の中では、「まさか自分はならないだろう。」と思う方も多いと思います。しかし明日は我が身の世界。油断はできません。
Grim Financeは日本人プレイヤーの方も、簡便なDappsということで利用していた方も多かったと耳にしています。
さて、本日は"Bunny Finance"で起きたフラッシュローンアタックについてご紹介します。
フラッシュローンアタック ⇒ FL攻撃
また、「フラッシュローン」というのも、実は共通して使い回せる言葉ではないです。
例えば、
AAVE - Flash Loan
DYDX - FlashLoans
Uniswap - FlashSwap
と言います。
日本語では、圧倒的に「フラッシュローン」という言葉が先行して認知されているので、当ブログでも同様に使い回すが、例えばUniswapのコミュニティでチャットする際は"FlashSwap"と正しい言葉を使ってください。
-別記事-
Bunny Financeのフラッシュローンアタック直後にroom1837の方には補償内容の記事を書いたので合わせて参照ください。
Bunny Financeでフラッシュローンアタック発生
Bunny Financeって何?
このBunny Finance、端的に言うと、Pancakeで$Cakeを預け入れるよりもBunny Financeに$Cakeを預け入れたほう稼げた、自動複利運用に特化したDappsでした。
(今は、その他の機能もあり。)
そのため、当時は利率などの観点から非常においしかったのです。
また、当時はPancakeの方にAuto Compound機能が備わっていなかったため、毎回のガス代節約にもなる事から、このDappsはPancakeユーザーを引き込むことに成功しました。
このプロジェクトが、2020年の11月にローンチしてから数ヶ月で多くのユーザーを獲得するのに時間はかからなかったです。
参考までに下記は、CoinGeckoから引っ張ってきた$BUNNYの数値です。
2021年01月01日 高値$4.6
2021年04月29日 高値$449.58
既にトークンの価格は、$150でした。
ネイティブトークンというのもあり、既に高値というイメージでした。
内心、$1で購入した人は羨ましいなと思いながら日々動向だけ見ていました。
そして、その日はやってきます。
悪夢の5月20日フラッシュローンアタック発生、トークン暴落
なんせ、昨日まで上記のように$230弱だったのですから。
それが、$7。
喜劇だったのです。その日は、そこから$70までいきました。
そこからまた暴落。
まさにジェットコースターの様な破壊的な値動きをしてくれました。
FL攻撃による被害額は、50億円以上
まず、今回の攻撃による被害額は$44Mです。
日本円で約50億円です。
一度、大ダメージを喰らった小規模プロジェクトが自力で復活するのは無理ということです。攻撃以降に美味しかったのは、その日の大底から$70の間を取れた人だけじゃないでしょうか。
補償トークンの発行、代替トークンの発行&ホワイトリスト、新Dappsの立ち上げ、メインプロジェクトへの新機能の追加など、攻撃からの7ヶ月様々な手段で回復に務めましたが現在の価格は$1.28。
大口投資家がTwitterなどで投資するなどを明言しない限りは、これからも無理ではないでしょうか。
FL攻撃とは? 5月20日にいったい何が起きたのか?
FL攻撃とは、「プロジェクトのバグとフラッシュローンを利用した攻撃」です。
そのフラッシュローンとは、「担保なしでトークンを借り入れる事が出来るローン。」のことを指します。
「担保なし?」と驚く方も多いと思いますが、言葉の通り担保無しなんです。
ただし、秒速で借入元からの利息もしくは手数料が発生します。
このフラッシュローンは、「借入」から「返済」までの一連の複数Transactionを一つのContractとして実行することで、初めて実現できる内容です。
例えば、
1. "A取引所"で100ETHを借りる。
2. 借りた100ETHを"B取引所"でBNBにSwapする。
3. そのSwapした、BNBを違う"C取引所"でETHにSwapする。
4. ”A取引所"に100ETH +利息/手数料を返済する。
この4つのTransactionで、手元に余ったETHがフラッシュローンを実行したことによって獲得できる「利益」です。
一般的にコードが書けるアビトラ勢に好まれるContractです。
そして、今回のBunny Financeへの攻撃は、この「瞬間借入」とBunny Finance側の「コントラクトバグ」を利用して行った「フラッシュローンアタック」なのです。
そういった意味では、「フラッシュローンアタック」は、「攻撃」ではなく「コントラクトバグを突いた裁定取引」とも言い換えれます。
また、このフラッシュローンアタックを行うためには、下記の2点を事前に行う必要があります。
1. フラッシュローンのコードを書く
2. 攻撃対象のバグを発見する
この2点が成立すると、どのプロジェクト相手でも実行可能になります。
ここからは、公式の発表を見ていきましょう。
-Summary
1. The exploiter staged (and exited) the attack using PancakeSwap (PCS)2. By exploiting a difference in PCS pricing, the hacker intentionally manipulated the price of USDT/BNB and Bunny/BNB, acquiring a huge amount of Bunny through the use of Flash Loans.
3. The exploiter dumped all the Bunny in the market (Ethereum), causing the price of Bunny to plummet
4. The exploiter then exited the attack by paying back the remaining BNB (by having exploited the price difference from before) on PCS.
Here is a brief report and detailed timeline of what the exploiter carried out from the beginning:
Exploiter’s wallet address: 0xa0ACC61547f6bd066f7c9663C17A312b6Ad7E187
Exploit transaction: https://bscscan.com/tx/0x897c2de73dd55d7701e1b69ffb3a17b0f4801ced88b0c75fe1551c5fcce6a979
公式Mediumより
Timeline of attack
Start of attack.
10:31:25 PM +UTC — Deposited 1BNB worth of USDT/BNB on the USDT/BNB Flip Vault in order to stage the attack. Expectedly, a quantity of LP 9.275 is deposited to the exploiter’s contract.
10:34:28 PM +UTC — Exploit executed. (more details below)
10:36:00 PM +UTC — Unusual increase in Bunny price detected. (Reported by Operations Team)
10:45:10 PM +UTC — In order to whitewash / launder the extorted WBNB from the exploit, 114,631BNB was sent to the following address:
0x158c244b62058330f2c328c720b072d8db2c612f11:18:10 PM +UTC — Officially confirmed as a Flash Loan attack. Paused all deposits/withdrawals to the Vault in order to prevent further attacks.
11:59:55 PM +UTC — From the same address above, about 488,071.8989395982 BUNNY was swapped for about 9,161.3295578776BNB, where a portion of it (327.2930347138 BNB) was further swapped for about 43.2463201179 ETH on PCS via 1inch contract(0x11111112542d85b3ef69ae05771c2dccff4faa26)
公式Mediumより
1. Exploiter secured the funds on PancakeSwap (PCS) to stage and carry out the flash loan attack (hereafter termed “flashed”, the whole sequence was done within one, single transaction)
Flashed 1,051,687 WBNB to PCS CAKE/BNB
Flashed 522,524 WBNB to PCS BUSD/BNB
Flashed 210,158 WBNB to PCS ETH/BNB
Flashed 133,504 WBNB to PCS BTCB/BNB
Flashed 241,021 WBNB to PCS SAFEMOON/BNB
Flashed 98,189 WBNB to PCS BELT/BNB
Flashed 66,290 WBNB to PCS DOT/BNB
Flashed 2,961,750 USDT to ForTube
2. Exploiter minted 144,445 LP by pairing 7,744BNB and 2,961,750 USDT (from the previous stage, on ForTube) on the PancakeSwap V2 USDT/BNB pool (directly minted using Pair contract).
3. Swapped 2,315,631 WBNB to 3,826,047 USDT on the PancakeSwap V1 USDT/BNB pool (thereby exploiting the pricing on Version 1 of the PancakeSwap USDT/BNB).
4. Recalled minted Bunny using getReward. Here, the minted 144,445 LP from step 2) were transferred to BunnyMinter.
5. By using removeLiquidity on all 144,445 LP tokens, exploiter generated 2,961,750 USDT + 7,744 WBNB (as per pair contract) and, in the process of swap on V1 of PancakeSwap BUNNY/BNB with the exploited price from stage 3, resulting in the issuing of 105,257 BUNNY/BNB tokens using 10,836 BUNNY and 1,156,330 WBNB.
6. With the newly created BUNNY/BNB from stage 5, BNB Value was calculated to around 2,324,152 BNB and, as a result, issuing 6,972,455 BUNNY
7. From the 6,972,455 BUNNY, the following happened:
-4,880,718 BUNNY exchanged as 2,384,754 BNB on PCS V1 BUNNY/BNB pool
-1,394,491 BUNNY exchanged as 56,270 BNB on PSC V2 BUNNY/BNB pool8.Returned all payments made using Flash Loan again
(on the latest PancakeSwap, hereby PCS)
Repaid 2,964,119 USDT on ForTube.
Repaid 66,463 WBNB on PCS DOT/BNB
Repaid 98,445 WBNB on PCS BELT/BNB
Repaid 241,528 WBNB on PCS SAFEMOON/BNB
Repaid 133,852 WBNB on PCS BTCB/BNB
Repaid 210,706 WBNB on PCS ETH/BNB
Repaid 523,886 WBNB on PCS BUSD/BNB
Repaid 1,054,429 WBNB on PCS CAKE/BNB
Remainder of 114,631 WBNB sent to the exploiter’s address (thereby incurring as malicious gains for the exploiter).
公式Mediumより
まぁ、結果から見ていきましょう。
-攻撃内容-
bscscan
-準備金-
1BNB (おそらくガス代)
-フラッシュローン借入元-
PancakeSwap
Fortube
- 最終獲得益(裁定利益) -
114,631WBNB。
当時のレートで、114,631*$390.41 = $44Mですが、これが上述した被害額と一致します。
-実行時間-
Transaction発生から終了まで、約14分。
最終的に逃げ切るまでの時間、約1時間半。
差異というのは、返済時の利息になります。
借入先 Fortube
□1 -
借入 2,961,750 USDT
返済 2,964,119 USDT
差異 2,369 USDT
借入先 Pancake Swap
□2 CAKE/BNB
借入 1,051,687 WBNB
返済 1,054,429 WBNB
差異 2,742 WBNB
□3 BUSD/BNB
借入 522,524 WBNB
返済 523,886 WBNB
差異 1,362WBNB
□4 ETH/BNB
借入 210,158 WBNB
返済 210,706 WBNB
差異 548WBNB
□5 BTCB/BNB
借入 133,504 WBNB
返済 133,852 WBNB
差異 348WBNB
□6 SAFEMOON/BNB
借入 241,021 WBNB
返済 241,528 WBNB
差異 507WBNB
□7 BELT/BNB
借入 98,189 WBNB
返済 98,445 WBNB
差異 256WBNB
□8 DOT/BNB
借入 66,290 WBNB
返済 66,463 WBNB
差異 173WBNB
合計利息は、
5,936WBNB +2,396USDT
利息だけで、約2億です。
このプロジェクトの甘いところだとワイは思ってる。
普通に公式ブログで説明するにしても、FlashedとRepaidの順番ぐらい合わせろよと言いたい。
まぁ、それは良いとして、ご覧の様に30分で半端ない利息が発生するのです。
ここで、PancakeSwapで借りることなんて出来るの?と思う方もいるかもしれません。
通常、どこにも借りられる画面は見当たらないですが、元々UniSwapのフォークプロジェクトです。コードで実行すれば借り入れる事が可能なのです。
また、この利息は、PancakeにLP供給している人に返ってきているので、一方的に攻撃者だけが得したわけではないです。
1. Fortubeで借りる。
2. PancakeSwapで借りる。
3. PancakeBunnyにLPを預け入れる。
-内訳-
3-1
2.96M USDTと7886 WBNBをWBNB/BUSDTのプールに預け入れて流動性を供給することにより144.45K LPを生成する。
3-2
WBNB/BUSDTのプールで、2.32M WBNBを3.83M BUSDTへSwapする。
4. 預け入れたことで、約6,970,000 $BUNNYを生み出す。
5. 生み出した約6,970,000 $BUNNYを全て売却する。
(ここで、ダンプが発生。)
6. $Bunny売却後に、預け入れたLPを全て引き出す。
7. Fortube と PancakeSwapに返済する。
8. 返済後、獲得した利益は洗浄する。
9. はい、終了!
5と6の順番が間違ってるかもしれませんが、
全体の流れとしては、これで合っています。
ここで、Bunny Finance側の「バグ」がどこなのかというと、ここが一番説明が難しいのです。
-瞬間的に大量にLPを預け入れることが可能だった。
-LP及びトークンの価格がFairじゃなくなる場合の対処を組み込んでいなかった。
この2点です。
-Diffchecker
-AlphaHomera
この辺りは、各自で確認ください。
こっちは、預け入れている参加者の資産は取られてないのよ。
Grim Financeは、取られた。
そこが大きく違う。
減ったのは、$BUNNYの資産価値。
なので、$BUNNYを用いてLP組んでた人や$BUNNYを単体で持っていた人は大損した。しかし、BTCなどのような他トークンは取られていないのよね。
個人的には、Grim Financeの方が悲惨な事件だと思っている。
Bunny Financeからの補償
さいごに
5月は暴落などもあった時で、それでも$230を維持しているBunnyには期待していたのですが、この事件で奈落の底へ。
しかし、そこから巻き返すチャンスはあったのですが、このプロジェクトは他のサービスを優先するなどしてしまったため、トークンの価格は戻らないまま今では$1弱になってしまいました。
そして、Bunny Financeの時と同様に大底で拾って利益獲得を目指そうとして大失敗した人も多数います。
くれぐれも変な気は起こさないようにしてください。
また、高利率のプロジェクトなどは、参加前に、そのプロジェクトの"Risk Assessment = リスク評価" を行うのを推奨します。
引用元
- https://pancakebunny.medium.com/?p=a7bf0c7a07ba
- https://peckshield.medium.com/pancakebunny-incident-root-cause-analysis-7099f413cc9b