財布が盗まれたケースから、Web3のセキュリティガイドラインを探る
原文タイトル:《技術 | 一つの財布が盗まれたケースから、Web3の安全ガイドを探る》
原文出典:アファトゥ研究ノート
原文著者:クリス アファトゥ
事件
2022年元旦のある朝、小Cはコードを書く準備をして、Web3jsのオンチェーン契約取引のテストを続けていました。突然、自分のテストアカウント(Bscチェーン)がMetaMaskでゼロになっていることに気づきました。前の晩にはアカウントに100ドルあったのに、転送を確認したところ、
お金がなくなってしまった。お金はどこに行ったのか?
背景
技術出身の小Cは、最近ブロックチェーン開発を学んでいます。もともと専門の開発者で、非常に慎重に行動しており、通常はテストネットで実行し、終わった後に正式ネットワークにデプロイしますが、現在の産業がまだ比較的混乱していることに気づかず、油断してしまい、習慣的に行動した結果、損失を被りました。
損失はどのようにして発生したのか?
2021年の大晦日、小Cは偶然に面白いアカウントを見つけました(このアカウントは多くの活発な取引がありました)。それで彼はそのアカウントのいくつかのオンチェーン取引を追跡し、非常に興味深いプロジェクト(高い年利がある)を見つけました。そして、何も考えずに自分のMetaMaskに接続し、何も考えずに承認を行いました。一般的にWeb3のプロジェクトはこのプロセスで、承認してから送金が完了します。
しかし、驚くべきことが起こりました:クリックした後、サイト全体が突然フリーズしました(実際にはこのフリーズの間に、盗難者がすでにお金を転送していました)。何の反応もなく、小Cはその時は気にせず、サイトを閉じて他のことをしました。
約1日後、小Cが再び開発に戻ったとき、アカウントのお金がすべてなくなっていることに気づき、履歴を確認したところ、アカウントの残高がすべて転送されていました。
プロセスの振り返り
盗難者はどのようにして小Cのアカウントのお金を転送したのか?
現象:承認を行うと、理論的にはプライベートキーがなくても対応するお金をすべて転送できる。
小Cは追跡を行い、フィッシングサイトの承認に問題があったことを突き止め、その転送記録を追跡しました。

図のように、最初にフィッシング契約を承認し、フィッシング契約がアカウント内のBUSDを操作できるようにし、数量制限はありませんでした。
なぜBUSDだったのか?小Cは思い出しました。フィッシングサイトに入ると、デフォルトでBUSDが選択されていました。おそらく、サイトをブラウズしてウォレットを接続した後、盗難者はアカウント内のお金が最も多いトークンをすでに選別していたのでしょう。
その後、小Cはこれが新しいスワップ契約であり、高い年利があると思い、試してみることにしました。通常のプロセスに従って承認を行いました。承認が終わった後、サイトは直接フリーズしました。
その後の追跡によると、承認後数十秒で契約が直接転送操作をトリガーし、BUSDトークンを転送しました。
その後、承認情報を確認しました。

基本的にMetaMaskのデフォルトの承認は:
数字に変換すると、私たちが知っているのは1.157920892373162に10の59乗を掛けたものです。基本的に無限の転送と理解できます。この承認操作により、この契約は私のアカウントのトークンを無限に操作できるようになります。ここまで来ると背筋が寒くなります。以前に何度も承認をクリックしても、見ていなかったからです。
その後、ハッカーはこの契約方法を制御できるウォレットアドレスを操作し、契約の転送方法を発動させてお金を転送しました。したがって、友達はその後MetaMaskの承認を行う際には必ず注意してください。
小Cは確認したところ、盗難者は現在このアカウントに約3万ドルのトークンを持っており、今もなお次々と被害者が送金しています。しかし、ブロックチェーンに対しては何もできず、このハッカーが誰なのか全くわかりません。
問題が発生した段階
問題は一体どこにあったのか?
最近ブロックチェーンを学んでいる小Cは、このフィッシングの論理を整理しました。人を害する心は持たず、防ぐ心は持つべきです。興味がある方は以下を確認してください:
正常な転送
ケース1:ユーザー間の直接転送 AユーザーがBユーザーにBUSDを転送
契約は通常以下の論理をチェックします。
1)Aユーザーのアカウント残高が十分かどうか; 2)Aユーザーが転送を発起したかどうか
プロセスは以下の図の通りです。

正常な契約交換
私たちが普段使用するpancakeswap、uniswapなどの交換時のプロセスです。
ケース2:スワップを通じてトークンを交換 Aユーザーがトークンを交換(BUSDをWBNBに交換)するプロセス 契約は以下を判断します:
1)Aユーザーのアカウント残高が十分なBUSDを持っているか(仮にスワップ契約がAアカウントのBUSDトークンを操作できるように承認されていると仮定)
2)スワップ契約はAアカウントから500BUSDをスワップの契約プールに入れます(仮に為替レートが1:500とします)
3)成功後、契約はAアカウントに1BNBを転送します
注意すべきは第2、3点で、これは契約がトークンを操作することによって行われます。つまり、契約は私たちのアカウントのトークンに対する操作を直接発起することができます。

フィッシング契約
まずこの追跡図を見てください。

