寄付窓口はこちら

Google Play でインストールしたウォレットアプリから暗号資産が奪われる件について

先日Twitterを眺めていたら、「Phantom Wallet(Solanaブロックチェーン向けのウォレットアプリ)を利用していたら暗号資産が奪われてしまった」という話を見かた。

その件について実態を調査したので書き留めておく。

先に書いておくと、 Google PlayではSolana以外のブロックチェーンを対象とするウォレットにも暗号資産を詐取されるものが存在します。 Salanaユーザー以外も気をつけてください。ただ、 Solanaはモバイルに対応した正規のウォレットがまだ少ないため、結果的に多くの人がスキャムアプリをインストールしてしまいやすい 状況にありそうです。

Google Play でPhantom Walletの不正な(偽の)モバイルウォレットアプリが配布されている

Solanaブロックチェーンに対応したウォレットとして一定の知名度があるPhantomウォレットというウォレットがある。

f:id:niwatako:20211019214609j:plain

このウォレットはモバイルアプリ版が存在しないはずである(現在開発中の様子)。

f:id:niwatako:20211019214533j:plain

f:id:niwatako:20211019234509j:plain

しかし何者かがPhantomウォレットの名称やロゴを利用して偽物のアプリを配布している。

f:id:niwatako:20211019214118j:plain

時折削除されるが、時間が立つと再び、開発者アカウントを替えて配布されるいたちごっことなっている。

f:id:niwatako:20211019214120j:plain

f:id:niwatako:20211019214740j:plain

どのような不正を働くのか

不正なモバイルアプリの見た目は、正規のPhantomウォレット(Chrome Extension)の見た目に似せて作られている。

正規のPhantomWalletの初期画面はこのような画面である。

f:id:niwatako:20211019214754j:plain

「Use Secret Recovery Phrase」「Create New Wallet」の2つのボタンがある。

「Create New Wallet」を選ぶと、暗号資産を管理するために必要な秘密鍵のシードとなる「ニーモニック(人間が覚えやすい単語の羅列)」を新たに生成する。

「Use Secret Recovery Phrase」では、すでに「Create New Wallet」や他のアプリで生成したニーモニックを持つ人が、そのニーモニックを入力することで、このアプリ上で秘密鍵を復元することができる。

ニーモニック、秘密鍵、公開鍵、アドレスについておさらいしておく。

f:id:niwatako:20211019220528j:plain

ニーモニックから秘密鍵が生成され、秘密鍵から公開鍵が生成され、公開鍵からアドレスが生成される。

暗号資産の移転には、秘密鍵による電子署名が必要である。したがって、暗号資産の持ち主は、ニーモニックと秘密鍵を他人には知られないようにしなければならない。

アドレスや公開鍵は、暗号資産が存在する「場所」を示したり、暗号資産を移転する電子署名が正しいものかを第三者が検証することに利用される。公開鍵とアドレスは知られても良い情報である。

不正なアプリは、2つの方法で利用者の暗号資産を奪うことを狙っている。 利用者に攻撃者のニーモニックやアドレス(攻撃者が秘密鍵を知っているアドレス)を利用させる 。または、 利用者のニーモニックを詐取する。 これらの結果、利用者の暗号資産が攻撃者に奪われてしまう。

手口

Create New Wallet

不正なアプリも、正規のPhantomWalletと同様の初期画面を表示する。

f:id:niwatako:20211019220012j:plain

しかし、このアプリはHTMLで作られた「紙芝居」となっており、「Create New Wallet」では実際に新たにニーモニックを生成するのではなく、 予め決められたニーモニックとアドレスが表示される (何度実行しても、誰がどの端末で実行しても、同じニーモニックとアドレスが表示される)。

f:id:niwatako:20211019220221j:plain

生成されたように見えるアドレスは、実際には途中で表示されたニーモニックとは一切関係がない。表示されたアドレスの秘密鍵を知っているのはこの不正アプリを配布している攻撃者である。

f:id:niwatako:20211019220224j:plain

HTMLでできたただの紙芝居アプリであるため、残高は常に0を固定で表示する。仮に残高が存在していてもそれを移転するための機能は搭載されていない。

