スマートホンへの「ゼロクリック」攻撃と、その対策について

昨年、私たちは Google の Project Zero チーム (ゼロデイ脆弱性の発見を任務とする Google のセキュリティアナリストのチーム) が公開した会議論文について記事を書きました。論文のタイトルは『Look, No Hands! — The Remote, Interaction-less Attack Surface of the iPhone (ユーザーが操作しなくてもリモートから攻撃を受ける脆弱性が iPhone に存在』というものです。

そのプロジェクトに関わっていた研究者の 1 人が、Project Zero ブログで興味深いフォローアップ記事を公開しました。

記事の題名は『Fuzzing ImageIO (ImageIO をファジング)』という、少し難解で、PR 向けではない専門用語で書かれています。

しかし、アプリの誤動作について敏感なサイバーセキュリティ研究者にとっては、この 2 語は非常に注意を引くものです。

ファジングはバグを洗い出すための技術で、60% は科学、30% は芸術、25% は錬金術、そして大部分が粘り強さから出来ているものとも言えます。

ファジングの最も単純な方式では、適切に構築されたインプットファイルを作成し、それらを意図的かつシステマティックな方法で数千、数百万、さらには数十億回変換してから、ソフトウェアがそれらを適切に処理できるか確認します。

考え方としては、少数ながら典型的なテストファイルのサンプルを手作業で作成し、コードのエラーチェック機能を注意深く確認することと同じですが、

ファジングの場合は、適切に構成されているかはさておき、大量で広範囲なテストファイルを作成し、それらのうち何かが意図しない動作や危険な動作を引き起こさないか確認することになります。

そして ImageIO は、その名前が示すように、Apple が画像の処理を伴うアプリを作成について利用を推奨しているビルトインのプログラミングライブラリです。

(引用文日本語訳) Image I/Oは、イメージデータへのアクセスに対して最も信頼できる手段を提供します。非常に効率的であり、メタデータへの簡単なアクセスやカラーマネージメントが可能です。(中略) 現在、イメージインポータまたは他の画像処理ライブラリを使用している開発者は、Image I/O の利用方法についてこちらのドキュメントを参照してください。

言い換えれば、手間をかけて新しいファイル形式ごとに 1 個ずつコードを書いて、数十もの異なる画像フォーマットのサポートをアプリに追加する代わりに、ImageIO の機能を利用して、OS にファイル形式の判別、サポートの有無、そして読み込みまで任せることができます。

JPEG、GIF、PNG、BMP、TIFF、または KTX など聞いたことのないファイル形式であっても、心配する必要も、気にする必要もありません。(KTX はグラフィックテクスチャファイルの一種です。)

ここでセキュリティ研究者の注意を引いているのは、下層コードに対してバグを引き起こすような欠陥のあるファイルを量的に洗い出すファジングと、iPhone のアプリが画像ファイルを処理する際にほとんど毎回利用されている核心的なコードである ImageIO が並置されていることです。

BMP ファイルのような洗練されていない画像ファイルは、読み込みや処理にしばしば問題が発生することで有名です。

たとえば、多くの BMP ファイルは画像のサイズと構成を示すヘッダーを持っています。

そして、ヘッダーはヘッダー自身のサイズを示す 4 バイトの値で始まりますが、もしそのサイズが誤っておりヘッダーが誤って読み込まれた場合はどうなるでしょうか。

多くの場合、24(RGB) や 32(RGBA) のような、ピクセルあたりのビット数を示す 2 バイトの値がありますが、もしピクセルあたり 32,000 ビットといった奇妙な値になっていた場合はどうなるでしょうか。

画像の横幅と高さを示す 4 バイトの値が 2 個ありますが、この値がマイナスになっている場合や、ファイルの内容と一致しない場合はどうなるでしょうか。

プログラマーはこれらの異常をチェックしてアプリのフリーズやクラッシュを防止する必要がありますが、すべての不一致や破損を確実にチェックするにはどうすればよいでしょうか。

Google のStefan Groß 氏は、記事の中で ImageIO がサポートする画像ファイル形式をリスト化した方法と、ImageIO ライブラリのコードを「ファジング」する方法について説明しています。

Groß 氏は、サポートされている画像ファイル形式について、「シード画像」と呼ぶ 700 種類の代表的なファイルから始めました。

次に、ファザー(ファジングツール)を数週間実行し、ファザーによるインプットが ImageIOのコードに何らかの問題を引き起こすか確認しました。

ファジングの結果

ファジングの結果、Groß 氏はメモリへの不正なアクセスを引き起こす 6 件のバグを発見し、それらのバグにより「想定されていない場所の読み取り」と、「許可されていない場所への書き込み」のエラーを発生させることができました。

領域外のメモリ参照 (Out-of-bounds memory reads) により、攻撃者はメモリ内のどこに何のシステムコンポーネントがあるかなど、本来は見ることができないはずのデータを取得できる可能性があります。

メモリのレイアウト情報は通常、OS によって意図的にランダム化されているため、仮に攻撃者がスマートホンをクラッシュさせる方法をすでに知っていても、クラッシュさせた後に起きることまで安定してコントロールすることはできません。

領域外のメモリ書き込みにより、攻撃者はプログラムが依存しているデータを変更するだけでなく、マルウェアを埋め込むためにコードを変更できるようになる可能性があります。

そして、ご推察の通りこれらのバグはすでに Apple によってすべて修正されました。

興味深いことに、それらのバグのうちの 1 件は OpenEXR ファイル (ハイダイナミックレンジイメージファイル) を処理する際の Apple のコードにあることが判明しています。

Groß 氏は OpenEXR ファイルについて Apple がオープンソースライブラリを利用していたことに着目し、十分に検査するため、その部分を別にファジングしていたとのことです。

それにより、CVE 識別子が割り当てられるほど深刻な、さらに 8 件のバグが判明しましたが、このライブラリがすぐにアップデートされすべてのバグが修正されました。

ゼロクリック攻撃

とりわけモバイルデバイスにおける画像処理のバグに関する厄介な問題は、最初に何もクリックしなくても自動的に画像が表示されるアプリが大量に存在することです。

Groß 氏が指摘するように、明白な例はメッセージングアプリです。メッセージは、少なくとも部分的に表示 (プレビューまたはサムネイル) しないと内容が分からないことがあります。

電車やバスの車内で、近くにいるまったくの他人から不快な画像が匿名で送られてくるブルージャッキングという攻撃と同じ皮肉がここに存在します。

当然、攻撃者は画像が喜ばれるものではないことは知っています。しかし同時に、見るか見ないかの判断はポッポアップ上の小さなサムネイルから行う必要があり、画像が見たいものか見たくないものかは、基本的に一度見てみないと分からないということも彼らは知っているのです。

いわゆるゼロクリック攻撃の場合、攻撃の対象になるのは私たちの目ではなく、画像を処理するコードです。そして、iPhone 上ではほとんどの場合 ImageIO がそれを行っています。

この場合、仮にユーザーが危険なメッセージと判断して開封することなく削除するようなメッセージでさえ、

コードによってあらかじめ画像が処理されることで、ユーザーが判断する機会もないままスマートホンをクラッシュさせてしまうことも可能になります。

対策

残念ながら、ユーザーとしてできることは限られています。一部のアプリにおいてわずかにリスクを軽減する方法としては、アプリの通知をオフにすることが挙げられます。ポップアップの表示のためにメッセージの処理を勝手に実行してしまう場合があるからです。

もちろん、もしあなたがアプリ開発者であれば、Groß 氏が行ったように自分の書いたコードをファジングすることによって貢献することができます。

ファジングは一般的に時間がかかるものの、プログラミングの仕事をしている間にバックグラウンドでプロセスを実行することができます。

アプリや OS の開発者が実施できるもう一つの解決策は、画像ファイル形式のサポート範囲を少し狭めるか、少なくとも知識のあるユーザーが必要のないファイル形式を無効にできるようにすることです。

Groß 氏は次のように述べています。

メッセンジャーについて推奨するのは、(少なくともクリックを必要としない画像プレビューに対して) 受信者の画像ファイルのサポート形式を制限し、攻撃のリスクを減らすことです。その場合、送信者はサポートされていない画像ファイル形式を受信者に送る前にリエンコードするでしょう。ImageIO の場合、こうすることで攻撃のリスクを 25 種類の画像ファイル形式から、たったの数種類まで減らすことができます。

プログラマーがしばしば感じることですが、「少ない」ことがより多くの利益をもたらすこともできるのです。