脆弱性の特定には、深い専門知識と根気強い調査・検証が必要
CyRCのロンドンチームは、脆弱性の原因を特定するための調査を行った。最初に取り組んだのは、Android OSのUSBデバッグモードをONにして、デバッガーを使ってシステムのなかで何が起きているのかをトレースすることである。
調査の結果、REE内のFingerprint LibraryがAndroid OSのAPI Frameworkをサポートしており、多くの機能を有していることがわかった。TEE内のQSEEは、libQSEEComAPIを用いて指紋データをやりとりするバッファを用意している。そして、libgf_ud_halライブラリはバッファに指紋データを格納し、Fingerprint Trustletがこれを解釈。このとき、バッファ内の最初の数バイトのコードを条件として、TEEのなかにあるTrustletで起動する機能が決定される。
前提として、REE内で動作するアプリケーションが指紋認証を行うためには、TEE内のTrustletと通信しなければならない。そして、Trustletにはデバッグ・コールが用意されているのが一般的だ。そうでなければ、開発者はソフトウェアの正常動作を検証できない。
製品版のTrustletでは、悪用を防ぐためAPIエンドポイントにアクセスできないようにしておく。例えば、条件コンパイル機能である#ifdefなどを用いて、デバッグコードと製品版のコードを切り替えるようなパターンが考えられる。
「CyRCのロンドンチームは、REE内の指紋認証サブシステムに含まれるlibgf_ud_hal.soという共有オブジェクトに、何か意図せぬコードが残っている可能性があると推測して検証をしていきました。気が遠くなるような時間をかけてリバースエンジニアリングを行い、擬似コードの生成に成功したのです」
擬似コードによって、以下の情報が得られた。とりわけ、Target IDとCommand IDの情報が判明したことは、検証を進めるうえで大きな成果だったという。
- 指紋センサーから画像を受け取るバッファ(raw_data_out)を受け入れ
- 出力イメージ(GF_SZ_TEST_RAWDATA構造のサイズ)に対応するため、少なくとも86024バイトのサイズである必要がある
- 引数「ae_expo_start_time」も渡される
- Target ID(target)は1003をセット
- Command ID(cmd_id)は17をセット
※上記はOnePlus向けの指紋センサーSDKの仕様によるものであり、他のモデルやベンダーでは仕様が異なる可能性がある
これらの情報をもとに、CyRCのロンドンチームは緻密な調査を続けていく。最終的には、Target IDが1003、Command IDが17という条件で指紋認証のTrustletにある関数を呼び出すことで、REE側で指紋の画像を取得可能であることを特定できた。脆弱性をつぶすことに成功したのだ。
脆弱性の特定には、深い専門知識と根気強い調査・検証が必要である。この事例は、高難度のタスクを達成したCyRCの技術力が伺えると同時に、サイバーインシデントについて理解して対策を行うことの重要性を私たちに教えてくれた。
セキュアで高品質なソフトウェア開発のためのオンラインセミナー・シリーズ
シノプシスは、セキュアで高品質なソフトウェア開発のためのさまざまなテーマを扱うオンラインセミナーを随時開催しております。すべてのコンテンツはご参加無料、Live開催後は、録画版と講演資料の公開もしているのでいつでも繰り返しご覧いただけます。
今後Live開催予定の主なテーマ (Live後は同URLで録画版として公開)
- ソースコードの品質とセキュリティを効率的に向上させる静的解析
- オンデマンドのリモート・テスト・サービスを活用したクラウド・モバイルアプリの戦略的なセキュリティ・テスト
- ソフトウェアに含まれるOSSのライセンスと脆弱性の管理
- IAST: 次世代のWebアプリケーション・セキュリティ・テスト手法
他にもさまざまな業種・内容のコンテンツを掲載しています。
シノプシスのオンライン・セミナー・ポータルはこちら。