仮想通貨ハッキング事例 - 002 Bunny Finance 被害額は約50億円

はじめに

Henry
前回の記事で初めてハッキングの事例について紹介しました。

読んでいる人の中では、「まさか自分はならないだろう。」と思う方も多いと思います。しかし明日は我が身の世界。油断はできません。

Grim Financeは日本人プレイヤーの方も、簡便なDappsということで利用していた方も多かったと耳にしています。

さて、本日は"Bunny Finance"で起きたフラッシュローンアタックについてご紹介します。
Cookie
ガクブル。
Henry
今回の記事では、「フラッシュローンアタックアタック」という言葉を何度も使用するため、以下の様に記します。

フラッシュローンアタック ⇒ FL攻撃

また、「フラッシュローン」というのも、実は共通して使い回せる言葉ではないです。
例えば、

AAVE - Flash Loan
DYDX - FlashLoans
Uniswap - FlashSwap

と言います。

日本語では、圧倒的に「フラッシュローン」という言葉が先行して認知されているので、当ブログでも同様に使い回すが、例えばUniswapのコミュニティでチャットする際は"FlashSwap"と正しい言葉を使ってください。

-別記事-
Bunny Financeのフラッシュローンアタック直後にroom1837の方には補償内容の記事を書いたので合わせて参照ください。

Bunny Financeでフラッシュローンアタック発生

Bunny Financeって何?

Henry
まず、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
Cookie
4ヶ月で100倍じゃん。
Henry
2020年ローンチ直後は$1以下だったから、もっと安かったんだよ。
Cookie
すごっ。
Henry
私が、このプロジェクトの存在を知ったのは3月ごろ。
既にトークンの価格は、$150でした。

ネイティブトークンというのもあり、既に高値というイメージでした。
内心、$1で購入した人は羨ましいなと思いながら日々動向だけ見ていました。

そして、その日はやってきます。

悪夢の5月20日フラッシュローンアタック発生、トークン暴落

https://www.coingecko.com/en/coins/pancake-bunny/usd#panel
Henry
早朝の6時ぐらいだったでしょうか、値段を確認したら目を疑いました。
なんせ、昨日まで上記のように$230弱だったのですから。
それが、$7。
Cookie
悲劇や。
Henry
参加者にとっては悲劇であり、以前から参加したいと思っていた人にとっては
喜劇だったのです。その日は、そこから$70までいきました。
Cookie
なぬ?
Henry
Coingeckoには記録されてないですが、瞬間的に$70まで上がって、
そこからまた暴落。
まさにジェットコースターの様な破壊的な値動きをしてくれました。

FL攻撃による被害額は、50億円以上

Henry
まず、この事件による結論だけ書いときます。

まず、今回の攻撃による被害額は$44Mです。
日本円で約50億円です。

一度、大ダメージを喰らった小規模プロジェクトが自力で復活するのは無理ということです。攻撃以降に美味しかったのは、その日の大底から$70の間を取れた人だけじゃないでしょうか。

補償トークンの発行、代替トークンの発行&ホワイトリスト、新Dappsの立ち上げ、メインプロジェクトへの新機能の追加など、攻撃からの7ヶ月様々な手段で回復に務めましたが現在の価格は$1.28。

大口投資家がTwitterなどで投資するなどを明言しない限りは、これからも無理ではないでしょうか。
Cookie
あれまぁ。

FL攻撃とは? 5月20日にいったい何が起きたのか?

Henry
まずは、FL攻撃について説明していきます。

FL攻撃とは、「プロジェクトのバグとフラッシュローンを利用した攻撃」です。

そのフラッシュローンとは、「担保なしでトークンを借り入れる事が出来るローン。」のことを指します。

「担保なし?」と驚く方も多いと思いますが、言葉の通り担保無しなんです。

ただし、秒速で借入元からの利息もしくは手数料が発生します。
Cookie
じゃあ、借りて逃げられるじゃん。
Henry
残念ながら、それはハッカーでも出来ない。

このフラッシュローンは、「借入」から「返済」までの一連の複数Transactionを一つのContractとして実行することで、初めて実現できる内容です。

例えば、

1. "A取引所"で100ETHを借りる。
2. 借りた100ETHを"B取引所"でBNBにSwapする。
3. そのSwapした、BNBを違う"C取引所"でETHにSwapする。
4. ”A取引所"に100ETH +利息/手数料を返済する。

