bZx事件から見るDeFiの攻撃リスクとは?

今回は、DeFiプラットフォームのシステムの問題をついて発生したbZxのイーサリアム流出事例から、DeFiの攻撃リスクについて考察した信玄氏(@shingen_crypto)のコラムを公開します。

目次

  1. 今回の事件に関するキーワード
    1-1. フラッシュローン
    1-2. Swap型DEXの価格変動(Slippage)
    1-3. 価格参照を行う為のオラクル
  2. おおまかな事件の概要
    2-1. 何が起きたか?
    2-2. 何故これが可能だったのか?
  3. フラッシュローンとSlippageを利用したbZx事件の流れ
  4. 今回の事件に登場したプラットフォームの解説
  5. まとめ

2020年2月15日、DeFiプラットフォームのbZxにおいて、システム上の穴を突いた動作によりおよそ1300ETH、当時で$360000相当のイーサリアムが奪われました。

これはハッキングや盗難ではなく、システムの仕様に沿った能動的アービトラージの様なものなのですがプラットフォーム側に預託された資産が損失を被る結果になっています(顧客資産への損失は発生しておらずbZx運営側が補填しており、更にNexus Matualという保険機構によりbZxへの補償も行われました)。

ですので奪われたという表現も正しいとは言い難く、”予想外のアービトラージにより、プラットフォーム側の預託資産から多くのイーサリアムが失われた”と言った方が正確になります。当然ですが実行者は全て解った上でやっていますので悪意ある行動です。

今回は事件を振り返りつつ、根本的な問題としてはどういったリスク要因があるのかを解説していきます。

今回の事件に関するキーワード

まずは今回の事件を引き起こすきっかけとなった要因となるキーワードを幾つか説明します。それぞれは単体で問題が有る訳では無いのですが、Money Lego(お金のレゴブロック)とも呼ばれるDeFiならではの複合的な組み合わせにより今回の事件が起きたと言えるでしょう。

フラッシュローン

DeFiでは誰でも資産の貸し借りが出来ますが、代わりに借りる際に過剰な担保資産を要求されるプラットフォームが殆どです(代表的なものとしてはETHとBATを担保にDAIを発行するMakerDAOがあります)。

ところがフラッシュローンを使うと、担保は実質0で手数料のみを元手に多額の借り入れが可能です。今回の事件でも攻撃者は10ドル以下の手数料しか持たずに10000ETHを調達しました。
ただし”フラッシュ”という名前の通り、1トランザクション内で貸借が完了する事が条件になっており、これが成立しない場合はトランザクションがエラーとなり成立しません。

これだけ聞くと用途がイメージし辛いところですが、主な用途としてはローンの借り換えがあります。例えば一つのプラットフォームで支払う金利がもう片方のプラットフォームより高いという場合、元手を返す事無くフラッシュローンを使って担保とローン資産の移動が出来ますし、場合によっては担保資産の種類を変える事も可能です。こうしたフラッシュローンの利用については2019年前半から既に存在していました

Swap型DEXの価格変動(Slippage)

現状Ethereum上で主流となるDEXは板取引ではなく販売所形式の様なSwap型です。見た目には販売所形式と似ていますが、ユーザーが流動性を提供しているケースが多いのがEthereum上のDEXです。

そして一回の取引で流動性プールに対して多くの売買を行った場合にはSlippageと言われる価格変動が発生します。今回の事件では意図的に流動性プールの小さいWBTCが狙われ、市場価格に対して40%もの不利な価格で最初の売買を成立させていました。

ところが普通はこうした取引における価格変動(Slippage)は取引を実行した側に対して不利なものであり、敢えて引き起こすメリット、インセンティブがあるという考慮はされて居なかったと思われます。仮に不利な取引をして価格変動を起こしても、価格変動の損を上回るアービトラージの機会を独占する事は困難だからです。

今回の事件でこの仕組がどういった形で利用されたのかについては後述します。

価格参照を行う為のオラクル

オラクル(Oracle)とは預言者を表す言葉であり、データベースではオラクル社が有名ですが、ブロックチェーンや一部システム系においてはの”特定情報の参照を行う手段”かという様な意味合いで使われます。これはDeFiにおいては非常に重要なキーワードとなっており、オラクルの主な用途は価格の参照(Price Feed Oracle)、チェーン外の情報参照等になります。

例えば、MakerDAOではETHとBATを担保にドルペッグなステーブルコインのSAIとDAIを借りる事が出来ますが、担保資産の価格が大きく下落して一定の維持率を下回った場合にはポジションが自動的に精算されてしまいます(俗に言うロスカットの様なもの)。

DeFiでは実際にオラクルが原因で資金を奪われた/失ったというケースが他にも存在します。今回起きたbZxに対する2度目の攻撃やSynthetixの合成ステーブルコインであるsKRWでも過去に事件がありました。

おおまかな事件の概要

詳細な用語やプラットフォーム名、具体的な数量を出来るだけ省いた上で、何が起きたのかを簡潔にまとめます。

何が起きたか?

  • 攻撃者はbZxというDeFiプラットフォームを利用し、DEX上で流通量の低いトークン(WBTC)に対してレバレッジ5倍のETH空売りを実行し、巨大な価格差を意図的且つ瞬間的に発生させた。
    ※WBTC・・・ビットコインをEthereum上のトークン化したものの一種
  • 攻撃者はこの巨大な価格差を利用してアービトラージを実行し利益を得たが、代わりにbZxというプラットフォームがこの価格差による損害を被らされた。

