800万ドル相当の被害
分散型金融(DeFi)のレンディングサービスであるbZxで再び脆弱性が見つかった。
bZxが13日、「iToken複製事故報告」と題した報告書を発表した。報告では、bZxは以下の一連の対応を行い、顧客資産には影響がないとしている。
- トークンの転送機能の異常動作を検知
- トークンの生成やバーンなど関連する機能を一時停止
- プログラムの修正
- 修正プログラムの監査機関による承認
- 関連機能の再開
今回の事件ではトークンが奪われた訳ではなく、bZX側が総額800万ドル相当の負債を計上した。
bZXは、このような事故は予め想定していたもので、それを考慮したプロトコル設計になっているので問題なくプロジェクトは進行していくと説明している。
このプロトコルは、一流のセキュリティ企業である Peckshield 社と Certik 社によって厳重に監査された。…残念ながら、監査は銀の弾丸ではない。…私たちのシステムもMakerDAOと同様*にトークンの価値でシステムの負債をバックアップしている。このような事故が発生しても、当社の予防策とシステム設計が問題なく解決できることに感謝している。
*MakerDAOではETHの急激な値下がりによって担保率が100%を下回った場合、ガバナンストークンであるMKRによって負債がカバーされる。
なお、bZxでは今年2月にも2度、システムの穴を突いた攻撃を受けている。
脆弱性の詳細
問題のあったトークン転送のコードは以下のような処理になっていた。
- 送り主と送り先のアドレスから残高を取得
- 送り主の残高を送金額をひいた値に更新
- 送り先の残高を送金額を加えた値に更新
ここで、送り主と送り先を同じアドレスにすることで、2番目の手順で総金額を引かれた残高が総金額を加えた残高になってしまい、送った金額分のトークンが誰からも失われることなく増えてしまう状態だった。
修正後は以下のような処理になっている。
- 送り主の残高を取得
- 送り主の残高を送金額をひいた値に更新
- 送り先の残高を取得
- 送り先の残高を送金額を加えた値に更新
送る金額を引いてから送り先の残高を参照することで、送り主と送り先を同じアドレスにしてトークンが増えることは無くなった。
画像はShutterstockのライセンス許諾により使用