「Trust but verify」(信頼するが検証する)は「事後」では行わない。最も深刻なバグは、照明の下で黒くなることです。> 契約の不変性により、プロジェクトは何年も前に書かれたコードに暗黙的に依存することになるため、バグを修正する際には、その潜在的な影響にさらに注意を払う必要があります。>>今回はこんな事になりました。## タイムラインこの記事では、このイベントに尽力したすべての人々を指すために「私たち」を使用します。私も最初はバグの発見に少し貢献しましたが、プロセス全体を通して数え切れないほどの人がもっと協力してくれたと感じています。**13:10 UTC** pETH/ETH 1,100万ドル [1] ドレイン。**13:19 UTC** Michal が、突然の pETH 価格下落について ETHSsecurity に投稿しました。最初に何かがおかしいことに気づいたのはイゴールだった。彼のおかげで、私たちはさらに調査を開始しました。> しかし、ロボットはどのようにして、remove_liquidity() 呼び出しで add_liquidity() を再入力するのでしょうか?>>**14:01 UTC** この問題に関して緊急対応チームを結成しました。**14:07 UTC** お気に入りのデコンパイラを使用しています [2] JPEGd コントラクトを逆コンパイルしたところ、再入保護スロットが少し異なることに気付きました。// add_liquidity(uint256 のディスパッチテーブルエントリ) [2] 、uint256)ラベル_0057:if (ストレージ [0x00] ) { 元に戻す(メモリ[0x00:0x00]); }保管所 [0x00] = 0x01;// Remove_liquidity(uint256,uint256) のテーブル エントリをディスパッチします [2] )ラベル_1AF3:if (ストレージ [0x02] ) { 元に戻す(メモリ[0x00:0x00]); }保管所 [0x02] = 0x01;**14:27 UTC** この問題は、簡単なローカル テスト契約で確認されました。@外部の@nonreentrant("ロック")def test(addr: アドレス) -> bool:Trueを返す@外部の@nonreentrant("ロック")def test2(addr: アドレス) -> bool:Falseを返すこれは単なる再入可能バグではありません。この時点で、私たちはこれがどれほど大きな影響を与えるかを認識しました。メッセージをブロックします。この脆弱性に関する公開メッセージを削除しました。**14:37 UTC** Wavey は、脆弱なコミットと影響を受けるバージョンの特定に役立ちました。 Charles と私は、Vyper コンパイラーの出力を手動で検査することでこれを確認しました。それはハッカーとの競争だ。ありがたいことに、これを読み取り専用の再入可能性と混同する人もいます。 Web3 Security Alert チャネルからの抜粋 - Alchemix と Metronome DAO も読み取り専用の再入バグによりハッキングされる [3]Michael は、バージョン 0.2.15 を実行している alETH および msETH プールにも潜在的な脆弱性を発見しました。**14:50 UTC** msETH/ETH が枯渇しました [4] 。**15:34 UTC** alETH/ETH が枯渇しました [5] 。**15:43 UTC** Vyper バージョン 0.3.0 でコンパイルされた CRV/ETH に脆弱性が見つかりました [6] 。影響を受ける契約を可能な限り長期間秘密にしておくことが重要です。**16:11 UTC** 私たちはホワイトハットの脆弱性への取り組みを開始します。残念なことに、あまりにも多くの組織が同時に独立した研究を行っており、噂が飛び交っています。 UTC 16:44 に、影響を受けるバージョンに関する公式声明を発表することを決定しました。 [7] 。UTC 18:32 までに、潜在的なホワイトハットレスキューに使用できる概念実証エクスプロイトを入手しました。 Chainlight の bpak も同時に脆弱性に取り組んでおり、19:06 UTC に脆弱性を共有しました。5分後の19:11 UTCに、何者かが資金を盗みました。 [8] 。攻撃構造は私たちの概念実証とは大きく異なり、私たちのチームからの漏洩である可能性は低いです。とにかく、とてもイライラします。それでも、やるべきことはたくさんあります。**21:26 UTC** アディソンは、CRVETH プールに残っている資産を保存するという野心的な計画を思いつきました。> 30k crv を crv/eth プールに送信すると、> 管理費を更新できます> 次に crv/eth レートを crv あたり 0.15 eth 程度に設定します> 基本的に、プール内の数百の K crv はすべて抽出できます>>**21:52 UTC** bpak は、3100 ETH を節約できる実用的な概念実証を作成しました。10 分後の 22:02 UTC に、私たちは再び敗北しました。驚くべきことに、CRV は経費ロボットを管理します [9] 資金が奪われ、プールが空になった [10] 。## 非難*非難(バルメ)*は強い言葉です。指を指すのは無駄です。もっと良くできることは何かを考えるのは有益だと思います。### コンテストホワイトハットの取り組みはすべて30分以内に敗北した。場合によっては、一秒一秒が重要になります。おそらくこれらの攻撃は、より適切な準備とリソースがあれば実行できたでしょう。同時に、これは両刃の剣であるようにも思えます。ハッキングの実行方法に関する情報をまとめることは本当に良い考えでしょうか?誰を信じるべきでしょうか?一方で、プロセス全体は非常に効果的だと思います。最初の疑いから誰が脆弱であるかの確認まで 2 時間 4 分で完了しました。### 情報開示私は監査人であると同時にホワイトハッカーでもあります。監査業界には独特の出版文化があります。私たちは、技術的な思考のリーダーシップと脆弱性に対する深い理解に対して報酬を得ています。彼らのリーダーシップと奥深さを実証する 1 つの方法は、 [11] ハッキングに関する「スクープ」。研究者は高価であり、投資収益率は宣伝になります。一方で、影響を受けるバージョンの早期開示がホワイトハット救済に重大な影響を与えるだろうという説得力のある議論もあります。あと 30 分あれば 1,800 万ドルを節約できたでしょう。監査人は、報告書の影響に対して対価を支払うことはありません。代わりに、いいね、リツイート、報道が得られます。これは問題があるようです。## 次のステップ「この問題を解決するには正式な検証が必要だ」などという意見には反対です。このエラーは単体テストで検出できます。形式的検証はさまざまなタイプのエラーに対して非常に役立ちますが、比較的単純で最適化されていないコンパイラに対しては同様に役立つとは思えません。このバグは 2021 年 11 月に修正されたことに注意してください [12] 。> このVyperの脆弱性はVyperチームの技術や言語自体の問題ではなく、むしろプロセスの問題だと思います。このバグは、修正時点では潜在的な影響を認識することなく、かなり前に修正されました。>>残念ながら、公共財は見落とされがちです。契約の不変性により、プロジェクトは何年も前に書かれたコードに暗黙的に依存します。プロトコル開発者とセキュリティ専門家は、実行スタック全体にわたる最新のセキュリティ開発を認識しておく必要があります。
Vyper ハッキングのタイムラインと反省
「Trust but verify」(信頼するが検証する)は「事後」では行わない。最も深刻なバグは、照明の下で黒くなることです。
今回はこんな事になりました。
## タイムライン
この記事では、このイベントに尽力したすべての人々を指すために「私たち」を使用します。私も最初はバグの発見に少し貢献しましたが、プロセス全体を通して数え切れないほどの人がもっと協力してくれたと感じています。
13:10 UTC pETH/ETH 1,100万ドル [1] ドレイン。
13:19 UTC Michal が、突然の pETH 価格下落について ETHSsecurity に投稿しました。
最初に何かがおかしいことに気づいたのはイゴールだった。彼のおかげで、私たちはさらに調査を開始しました。
14:01 UTC この問題に関して緊急対応チームを結成しました。
14:07 UTC お気に入りのデコンパイラを使用しています [2] JPEGd コントラクトを逆コンパイルしたところ、再入保護スロットが少し異なることに気付きました。
// add_liquidity(uint256 のディスパッチテーブルエントリ) [2] 、uint256) ラベル_0057: if (ストレージ [0x00] ) { 元に戻す(メモリ[0x00:0x00]); } 保管所 [0x00] = 0x01; // Remove_liquidity(uint256,uint256) のテーブル エントリをディスパッチします [2] ) ラベル_1AF3: if (ストレージ [0x02] ) { 元に戻す(メモリ[0x00:0x00]); } 保管所 [0x02] = 0x01;
14:27 UTC この問題は、簡単なローカル テスト契約で確認されました。
@外部の @nonreentrant("ロック") def test(addr: アドレス) -> bool: Trueを返す @外部の @nonreentrant("ロック") def test2(addr: アドレス) -> bool: Falseを返す
これは単なる再入可能バグではありません。
この時点で、私たちはこれがどれほど大きな影響を与えるかを認識しました。メッセージをブロックします。この脆弱性に関する公開メッセージを削除しました。
14:37 UTC Wavey は、脆弱なコミットと影響を受けるバージョンの特定に役立ちました。 Charles と私は、Vyper コンパイラーの出力を手動で検査することでこれを確認しました。
それはハッカーとの競争だ。
ありがたいことに、これを読み取り専用の再入可能性と混同する人もいます。 Web3 Security Alert チャネルからの抜粋 - Alchemix と Metronome DAO も読み取り専用の再入バグによりハッキングされる [3]
Michael は、バージョン 0.2.15 を実行している alETH および msETH プールにも潜在的な脆弱性を発見しました。
14:50 UTC msETH/ETH が枯渇しました [4] 。
15:34 UTC alETH/ETH が枯渇しました [5] 。
15:43 UTC Vyper バージョン 0.3.0 でコンパイルされた CRV/ETH に脆弱性が見つかりました [6] 。影響を受ける契約を可能な限り長期間秘密にしておくことが重要です。
16:11 UTC 私たちはホワイトハットの脆弱性への取り組みを開始します。
残念なことに、あまりにも多くの組織が同時に独立した研究を行っており、噂が飛び交っています。 UTC 16:44 に、影響を受けるバージョンに関する公式声明を発表することを決定しました。 [7] 。
UTC 18:32 までに、潜在的なホワイトハットレスキューに使用できる概念実証エクスプロイトを入手しました。 Chainlight の bpak も同時に脆弱性に取り組んでおり、19:06 UTC に脆弱性を共有しました。
5分後の19:11 UTCに、何者かが資金を盗みました。 [8] 。
攻撃構造は私たちの概念実証とは大きく異なり、私たちのチームからの漏洩である可能性は低いです。とにかく、とてもイライラします。
それでも、やるべきことはたくさんあります。
21:26 UTC アディソンは、CRVETH プールに残っている資産を保存するという野心的な計画を思いつきました。
21:52 UTC bpak は、3100 ETH を節約できる実用的な概念実証を作成しました。
10 分後の 22:02 UTC に、私たちは再び敗北しました。驚くべきことに、CRV は経費ロボットを管理します [9] 資金が奪われ、プールが空になった [10] 。
## 非難
*非難(バルメ)*は強い言葉です。指を指すのは無駄です。もっと良くできることは何かを考えるのは有益だと思います。
コンテスト
ホワイトハットの取り組みはすべて30分以内に敗北した。場合によっては、一秒一秒が重要になります。
おそらくこれらの攻撃は、より適切な準備とリソースがあれば実行できたでしょう。同時に、これは両刃の剣であるようにも思えます。ハッキングの実行方法に関する情報をまとめることは本当に良い考えでしょうか?誰を信じるべきでしょうか?
一方で、プロセス全体は非常に効果的だと思います。最初の疑いから誰が脆弱であるかの確認まで 2 時間 4 分で完了しました。
### 情報開示
私は監査人であると同時にホワイトハッカーでもあります。
監査業界には独特の出版文化があります。私たちは、技術的な思考のリーダーシップと脆弱性に対する深い理解に対して報酬を得ています。彼らのリーダーシップと奥深さを実証する 1 つの方法は、 [11] ハッキングに関する「スクープ」。研究者は高価であり、投資収益率は宣伝になります。
一方で、影響を受けるバージョンの早期開示がホワイトハット救済に重大な影響を与えるだろうという説得力のある議論もあります。
あと 30 分あれば 1,800 万ドルを節約できたでしょう。
監査人は、報告書の影響に対して対価を支払うことはありません。代わりに、いいね、リツイート、報道が得られます。これは問題があるようです。
## 次のステップ
「この問題を解決するには正式な検証が必要だ」などという意見には反対です。このエラーは単体テストで検出できます。形式的検証はさまざまなタイプのエラーに対して非常に役立ちますが、比較的単純で最適化されていないコンパイラに対しては同様に役立つとは思えません。
このバグは 2021 年 11 月に修正されたことに注意してください [12] 。
残念ながら、公共財は見落とされがちです。契約の不変性により、プロジェクトは何年も前に書かれたコードに暗黙的に依存します。プロトコル開発者とセキュリティ専門家は、実行スタック全体にわたる最新のセキュリティ開発を認識しておく必要があります。