https://etherscan.io/tx/0xb5c8bd9430b6cc87a0e2fe110ece6bf527fa4f170a4bc8cd032f768fc5219838
これがその問題のTX↑
攻撃的TXの内容
1、10,000 ETHのdYdXからのフラッシュローンが開始されました。
2、112 wBTCのローンを担保するために、5500 ETHがコンパウンドに送られました。
3、1300 ETHがFulcrum pToken sETHBTC5xに送信され、ETHBTC比率に対して5倍のショートポジションをオープンしました。
4、5637 ETHは借り入れられ、KyberのUniswapリザーブを通じて51 WBTCにスワップされ、大きな滑りを引き起こしました。
5、攻撃者は、Compoundから借用した112 wBTCをUniswapの6871 ETHに交換し、利益を得ました。
6、dYdXからの10,000 ETHのフラッシュローンは、収益から返済されました。
この一連のイベントからの総利益は1193 ETHで、現在は$ 250 / ETHで$ 298,250の価値があります。
完全なトランザクション分析による全ての状態遷移はこの記事で書かれています。↓
https://medium.com/@peckshield/bzx-hack-full-disclosure-with-detailed-profit-analysis-e6b1fa9b18fc
結果どうなったか要約
1、Compoundでは、112WBTCは5500ETHの担保で借りられたまま。(攻撃者はWBTCの返済による担保の引き出しを始めている。正当な動作。)
2、攻撃者はFulcrumでのETH5倍ショート(WBTC建て)で、Kyber(UniswapETH-WBTCプールリザーブ)経由で対WBTC価格のETHを暴落させ(≒WBTC暴騰(対ETH))、Compoundで借りた112WBTCを売ることでETHで利益を上げた(WBTC価格はETHに対して約3倍になったとされている。)。
3、Fulcrumでは、51WBTCを担保に4337ETHが借りられたまま。これはすでにデフォルトのため攻撃者はスルー。プロトコル内で清算を保留されている状態。
約2400ETHが無担保状態で借りられていることになる。
3の解決策は?
A、管理者キーによって担保の51WBTCを売却して損失確定と共に(貸出者の引き出し)流動性を(ある程度)確保する。
B、今のまま放置し、保険基金(利率スプレッド10%)がその担保不足を補うことでプロトコル全体の健全性を取り戻す。
とりあえず現状はBの方向っぽい。
同じようなことが起こらないために打たれた対策
1、フラッシュローンと同様に、マージン取引が1TXで清算される場合に入口と出口で担保要件が成立しない場合はTXが失敗するようにした。
(今回は、仕掛け時には担保要件が成立していたため動いたが、退出(ショートクローズ)時にチェックは発動しないので担保の割れた形でも閉めることができて、結果担保割れした。この攻撃が1TXで行われなかったとしたら、ポジションは担保要件を保ったまま清算に移っていた。)
2、BTCのETH建てマージントレードを削除。(USD建てはそのまま。)
3、攻撃の可能な範囲を制限するために最大取引サイズを実装。
補足
今回は価格オラクルの問題は関係ない。Uniswap内での現物の動作の影響が大きく、攻撃者は巧みにそれを利用した(WBTC-ETHプール)。
プールの深さは重要。
とりあえずまとめてみた。間違ってたらごめんちょ☆
個人的なおまけ情報
つまりこれ、FulcrumのETH貸し手は、返ってこないかもしれないETHを貸している状態ではあるのだけど、実際のところ他のレンディングプラットフォームも起こる起こらないは別にして同様のリスクは抱えている。(通常は安全圏で担保清算されるけど。)
しかし、時間が経過すれば、保険基金の蓄積によって担保不足は解消される。そのための金利スプレッド資金を積み上げていくプロトコルになっている。(現状ではその蓄積はまだ小さいが。)
今のところ返ってこないETHになっているということは、利率がある程度高いまま推移することが確定しているということ。これをチャンスと見るかただの危険な賭けと見るかはリテラシー次第。