もっと詳しく

カナダ・トロント大学のセキュリティ研究所「Citizen Lab」は、バーレーンの活動家9人に対して使用された高度なiPhone向けエクスプロイト(脆弱性攻撃ツール)の詳細についてレポートを発表しました。このレポートでは、これらの活動家がハッキングされた際に、イスラエル企業「NSO Group」が開発したスパイウェア「Pegasus」を用いてゼロクリックで実行可能な2つのiMessage用エクスプロイトが悪用されていたことが報告されています。今回の攻撃活動で悪用されたエクスプロイトは、2020年に確認された「Kismet」および2021年に確認された「ForcedEntry」です。ゼロクリック攻撃は、一般的なマルウェアとは異なり、デバイスに感染するためにユーザの操作を必要としないことから、高度な脅威に位置づけられています。特に後者のForcedEntryエクスプロイトは、このようなゼロクリック攻撃の侵入活動からユーザを保護するためにAppleが設計したBlastDoorなどのセキュリティ保護機能を回避できるため、注目に値します。

Citizen Labのレポートによると、Kismetエクスプロイトは2020年7月から9月にかけて悪用され、少なくともiOS 13.5.1または13.7を搭載したデバイスに対して使用されたとしています。同年9月に実施されたiOS 14のアップデート以降、Kismetエクスプロイトは機能しなくなったようです。その後2021年2月、NSO GroupはBlastDoor機能の回避に成功した新たなゼロクリックエクスプロイトの展開を開始しました。Citizen Labはこれを「ForcedEntry」と呼称しています。デジタル人権擁護団体およびセキュリティ研究者の世界的な集合体であるAmnesty Techも、同時期にiMessage用ゼロクリックエクスプロイトの活動を観測し、「Megalodon」と呼称しています。

エクスプロイト「ForcedEntry」が引き起こすクラッシュの考察

Citizen Labのレポートで示されている攻撃のポイントは大きく分けて2つです。1つはスパイウェア「Pegasus」、1つはiOSに効果のあるゼロクリックエクスプロイト、特に新たに保護機能を回避可能なエクスプロイトである「ForcedEntry」の存在です。本記事ではForcedEntryについて考察します。

Citizen Labのレポートでは、標的デバイスに対してForcedEntryエクスプロイトが起動されたとき、デバイスログには2種類のクラッシュが記録されていると報告されています。一つ目のクラッシュは、Adobe PhotoshopのPSDデータをレンダリングするためにImageIOの機能を呼び出している間に発生したようです。

トレンドマイクロは、Citizen Labが図1のとおり紹介している二つ目のクラッシュに注目しました。このクラッシュは、PDFファイル内のJBIG2形式にエンコードされたデータをデコードするために、Appleのベクトル描画フレームワークであるCoreGraphics機能を呼び出しているときに発生しています。なお、今回の解析内容はCitizen Labのサンプルに基づいています。

図1:iOS 14.6のiPhone 12 Pro Max上で発生したForcedEntryの
シンボリック化した二つ目のクラッシュ(画像出所:Citizen Lab)
トレンドマイクロでは特に赤い強調表示箇所を調査

このクラッシュログから、3つの興味深い点を推測することができます。

  1. ゼロクリック攻撃は、iMessageを介して受信したファイルの構文解析に依存している。
  2. dyld_shared_cacheのスライドは0である。これはすべてのシステムモジュールが固定のアドレスに読み込まれることを意味する。
  3. クラッシュポイントである0x181d6e228(図1赤枠3)は、脆弱性が悪用される最初の場所ではない。

これらの結論の詳細については、以下の節で説明します。

ForcedEntryが悪用する脆弱性「CVE-2021-30860」の根本原因

ForcedEntryは、Appleのベクトル描画フレームワークであるCoreGraphicsの脆弱性「CVE-2021-30860」を悪用します。この脆弱性は、CoreGraphics.frameworkの関数JBIG2Stream::readTextRegionSeg内部に存在します。クラッシュポイントである0x181d6e228(図1赤枠3)は、図2の関数JBIG2Stream::readTextRegionSegの161行目にあります。

図2:クラッシュポイントを示す関数「JBIG2Stream::readTextRegionSeg」のスクリーンショット

まずこの関数は、JBIG2SymbolDictセグメントにしたがってnumSymsを計算します。

numSymsのデータ型はunsigned int(符号なし整数型)であり、関数seg->getSize()の戻り値の型もunsigned intです。このため、numSymsは整数オーバーフローによって1つのJBIG2Segmentのサイズよりも小さくなる可能性があります。一例を挙げると、

numSyms = 1 = (0x80000000+0x80000001) < 0x80000000

となります。その後、ヒープベースのバッファsymsをサイズnumSyms * 8で割り当てます。

最後にこの関数は、symsにBitmapの値を入力します。

このループ処理時間は、JBIG2Segmentのサイズに依存しており、バッファSymsのサイズよりも大きくなる可能性があります。これにより、ヒープベースのバッファsymsに対して境界外書き込み(アクセス)が発生します。

