Spook.js、その仕組み

脆弱性Spectreを利用した初めての実践的な攻撃である「Spook.js」は、どのように機能するのか。

フィッシング攻撃というものは、リンクをクリックする、悪意あるWebページに行きつく、何か情報を入力する、その情報を攻撃者が盗む、という段階を踏んで進行します。では、リンクをクリックする、攻撃者が情報を盗む、という形のフィッシング攻撃は?今回は、CPUの基本的な機能を悪用し、相手が何も入力しなくてもデータを盗む悪意あるページの話をしたいと思います。ここで問題となる脆弱性の修正は、不可能とは言わないまでも、非常に困難です。

2018年、プロセッサの2つの脆弱性(SpectreとMeltdown)が公表されたことで、このシナリオが理論的に可能であることが証明されました。それから3年後の2021年9月、Spectre V1の現実的な攻撃が初めて登場しました。「Spook.js」の名で知られるこの攻撃のコンセプトは複雑ですが、読み解いていくことにしましょう。

Spectre V1の背景

SpectreとMeltdownが初めて報じられたのは、2018年のことです。これらの脆弱性に対する攻撃は、現代の全CPUに見られる、コマンド実行のスピードアップを目的とした分岐予測のメカニズムを悪用するものでした。

脆弱性Spectreのロゴ

Webサイトにパスワードを入力してログインするとき、パスワードが正しければ、一連の指令が実行されます。正しくない場合は、別の指令セットが実行されます。しかし、正しいか正しくないかの答えを受け取る前に、可能性が高いと見た方の指令セットをCPUが実行を開始するのが、分岐予測です。

パスワードが過去100回にわたって正しく入力されてきた場合、CPUは今回も同じだろうと仮定します。この推測が正しければ、パフォーマンスは向上します。正しくなければ、CPUは、投機的に実行した命令を廃棄してもう一方のセットを実行します。

脆弱性Spectreを使った攻撃では、プログラムがアクセスできないデータ領域の読み取りが試行されます。攻撃の第1段階では、オープンアクセスなデータ領域に対して複数の呼び出しが行われ、それによって分岐予測システムは、禁じられている読み取り操作も実行するように「訓練」されます。CPUは、実際に読み取りが許可されているデータの読み取りを要求するプログラムに慣れているため、分岐予測を使って事前に操作を実行します。 しかし、チェックの結果、そのプログラムがそのデータへアクセスすることが禁じられていることが判明し、投機的に実行された演算は廃棄されます。ここまではよいのですが、CPUによって読み取られたデータは、CPU自体のメモリであるキャッシュにしばらく保管されます。

興味深いのはここからです。CPUのキャッシュから機密データを直接読み取る方法がないため、悪意あるプロセスは、いわゆるサイドチャネル攻撃を展開してデータを盗みます。これは特定の情報にアクセスするまでのスピードを測定するもので、値が比較的小さければデータはキャッシュ内にあることを示し、大きければデータが通常のRAMからロードされていることを示します。一連の読み取り試行の結果、機密情報が漏洩します。

これは基本的なCPUの欠陥で、修正するには分岐予測を完全に無効化するしかなく、パフォーマンスが大きな影響を受けます。とはいえ、Spectre攻撃には多くの制約があります。

  • 攻撃者は標的のコンピューターまたはモバイルデバイス上でプログラムコードを実行可能でなければならない。
  • 攻撃を成功させる条件を作り出すようにコーディングされた特定のターゲットプログラムが必要である。
  • 攻撃に成功しても、データ抽出速度は毎秒数十〜数百バイトと極めて遅く、また、読み取りエラーが起きないとはとても言えないレベルである。
  • 全般的に、意図した秘密情報を盗みだすには、パスワード、暗号鍵といった諸条件が揃っている必要がある。

Spook.js—Spectre V1の現実的な応用

Spectreはそれほど危険ではない、と結論付けられるかもしれません。結局のところ、攻撃者が標的コンピューター上でコードを実行可能なら、OSないしはインストール済みプログラムに潜む多数の脆弱性をどれか一つ悪用すれば、もっと簡単に権限の昇格やデータの窃取を行うことができます。

それは確かにそのとおりですが、現代のWebページには、利用者のコンピューター上、つまりブラウザー内で実行するプログラムコードも大量に含まれています。Spook.js攻撃は、まさにそこを付いてSpectre V1を悪用します。感染したページをブラウザーが読み込み、ブラウザーが悪意あるコードを実行し、サイバー犯罪者が機密情報を盗むのです。

こちらのレポート(英語)では、実践的な攻撃のデモが紹介されています。Tumblrからユーザーパスワードを盗む攻撃、Lastpassからデータを盗む攻撃、さらには、プライベートストレージからGoogleサーバーへアップロードされた画像の傍受もあります。

こうした攻撃には、Google Chromeの持つ、ある機能が関わっています。Spectreに関する情報が公開されて以降、Chromeの開発者たちは、Webサイトを分離して読み込ませることで攻撃をかわすという措置を講じてきました。Webサイトごとにプロセスが作成されるので、あるページに悪意あるコードがあったとしても、そのコードを使って別のWebページからデータを盗むことはできません。しかし、一つ例外があり、同じWebサイトまたは同じドメインの複数ページは一つの共通のブラウザー処理にまとめられます。そのうちの一ページで悪意あるコード(JavaScript。攻撃名に「.js」とあるのはそのため)が実行していると、他のページにある情報を盗むことが可能となります。

Tumblrに対するSpectre.js攻撃