利用者が 出来上がったアドレスに取引所などから暗号資産を移転すると、残高の表示は増えず、やがて、秘密鍵を知っている攻撃者がその暗号資産を奪ってしまう。

他の正規のウォレットにニーモニックを入力しても、ニーモニックとアドレスにはなんの関係もないため、当該アドレスに対応する秘密鍵は生成できない。利用者は、攻撃者が暗号資産を回収するの見ているしかない。

f:id:niwatako:20211019222549j:plain

Use Secret Recovery Phrase

より被害が大きいのはおそらくこちらであろう。

「Use Secret Recovery Phrase」は 入力されたニーモニックを外部に送信 するフォーム画面になっている。

f:id:niwatako:20211019220244j:plain

利用者がニーモニックを入力し、Importを実行すると、アプリの画面には必ず失敗メッセージを表示する。

f:id:niwatako:20211019220246j:plain

しかし裏では、Importボタンを押した際にフォームに入力されたニーモニックを外部に送信する。送信されるPOSTデータには、フォームに入力されたニーモニックがそのまま記載されていることが確認できた。

f:id:niwatako:20211019224627j:plain

利用者がすでに他の正規のウォレットアプリで利用しているニーモニックを取得した攻撃者は、利用者のウォレットを完全にコントロールできるようになる。ウォレットの残高や、利用者がDeFiにロックしていた資産等を奪うことができる。

f:id:niwatako:20211019224833j:plain

被害状況

国内外(日本語、外国語)で被害者を見つけることができる。

f:id:niwatako:20211019230604j:plain

f:id:niwatako:20211019230607j:plain

「Create New Wallet」で生成されたように見えるアドレスに暗号資産を移転してしまっているのは、2021/10/14時点で140SOL程度であった(当時時価240万円程度)。

また、中には「Create New Wallet」の途中で表示されるニーモニックから本来生成されるアドレスに暗号資産を移転している利用者も存在するようで、そちらのアドレスには360SOL(2021/10/14時点の時価でおよそ600万円)ほどが移転され、そしてすぐ何者かによって別のアドレスに移転されていた。 このニーモニックは同不正アプリをインストールした誰もが知りうるニーモニックであるため、この移転が攻撃者によるものかはわからない。

(なお、ニーモニックを知っているからと言って他人の資産と知っていながらその暗号資産を移転してしまえば、犯罪となる可能性があるので注意する。たとえば、従来のサイバー犯罪で類似するものを挙げれば、パスワードを知っているからと言って他人のアカウントにログインした場合逮捕される。トランザクション送信時のIPや、その後の資産の動きで個人が特定される可能性は十分にある)

「Use Secret Recovery Phrase」を利用し、ニーモニックを犯人に送信してしまった利用者の被害状況は不明である。ニーモニックを詐取された被害者のアドレスを第三者(私)が知る方法はないため、具体的な被害を直接知る方法はない。

f:id:niwatako:20211019230347j:plain

ただ、「Create New Wallet」を選んで初めて使い始めようとした利用者が、移転した暗号資産を失い「おや?」と思うケースよりも、すでに他のウォレットアプリを長く利用していて様々な通貨の残高があり、様々なDeFiを利用しているウォレットのニーモニックが奪われた場合のほうが被害額が大きいのではないかと推定している。

また、「Create New Wallet」で生成されたニーモニックやアドレスから移転された暗号資産を追うと、あるアドレスに行き着くことが多いように思われる。

そのアドレスには200億円程度の残高があった。仮に攻撃者がすべての奪った資産をそのアドレスに集約しているとするならば、「Use Secret Recovery Phrase」経由を含めた全体の被害額は200億円程度に上る可能性がある(要詳細なトランザクションの解析)。

利用者はどうしたらよいか

このような攻撃を防ぐために利用者はどのような防御策が考えられるだろうか。

思いつくままに書いて見るので、ぜひ読者の皆さんからも、Twitterや当記事へのコメントでご意見をいただきたい。

Google Play やApp Storeなどを信じない。

Google や Appleのアプリレビュー担当者が実際に暗号資産を購入してウォレットを使ってみるわけがないので、実際に資産を入れるとどうなるかまではGoogleやAppleは審査していないだろう。

