今回の記事では、BSCで6月16日に起きたExploitについて解説していきたいと思います。
IRONFINACEが暴落した日の日本時間だと1日前に発生した事件になります。
Defiを行っていく上で過去に起きた事件を調べる事は大切だと思っています。そのため自分にも起こりうる可能性があると考えながら、学びの一つとして最後まで読んで頂ければと思います。
事件の内容
何が起こったのかチャートで確認していきます。
※ケチャップトークンを用いています。

とても金額が下がり10分の1程になっています。
このように、ほぼ価値がつかないような状態にまでなりました。
Exploitについて
今回画像内の複数の箇所でExploitが起こりました。
有名な所で言うとCerberusやGaruda/CaramelsSwapなどがあります。

Exploitが発生する条件
Exploitには、発生する条件が2つほどあります。
※(細かく言うと他にもありますが大まかに2つ)
- トランザクションフィー(※deposit feeではない)が発生するトークン
例)パンサー - そのトークンの単体プール
この上記①②が条件になります。
例)5%のトランザクションフィーの場合
100depositしたらMasterChefに届くのは95トークン(5%トランザクションフィー)になります。
そしてMasterChefからWithdrawする際にもトランザクションフィーが発生します。
※つまり、本来ならユーザーが100トークン引き出せずに90.25しか引き出せません。
今回のExploitした内容は、単体プールに100トークンdepositして100トークンwithdraw出来てしまうといったものでした。本来であればトランザクションフィーが発生しますが、ユーザーが損失なく引き出す事ができた為、損失分の補填はMasterChefからされたという内容です。
MasterChef内のプールがほぼ空の状態に…
上記内容だけだと、Exploitを実行する側は何もメリットがありません。なぜならMasterChefに損失を出させているだけになるからです。
この攻撃自体では、MasterChefのプールがほぼ空になり(損失分の補填をしてしまったため)ましたが攻撃者は稼げていません。
この後の操作により、攻撃者は利益を得ていきます。
例)ブロック報酬として決められているのが100だとして、本来なら基本的にユーザーの割当の合計は1以下です。
ユーザー割当=ユーザーのstake量/Poolのstake量
※この辺の内容を詳しくしりたい方は、『イールドファーミングの基礎知識』を見てみてください!
上記を踏まえて、先程の攻撃を繰り返し行うと、MasterChefの中身がなくなっていき、『Poolのstake量』はすべて攻撃者のstakeになります。
つまり攻撃者はプールのシェアの100%を取っている状態になります。
なので、既存ユーザーのstake量を考えると合計が1を超えます。となると、想定以上にmintされトークンがばらまかれた可能性が非常に高いです。
※mint=トークンの新規発行
例)ブロック報酬が100あり、Aさんが1トークンstakeしている・Bさんが攻撃したとします。
Bさんが最後に0.001トークンだけstakeに残した場合。
▶Aさんの割当は、100/0.001=100,000% になります。
そのため、Aさんは異常なブロック報酬になり大量に収穫できることになります。
コントラクトから読み取れる内容
最後がlpSupplyで終了しています。これは、プール内の合計のトークン量で割っていることを指します。なので、合計のトークン量が重要になります。
もしここが、ユーザーが今までに入れたトークンの合計量や違う計算方法だとしたら防げていた可能性があったかもしれません。
しかし、今回の場合は実際のプール内の合計トークン量だったため、LpSupplyをとても小さくした場合、プールパーシェアがとても増え本来1を超えないものが1を超えることになります。

リファラルプランにおけるExploit
Cerberusでは紹介制度を利用していました。
コントラクトにある、commissionAmountこれにより紹介された人が沢山トークンをファームできることによって紹介者にも大量に入りました。そのため、売り圧がもっとかかることになりどんどん価格が下がったということになります。

まとめ
Exploitは潜在的には条件の①②に当てはまるものに該当するものになります。トランザクションフィーが発生するトークン。そのトークンの単体プールであれば起こる可能性が十分にあります。
トークンの単体プールに入れる際に、トランザクションフィーを取っていれば問題ありません。
(例)100depositして100引き出せないモノ。
以前紹介したモカトークンも該当するものでしたが、これは問題がないです。理由は、モカトークンはトランザクションフィーが発生しないホワイトリストっていうを設定しています。
ユーザーに送った場合は発生しますが、プールに入れた場合は発生しない振り分けをしています。だからといって他の事件を起こさない可能性はないですが、ホワイトリストみたいなものの設定をしてあるかを確認することは大切だと思います。
以上が、BSCで一気に起こったExploitでした。運用していく上で対策の一つとして覚えて頂ければと思います。