Tumblrは、情報共有型という性質から、悪意あるコードの置き場所となる可能性があります(少なくとも理論上は)。一つのタブで悪意あるページが開いている場合、別のタブでTumblrにログインしようとしたときにブラウザーから自動入力されるユーザー名とパスワードは、悪意あるページ上の悪意あるコードによって窃取可能です。

脆弱性Spectreを悪用することで、同じWebサイトから開いた別のタブに接線的に作用し、間接的手段によってデータを盗むことができます。この方法で攻撃が成功した場合、痕跡はほとんど残りません。

LastPassに対するSpectre.js攻撃

パスワードマネージャーであるLastPassに対する攻撃では、悪意あるChrome拡張機能を使用しています。この拡張機能には、Spectre V1を使ってデータを盗むコードが埋め込まれています。LastPassの拡張機能を同じブラウザー内で実行すると、両方の拡張機能が共通のブラウザープロセス内で実行される形となり、データ窃取が可能となります。

Google Cloud Storageに対するSpecter.js攻撃

Google Cloud Storageに対する攻撃を使用した例も紹介されています。ブラウザーのタブの一つにはsites.google.com上にホストされた悪意あるページがあり、別のタブではG Suite(Google Workspace)サービス内のプライベートストレージに画像をアップロードできるようになっています。このシナリオでは、攻撃者は悪意あるコードを使用して画像にアクセスが可能です。

元の画像と、Spook.js によってGoogle Cloud Storageから盗まれた画像の比較

元の画像(左)と、Spook.js によってGoogle Cloud Storageから盗まれた画像(右)出典

攻撃成立の制約

調査チームは、さまざまなCPUを対象に、この攻撃の実行可能性を試しました。対象となったCPUはIntel 製、AMD製、ARMベースのApple製M1です。すべてのケースで、攻撃はGoogle Chrome内で達成されました。Spook.js攻撃を可能にしているのは、原則的に、Chrome独自の複数機能です。Microsoft EdgeなどのChromiumベースのブラウザーも、この攻撃に対して脆弱です。

しかし、攻撃の成立には一定の制約があります。第1に、データ窃取の速度が遅い(CPUによるが、400〜600バイト/秒)こと。ファイル傍受のデモで標的ファイルのサイズが非常に小さいのはそのためです。第2に、キャッシュメモリからデータを盗む際に大量のエラーが生じること。データの最大4%にエラーがあり、盗んだ画像にアーチファクトが生じています。

AMDプロセッサまたはMozilla Firefoxの場合、JavaScriptエンジンの機能のしかたが異なるため、Spook.js攻撃は機能しません。調査チームはAMDプロセッサおよびFirefoxで攻撃が成功する可能性を排除していませんが、検証にはさらなる研究が必要となることでしょう。

最後に、攻撃の際には、TumblrやGoogle Cloud Storageに対する攻撃のときのように、同じドメイン名のページに悪意あるコードをアップロードする必要があります。この方法を、例えば銀行のWebサイトに応用しても、おそらく機能しません。

慌てる必要はない

Spook.jsの研究は、脆弱性Spectreの一つを悪用するかなり現実的なシナリオを初めて示すことができたという点で重要です。とはいえ、現実的な攻撃の可能性は高くありません。第1の理由は、この調査にはGoogle Chrome開発者たちが関わっており、彼らは読み込まれるWebサイトを一つ一つ切り離すメカニズムを強化してきていること。第2の理由は、サイバー犯罪者の視点から見た場合、実践には深い知識が求められること。Spook.js攻撃には現代のCPUの低レベルでの機能について本格的な知識が必要ですが、ユーザーデータを盗む方法としては、マルウェアを使う昔ながらの方法からソーシャルエンジニアリングに至るまで、もっと簡単な方法が多数あります。

科学的研究としては、Spook.jsは、Webサイトのセキュリティに新たな推奨事項を提示することによって、ソフトウェアの状況を変えようとしています(例えば同調査チームは、認証ページを別のドメイン名へ移すことを提案しています)。後続の研究では、もう少し容易な攻撃方法が見つかるかもしれませんが、さらなるセキュリティの強化につながる可能性が高いでしょう。Spectreタイプの脆弱性が一斉に悪用されたとしても、他のマルウェアに対するものと同じ防御手段が有効であると考えられます。セキュリティ企業としては、新種の攻撃を監視対象リストに追加し、実行前にブロックされるようにするだけです。

また、いつの日か、現代のITエコシステム全体の大きな改変を余儀なくさせるようなSpectreタイプの脆弱性に遭遇する可能性もあります。しかし、今のところその可能性は低いでしょう。理論上の脆弱性から初めての実践的な攻撃へ移行するのに3年かかっている(しかも、攻撃を成立させるためには多くの制約がある)ことは、忘れずにいようではありませんか。

攻撃作戦のコストよりも盗みだすデータの価値が上回る可能性のある標的型攻撃では、Spectreが使用されるかもしれません。そのようなシナリオが当てはまりそうな組織の場合でも、コンテンツごとに別々のブラウザーを使用することで、攻撃の成立を難しくすることが可能です。例えば、機密情報を扱うWebサービスを、オンラインエンタメを見るのと同じブラウザーで開かないようにするなどです。機密情報は、仮想マシン内または別のデバイス上など、切り離された環境で扱うのが理想的です。

ヒント

ホームセキュリティのセキュリティ

最近では様々な企業が、主にカメラなどのスマートなテクノロジーを活用したホームセキュリティサービスを提供しています。しかし、セキュリティシステムは侵入者からの攻撃に対してどの程度セキュアなのでしょうか?