この4つのTransactionで、手元に余ったETHがフラッシュローンを実行したことによって獲得できる「利益」です。
Cookie
アビトラ?
Henry
そう、厳密には「裁定利益」。
一般的にコードが書けるアビトラ勢に好まれる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より
Henry
まず、これがSummary。

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:
0x158c244b62058330f2c328c720b072d8db2c612f

11: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より
Henry
次にこれが、当時のタイムライン。

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 pool

8.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より
Henry
最後に、これがタイムラインの10:34:28 PM +UTCの攻撃時に発生していた内容。
Cookie
気が狂いそうになる英語の量なんだが。
Henry
そうだね。
まぁ、結果から見ていきましょう。

-攻撃内容-
bscscan

-準備金-
1BNB (おそらくガス代)

-フラッシュローン借入元-
PancakeSwap
Fortube

- 最終獲得益(裁定利益) -
114,631WBNB。
当時のレートで、114,631*$390.41 = $44Mですが、これが上述した被害額と一致します。

-実行時間-
Transaction発生から終了まで、約14分。
最終的に逃げ切るまでの時間、約1時間半。
Henry
フラッシュローン内訳は、以下のとおりです。
差異というのは、返済時の利息になります。

借入先 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億です。
Cookie
なんで公式ブログは、順番一致させてないの?
Henry
その辺りがきっちりしていないよね。
このプロジェクトの甘いところだとワイは思ってる。
普通に公式ブログで説明するにしても、FlashedとRepaidの順番ぐらい合わせろよと言いたい。

まぁ、それは良いとして、ご覧の様に30分で半端ない利息が発生するのです。

ここで、PancakeSwapで借りることなんて出来るの?と思う方もいるかもしれません。

通常、どこにも借りられる画面は見当たらないですが、元々UniSwapのフォークプロジェクトです。コードで実行すれば借り入れる事が可能なのです。

また、この利息は、PancakeにLP供給している人に返ってきているので、一方的に攻撃者だけが得したわけではないです。
Henry
では、攻撃の一連の流れを見ていきましょう。

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点です。
Cookie
ほうほう。
Henry
このバグの内容に対する修正は、非常に早い段階でBunny側は対処しました。

-Diffchecker
-AlphaHomera

この辺りは、各自で確認ください。
Cookie
あのさ、ここまで聞いてたらGrim Financeと被害内容違う気がするんだけど。
Henry
そう、全く違う。
こっちは、預け入れている参加者の資産は取られてないのよ。
Grim Financeは、取られた。
そこが大きく違う。

減ったのは、$BUNNYの資産価値。

なので、$BUNNYを用いてLP組んでた人や$BUNNYを単体で持っていた人は大損した。しかし、BTCなどのような他トークンは取られていないのよね。
Cookie
なるほど。
Henry
前回の記事で、ハッキングと一括に言っていたが、厳密には全く異なる事件です。
個人的には、Grim Financeの方が悲惨な事件だと思っている。

Bunny Financeからの補償

Henry
こちらについては、room1837の方の記事と公式Mediumを参照ください。

さいごに

Henry
今回は、ハッキング事例2にBunny Financeについて書きました。

5月は暴落などもあった時で、それでも$230を維持しているBunnyには期待していたのですが、この事件で奈落の底へ。
しかし、そこから巻き返すチャンスはあったのですが、このプロジェクトは他のサービスを優先するなどしてしまったため、トークンの価格は戻らないまま今では$1弱になってしまいました。
Cookie
あらまぁ。
Henry
さて、この記事で、フラッシュローン直後に拾ったら美味しいの?と思った方もいるかもしれませんが、このBunny Financeの事件から何件も類似事件が発生しました。

そして、Bunny Financeの時と同様に大底で拾って利益獲得を目指そうとして大失敗した人も多数います。

くれぐれも変な気は起こさないようにしてください。

また、高利率のプロジェクトなどは、参加前に、そのプロジェクトの"Risk Assessment = リスク評価" を行うのを推奨します。
Cookie
今年は、これが最後の記事?
Henry
いや、あと1つ、2つは書こうかなと思ってる。
Cookie
最近、寒くなってきたので皆さん風邪ひかないようにね。

引用元

  • https://pancakebunny.medium.com/?p=a7bf0c7a07ba
  • https://peckshield.medium.com/pancakebunny-incident-root-cause-analysis-7099f413cc9b
Henry. W
はじめてこのサイトへお越しの方は、こちらの当サイト利用上の注意を必ずお読みください。
おすすめの記事