Appleが開発したパッチによる修正点

Appleは、iOS 14.8でこの関数に修正プログラム(パッチ)を適用しました。

図3:Appleにより修正が加えられた同じ関数JBIG2Stream::readTextRegionSegのスクリーンショット

Appleは、symsバッファのオーバーフローを回避するために2つの新たな境界チェック(図3赤枠)を追加していることが見て取れます。

スパイウェア「Pegasus」事例における脆弱性攻撃の注目すべき手口

Pegasusを使用した攻撃の事例においては、注目すべき脆弱性利用の手口が確認されています。

アドレス空間配置のランダム化(ASLR)の無効化

バージョンiOS 14.6(18F72)のdyld_shared_cacheを逆アセンブラ「IDA Pro」に読み込ませて静的解析を行ったところ、驚くべき結果が得られました。弊社は、セグメントをリベースすることなくコールスタック上のアドレスに直接アクセスすることができました。図1(赤枠2)から推測されるように、dyld_shared_cacheのスライドは0です。しかし、一般的なクラッシュシナリオでは、これらのアドレスはスライド内に存在する必要があります

これらの事実からは注目すべき結論が導き出されます。元のクラッシュログのスクリーンショットが修正されていないとすると、この攻撃ではForcedEntryを悪用する前に既にASLRが無効化されていたことになるのです。

ポインタ認証コード(PAC)のバイパス

呼び出しスタックトレースのframe 1からアドレス0x181d6e20cを検査することで、関数JBIG2Stream::findSegmentの戻り値であるレジスタx0がJBIG2Segmentのサブクラスであることがわかります。

仮想関数getType()をオーバーライドするサブクラスは4種類ありますが、以下のコードは、それらのサブクラスが列挙された値の1つを返すだけであることを示しています。

たとえば、JBIG2SymbolDict::getTypejbig2SegSymbolDict=1を返すだけです。

そのため、frame 1は仮想関数seg->getType()を呼び出す必要があります。しかし実際には、すでに現在の関数そのものframe 0に変更されていました。

これは、オブジェクトJBIG2Segmentの仮想関数テーブルがすでに置き換えられており、ポインタ認証コードのセキュリティ機能がバイパスされていることを示しています。ポインタ認証コードのセキュリティメカニズムはゼロクリック攻撃によるハッキングを防ぐために開発されたものであるため、これがバイパスされることは重大な問題と言えます。そして、これはクラッシュポイントが脆弱性悪用の最初の場所ではない(これより前に、他に脆弱性が悪用された場所がある)ことを示しています。

結論

ForcedEntryに関する重要な点は、ポインタ認証コードのバイパスを可能にする方法およびアドレス空間配置のランダム化を無効化する方法がいまだに明らかとなっていないことです。使用された攻撃技術の観点から、このPegasusスパイウェアを利用した攻撃事例は、iOSユーザにとって非常に高度な脅威であったことがわかります。しかしながら、これらの攻撃は標的型攻撃、つまり一般ユーザではなくごく限られた特定の人物に対して行われたものであるようです。上述のポイントが判明しない限り、広範囲の攻撃が発生する可能性は高くないものと考えられます。

基本的にこの攻撃は、ごく一般的なファイル形式の構文解析における脆弱性を悪用しています。弊社は以前、ForcedEntryと類似した、CoreGraphicsの脆弱性「CVE-2020-9883」を発見しました。この脆弱性も、今回Pegasusスパイウェアが行ったことと同様の攻撃を実行するために悪用される可能性があります。

今回確認されたPegasusスパイウェアを用いた攻撃活動の情報は、Citizen LabおよびAmnesty Techのフォレンジック分析によるものです。この攻撃で使用されたPegasusスパイウェアのサンプルは一般には未確認ですが、トレンドマイクロではこれらの脅威を積極的に探索・監視しており、調査が進めば今後もより詳細な情報を共有していきます。

被害に遭わないためには

iPhoneユーザは、お使いのデバイスをiOS 14.8以降のものにアップデートすることが強く推奨されます。今回の攻撃手口の詳細が判明するまで、一般のiOSユーザが直ちにこのエクスプロイトを用いた攻撃の標的となる可能性は低いと思われます。つまりこの猶予期間のうちにアップデートを完了させることでForcedEntryエクスプロイトの危険を0にすることができます。

また、OSアップデートと共に、今すぐに実施できる簡単なセキュリティ対策もあります。例えば、Pegasusスパイウェアを懸念されるユーザは、不審な送信元からのiMessageをブロックしたり、より徹底した対策として、デバイスの環境設定でiMessage機能を完全に無効にしたりすることができます。

参考記事:

記事構成:岡本 勝之(セキュリティエバンジェリスト)

高橋 哲朗(スレットマーケティンググループ)

翻訳:益見 和宏(Core Technology Marketing, Trend Micro™ Research)

The post スパイウェア「Pegasus」の攻撃で悪用されたiPhoneのゼロクリックエクスプロイト「ForcedEntry」を解説 first appeared on トレンドマイクロ セキュリティブログ.