何故これが可能だったのか?

  • bZxは流動性が低いWBTCという資産に対して、流動性に依存して調達価格に大きなズレの発生するDEXを利用しており、また空売りの金額にも上限が設けられていなかった。
  • 攻撃者はフラッシュローンという1トランザクション内で貸借が完結すれば担保無しに資産が利用できる仕組みを利用し、攻撃に利用する為の10000ETH(およそ2800万ドル相当)を実質的に元手10ドル以下で調達した
  • 1トランザクション内に収まる瞬間的なアービトラージの機会であった為、攻撃者以外にはこのチャンスを認識する事は実質的に不可能だった

フラッシュローンとSlippageを利用したbZx事件の流れ

こちらはもっと詳細な説明です。

  1. フラッシュローン(1トランザクション内で借りて返すローン、解説は後述)を利用して元手のETHをdydxから調達
  2. ①で調達したETHを担保にレンディングプラットフォームのCompoundでWBTCを借りる
  3. 同時にbZxで①で調達したETHを元手にETHを”対WBTCで”5倍ショートポジションを作成。これによりDEX(Uniswap)上でWBTCの対ETH価格が大幅下落
  4. ③で発生した価格下落を利用し、②で借りたWBTCをETHに交換し、大きな利益(ETH)を得る
  5. WBTCの価格は元に戻り、WBTCを買い戻して②で借りたCompoundのWBTCを返却。更に最初の①のフラッシュローンで借りたETHをdydxで返却
  6. 結果的に1300ETHが攻撃者の手元に残り、ショートポジションを開いて精算を放置されたbZxには損害が発生

上記に関する補足

  • ③の価格下落が発生する仕組みはSwap型DEXの特徴であり、DEX側の流動性プール総量に対して取引額が大きい場合にはSlippageと呼ばれる様な価格差が発生してしまう仕様がある
    UniswapのWBTC流動性プールは総量が少ない為、巨大なSlippageを意図的に起こしやすかった
  • 合わせてbZx側でも上記の組み合わせに対抗する為の措置が無かった為、大きなレバレッジを掛けられた時点で損害が出る仕様だったとも言える

今回の事件に登場したプラットフォームの解説

dydxはDeFi上でマージントレード、レンディング、ボロウイングを行う事が出来ます。特徴としてはdydxのスマートコントラクト上に資産をレンディングした状態で、金利を得ながらマージントレードやボロウイングをWallet上からのSignのみで行える事です。DEXで有りながら普通の取引所に近い感覚で利用出来ます。

今回は攻撃者がフラッシュローンで元手となる10000ETHを調達する為に利用されました。尚、フラッシュローンはdydx本家UIのサービスでは提供されていません。

CompoundはDeFi上で最もメジャーなレンディングプラットフォームです。今回攻撃者はここに5500ETHを担保として預け、アービトラージで売却する為の112WBTCを借り受けました。

bZxはFulcrumというレンディングプラットフォーム、Torqueというマージントレードプラットフォームを提供していますが、中では繋がっている為に実質的にはbZxという一つのプラットフォームと捉えるべきでしょう。今回は流動性の低いWBTCのマージントレード5倍をKyberNetwork→Uniswapで提供していた事から、被害を受ける事になりました。

KyberNetworkはDeFi界隈では大手のDEXです。今回bZxはWBTCのポジション生成をする際、KyberNetworkからWBTC売買する形を取っていましたが、KyberNetworkではWBTCの売買を行う際にUniswapのプール(流動性)を利用していました。

Uniswapは誰でも自由にERC20トークンを上場したり、既存のトレードペア流動性に参加して、取引の手数料を得られるという特殊なDEXです。直接利用するユーザーは多くないと思われますが前述したKyberNetworkのケースの様に、利用するユーザーが意識せずともUniswapが組み込まれているケースがあります。

まとめ

DeFiで起きている事件を振り返ると、取引所とは異なりハッキングではなく仕様上の穴を突いた物が多い事に気が付きます。これは多くのDeFiで資産の出し入れが利用者のウォレットとスマートコントラクト間で直接行われる為であり、取引所にある様な利用者ログイン情報の流出や、能動的に手動で資産を出し入れする必要がない事が大きいのでは無いでしょうか。

同時に今回行われた攻撃の様に、システムに穴が見つかればそこを突かれてしまう欠点も持ち合わせています。結論としては取引所もDeFiも双方完璧ではありませんが、性質を上手く活用出来ればセキュリティは高まっていく事が期待出来ます。

また今回攻撃を受けたbZxは監査済みですが監査当時と現在では状況が異なり、フラッシュローンの登場と低流動性銘柄の組み合わせと言った要素が出てきています。新たな事件が起きる事でこうした問題点が認識され、徐々に対策も進んでいくと考えられます。

もう一点、DeFiプロダクトでもAdmin Keyと呼ばれる管理者権限が存在し、事前に指定した項目を更新する様な機能を持つケースがあります。今の所はこれが原因となる事件は出ていない上、ウォレットの秘密鍵程に万能ではありませんが、これがきっかけになって何かが起きる可能性も否定出来ません。

    【お詫びと訂正】bZx事件で起きた攻撃の手順について、一部修正しました。お詫びして訂正させていただきます。
The following two tabs change content below.
信玄

信玄

本業の傍ら趣味でブロックチェーン関連のリサーチを行うITインフラエンジニア。 DeFiを筆頭にDID、NFT、Layer2、Fiat Gateway、Contract Wallet等、幅広く情報を追っている。Twitter:@shingen_crypto