今回のような紙芝居アプリとして動いていれば十分審査を通ってしまう。

インストールしたアプリが実際に暗号資産ウォレットとして正しい挙動をするかは、利用者が自身で確かめなければならない。Don't Trust. Verify.

リリース時期やダウンロード数、レビューなどを確認する

新しすぎるアプリは、まだ発見されていない不正アプリかもしれない。

Metamaskのインストール数は「5,000,000+」に対し、今回の不正アプリは「1000+」だった。有名なアプリにしては少なすぎるだろう。

レビューも、不正アプリには殆どついていないか、これはスキャムだ!という書き込みがあったりする。人気で長く使われているアプリにはたくさんのレビューがあるのが通常である。

自身で見極めが難しい利用者も、十分な期間と十分な数のインストール数・レビュー数などの実績を一定の参考にすることができる。

リンクをたどる

アプリの紹介ページに表示される開発元のウェブサイトや、メールアドレスのドメインと、正規の開発元のWebサイトの案内が相互にリンクされているか確かめる。

(正規の開発元のWebページを正しく見つけるのも難しいので注意する。検索結果の上の方には「広告」として不正なWebサイトが表示されていることがある。信頼性の高いWebメディアの記事やSNSアカウントなど、なるべく多くのソースを使って多面的に確からしさを確認する必要がある)

アプリの紹介に記載されているドメインの「〜.com」などの最後の部分が正規のWebサイトと異なっていないか。途中の文字に「o」「0」になっているなど不審な点はないか。Webサイトにはモバイル版の案内がないのにStoreに存在するアプリは怪しい。Webにモバイル版の紹介があるならそこからリンクをクリックしたほうが良い。ストアの検索結果には偽物がいくらでも紛れ込むことができる。

2回使ってみよう

今回のアプリは紙芝居になっており、Create Walletを繰り返しても同じニーモニックとアドレスが表示されていた。

このような単純な手口は2回繰り返して利用してみれば気付ける。

生成されたアドレスが既に使われていないか確かめる

今回のアプリは誰に対しても同じアドレスを表示していた。このような場合、生成されたアドレスが既に利用されたことがないか確かめることで、自分以外に資産をコントロールできる人物が存在しないかを確認できる。

これは、アプリが不正をしていなくても、奇跡的に衝突がおきて偶然他人と同じアドレスになっているようなことが、ほぼありえないがあるかもしれない。特に、シードの生成ロジックのランダム性に偏りがあって衝突が発生する可能性が上がる場合もある。

ニーモニックからアドレスの生成が正しく動いているか確かめる

ニーモニックが表示され、アドレスが生成される。では、「このニーモニックから本当にこのアドレスが導き出せるのだろうか?」

不正アプリで生成されたニーモニックをChrome Extension版のPhantom Walletに入力して復元を試せば、同じアドレスが生成できないことに気づけた。

また、Phantom Wallet同士ではなく、別のWalletアプリでもニーモニックが使えるか試したほうがいい。これは、Phantom Walletがモバイル版もブラウザ拡張版も消えたときに他のウォレットでリカバリーできるかを確かめる意味もある。

他のウォレットと互換性のない規格を使っていたり、開発元が規格を勘違いしていて(またはバグを仕込んでいて)他のアプリでは正しく復元できないような事態を予め回避することもできる。

まずは少額で挙動を試す

「Create New Wallet」していきなり資産全額を入れない。

少額を入れて、何者かが奪っていかないか、何日か様子を見てみたほうが良いだろう。

また、不正の意図がなくても、出金する機能にバグがあって入れた暗号資産を取り出せないとなれば一大事なので、やはり少額から試すべきである。

「Use Secret Recovery Phrase」も、いきなり大事なウォレットのニーモニックを入力するのではなく、少額を入れたアドレスのニーモニックを入れてみて、そのアドレスに異変が起きないか様子を見たほうがいいだろう。

可能ならデバッグする

これは技術者向けになるが、アプリの通信を覗き見て、ニーモニックや秘密鍵を外部に送信していないか確認できると良い。

今回の不正アプリはRoot化したアンドロイド端末に自己署名証明書をインストールし、プロキシ経由でSSL通信を覗き見て、外部にニーモニックを送信していることを確認した。