正常な転送では、転送者と契約を実行する転送者は同一人物であるべきです。つまり、上図(1)と(2)は同一人物が発起したものであるべきです。しかし、私が転送されたこの取引では、これら二つは同じアドレスではありません。推測するに、フィッシング契約を実行できるウォレットアドレスによって契約が実行され、私がフィッシング契約に承認したBUSDが転送されたのでしょう。
フィッシング契約を確認すると、予想通りフィッシング契約は暗号化された契約です。しかし、考えてみれば難しくはありません。Solidityを少し学んだ人は、契約を定義する際に、いくつかのAdminまたはOwnerを設定すればよいことを知っています。
したがって、今後はプロジェクト側の保証に注意し、知らないプロジェクトに承認を与えないようにしましょう!!!
安全な提案
この件があったため、小Cはいくつかの有用な提案や方法を調べ、多くの痛ましい教訓を目にしました。
ここにいくつかの方法を挙げますので、皆さんは自分の必要に応じて選択してください。
1)秘密鍵を共有しない
以前、1つの助記詞で複数のアカウントを生成するという投稿を見ましたが、これはお勧めしません。なぜなら、一度にすべてを失う可能性が高いからです。
2)秘密鍵をオフラインで保存する
現在、多くのクリップボードツールや入力法があなたのクリップボードの記録をクラウドにアップロードするため、直接コピーした場合、クラウドが漏洩すれば、あなたの秘密鍵は直接失われます。
私の提案は、生成後すぐにノートに書き写すことです。当然、ノートに書き写す際には、私の秘密鍵を自分の辞書で暗号化することもできます。例えば、aを1に、bを2に、1をaに置き換えることで、誰かがあなたの紙の秘密鍵を見ても、あなたのデジタル資産を動かせないようにできます。
3)開発とテストを分ける(エアドロップとメインアカウントを隔離)
2つのブラウザをインストールします。一つはChrome、もう一つはBraveです。一つはあなたのメインウォレットを管理し、もう一つはエアドロップを受け取ったり、さまざまなオンチェーン操作を行ったりするために使用します。
4)出所不明のソフトウェアをダウンロードしない
Baiduなどを使って出所不明のソフトウェアをダウンロードしないでください。私は、盗版MetaMaskをダウンロードして直接破産したケースを見たことがあります。必ず正規のアドレスからダウンロードしてください。条件があればGoogle PlayやChrome Web Storeなどを参考にしてください。
5)すぐに承認を確認する
確認するためのウェブサイトはいくつかあります。debankはオープンソースではありませんが、UIのインタラクションが良好です。後続のものはオープンソースですので、皆さん自身で選択してください。
https://debank.com/
https://approved.zone/
https://tac.dappstar.io/
https://ethallowance.com/

図に示されているように、基本的に無限です。
MetaMaskを呼び出すたびに、必ず承認をよく確認し、私のように無思考で承認をクリックして次に進まないようにしてください。
6)承認前に契約の安全性を確認する
https://www.slowmist.com/service-smart-contract-security-audit.html
慢雾の契約監査機能を使用できます。
また、その契約がオープンソースかどうかを確認し、オープンソースであれば、その契約がアップグレード可能な契約かどうかを確認する必要があります。
7)エアドロップや特典を受け取る際は安全に注意する
サブアカウントを使用して受け取り、大アカウントを使用しないでください。承認時に制限を設定できます!!!
8)ソーシャルエンジニアリングの侵入に警戒し、Discordでの知らない人とのプライベートチャットに注意する
例えば、DiscordやTelegramで、数日間知り合った人があなたにお金を稼がせるためにエアドロップを持ってきて、彼が送ったソフトウェアをインストールしてログインするように言う場合、99.99%の確率であなたは全てを失います。アカウントが盗まれます。
特にDiscordでは、NFTの公式Discordに入ると、誰かがプライベートメッセージを送ってきて、ホワイトリストを取得したと言い、ミントリンクを添付してきます。詐欺師は公式のように見えるアイコンや名前に変更し、実際にはあなたをグループに引き込んで実現しています。
実際、欲をかかなければ、このような詐欺はかなり簡単に見破ることができます。一般的には、数時間以内にミントすると言い、数量は1-10です。多くの人気プロジェクトでは、ホワイトリストで1つか2つの良いものがあれば十分です。いきなり最大の10個を持ち出して時間制限があるのはおかしいです。
また、詐欺師がプロジェクトの公式ウェブサイトを模倣して偽のウェブサイトを作り、プロジェクトのサーバー内の人々に私信を送り、彼らにミントさせることもあります。
さらに、ある友達がopenseaで偽のNFTを購入した後、公式のものでないことに気づき、数日後にそのNFTがアカウントから消えたのに、すでに引き落とされていました…(どうやって気づいたのか?チェーンを見て、公式Discordが公式のOpenseaのURLを発表したからです)
また、偽のcollab.landがウォレットのパスワードを詐取し、大Vにエアドロップを行い、その後大VがそのNFT/tokenを購入したと称することもあります。
新しい年が始まりましたので、皆さんは安全に注意してください。この文章を読んでいる皆さんが無事で順調であることを願っています!
本文は著者クリスに感謝します。













