PREMINT攻撃事件全解析
著者:Go+ Security
7月17日16:00(UTC+8)、premint.xyzがハッキングされ、一部のユーザーのNFTが盗まれました。攻撃事件発生後、GoPlusのセキュリティアナリストは迅速に全面的な解析を行い、一般投資家と開発者の2つの視点からセキュリティアドバイスを提供しました。
攻撃プロセス
- 攻撃者はpremint.xyzのウェブサイトに悪意のあるJSスクリプトを埋め込むことで攻撃を行い、ユーザーが通常の操作を行う際に悪意のあるコードを実行し、ユーザーに対して承認操作setApprovalForAll(address,bool)の取引に署名させました。承認を騙し取った後、ユーザーのNFTなどの資産を盗みました。
攻撃原理
- ユーザーがhttps://www.premint.xyz/にアクセスすると、ウェブサイトは以下のjsリソースファイルhttps://s3-redwood-labs.premint.xyz/theme/js/boomerang.min.jsを読み込みます。

- このファイルにはハッカーによってscriptスクリプトが注入されており、そのスクリプトはハッカーの偽ドメイン(s3-redwood-labs-premint-xyz.com)にホストされた攻撃スクリプトファイルhttps://s3-redwood-labs-premint-xyz.com/cdn.min.js?v=1658050292559を読み込みます。このスクリプトにはユーザーの承認を騙し取るインタラクションが含まれています(現在はアクセスできません)。
- ユーザーが通常のウォレット所有権の確認署名(つまり、署名ログイン)操作を行うと、このスクリプトがトリガーされ、元の検証署名が攻撃者がユーザーの高価なNFTを移転できる取引に置き換えられます。一度この取引が署名されると、資産は盗まれます。(注:攻撃スクリプトは状況に応じてユーザーのERC20トークンの承認を騙し取る可能性もありますが、スクリプトが現在アクセスできないため、詳細は不明です。)
防ぎようがない
- 今回の攻撃は一般ユーザーにとって、最も対処が難しく、最も簡単に引っかかる可能性があります。
- 攻撃のすべてのC端インタラクションはPremintの公式ウェブサイト内で行われており、まず最初に公式ウェブサイトには問題がないと誰もが思い込むため、警戒心が薄れやすいです。
- 取引署名を騙し取るプロセスは、通常の操作の署名検証プロセス中に発生します。ほとんどのユーザーはウォレットの署名詳細を確認しないため(大部分のユーザーは署名が安全かどうかを判断する方法を理解しておらず、公式に対する信頼からこのステップのリスクを非常に簡単に無視してしまいます)、攻撃プロセスは非常に巧妙です。
脆弱性はどこにあるか
皆さんは、なぜPremintの公式ウェブサイトに攻撃コードが存在するのか不思議に思うかもしれません。これは、ホストされているS3(AWSのオブジェクトストレージサービス)のjsリソースファイルがハッカーによって侵入され、改ざんされたためです。
なぜ侵入されたのかについては、現時点での資料から、S3の設定に誤りがあり、バケットが未承認のアクセスを許可していたため、攻撃者がS3バケットを自由に列挙、読み取り、書き込みできるようになり、jsリソースファイルを改ざんできたと疑われます。
このプロセス全体で最も理解しがたいのは、ハッカーの攻撃行為が17日16:00(UTC+8)に発見されたにもかかわらず、17日22:00(UTC+8)までPremint公式が攻撃されたjsファイルを修正しなかったことです。boomerang.min.jsファイルには依然としてハッカーによって注入された悪意のあるscriptが含まれており、ページが読み込まれる際にはハッカーの攻撃スクリプトファイルが読み込まれ続けていました。ただし、この悪意のあるscript自体はすでにアクセスできなくなっていました(攻撃ドメインs3-redwood-labs-premint-xyz.comはアクセスできなくなっています)。この状態は6時間続き、もしこのスクリプトが復活した場合、さらなる損失が引き起こされるかどうかは判断が難しいです。


教訓
教訓1:一般投資家として私たちはどうすればよいか?公式ウェブサイトが信頼できない場合、どうやって騙されないようにするか?
- 今回の攻撃は、技術を理解していない多くのユーザーにとって、基本的に「初見殺し」と言えます。100%引っかかる可能性が高いです。誰もが公式ウェブサイトに詐欺があるとは無関心です。しかし、考えてみると、すべてのチェーン上の取引はウォレットの署名を通過する必要があるため、署名内容に注意を払えばリスクを識別することができます。
- 多くのブロックチェーンユーザーには非常に悪い習慣があります。ウォレットに入ると、ガスの調整を除いて、他のステップは無意識に操作します。実際、署名前の確認情報には多くの重要な内容が含まれており、GoPlus Securityは、署名操作を行う前に必ず詳細を確認することをお勧めします。
- 今回の攻撃を例にとると、ユーザーがPremintで署名検証を行う際、情報の検証だけであり、上チェーンの必要がないため、発信されるSignature RequestはOrigin情報(リクエスター)、ユーザーのアドレス、Nonce情報、いくつかの追加の返却情報のみを含むべきです。以下の図のように(https://www.premint.xyz/が一時的にオフラインのため、Openseaを例にします):

- しかし、攻撃後に注入されて改ざんされた取引署名は、取引を上チェーンする必要があるため、取引はコントラクト呼び出しの形式でより多くの情報を表示します。例えば、setApprovalForAllを使用したNFTの承認では、この取引がどこで行われたか(図中はetherscan)、どのメソッドが呼び出されたか(setApprovalForAll)、承認対象は誰か、消費したETHの量が表示されます。

- 振り返ってみると、ネットユーザーが提供したスクリーンショットによれば、Permintが攻撃を受けた後、操作の提示は署名の検証ですが、実際にウォレット署名を引き出す取引は完全に上チェーンのsetApprovalForAllであり、上の図と完全に一致しています。少し観察すれば、ここに問題があることがわかります。

- 実際、コントラクトの各種呼び出し、ETH(または他のネイティブコイン)の転送、トークンの転送など、ウォレット内の署名情報はすべて異なります。すべての投資家はその違いを理解し、このような攻撃による損失を避けるべきです。GoPlus Securityは、皆さんが操作プロセスを自分でシミュレーションし、さまざまな署名情報を理解することを強くお勧めします(取引を発信しなければ費用は発生しませんので、学費は不要です)。一度署名情報の見方を学べば、ほぼすべてのフィッシング、注入、詐欺攻撃を回避できるようになります。
- 怠けずに、自分の安全を確保したいなら、学ぶことが唯一の方法です。
教訓2:開発者として私たちはどうすればよいか?注入攻撃を避けるには?
- 今回の攻撃は、開発者にとって最大の教訓は、web3.0の世界がweb2.0から独立して存在できない以上、web2.0と同じ攻撃手法を受け入れなければならないということです。単にコントラクトレベルで自分の安全を確保するだけでは不十分であり、すべての伝統的なセキュリティ準備を怠ってはいけません。どんな小さな不注意も重大な損失を引き起こす可能性があります。
- また、このような問題に直面した場合は、すぐに修正または隔離を行うべきです。もし運が良ければ、リスク源を第一に処理しなければならず、安全分析者に皮肉られるのは小さな問題です。万が一攻撃手段がまだ利用可能であれば、損失は継続的に発生する可能性があり、これは大きな問題です。











