サイト内の現在位置

Objectionを用いたモバイルアプリの動的解析

NECセキュリティブログ

2025年1月17日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの川西です。

業務でモバイルアプリ診断を担当していることもあり、アプリに対する攻撃手法などを学びながら実際の診断に備えています。今回はモバイルアプリ動的解析ツールである「Objection」new window[1]についてご紹介します。経験が無い方にも扱いやすいツールだと思うので、モバイルアプリの動的解析に手を伸ばすきっかけになると幸いです。

  • 注意:
    本ブログの情報を用いた活動は、必ず自らの責任によって行ってください。本ブログの内容を使用したことによって発生する不利益等について、筆者および関係者はいかなる責任も負いません。

目次

Objectionとは

「Objection」は「Frida」new window[2]を用いた動的解析をよりシンプルに行うことが出来るツールキットです。iOS、Androidに対応しています。root化検知のバイパスや、 boolean型の戻り値を書き換えることも可能です。

使用環境

以下の環境を使用しました。

  • ホストマシン
    • Windows11 64bit
  • 仮想化環境
    • Hyper-V
  • ゲストOS
    • Ubuntu 22.04
  • エミュレータ
    • Android Studio Koala | 2024.1.1
    • Android Studio Emulator(Pixel_3a API29 Android10.0 x86_64)
  • ソフトウェア
    • Frida Server 16.5.9
    • Objection 1.11.0
    • AndroGoat
(図1) 環境の全体イメージ

AndroGoatの準備

今回はエミュレータを立ち上げたところからスタートします。
まずは「AndroGoat」new window[3]をインストールしましょう。「AndroGoat」はモバイルアプリ診断の学習のため意図的に脆弱性を含んだ、いわゆるやられアプリです。このアプリはAPKと一緒にソースコードも展開されています。ソースコードを見ながら動的解析を行うことができるため、初めてモバイルアプリ診断を学ぶにはとても使いやすいアプリとなっています。

エミュレータを用意したゲストOSに「AndroGoat.apk」new window[3]をダウンロードします。ダウンロードしたらadbコマンドでエミュレータにインストールします。

> adb install ./Downloads/AndroGoat.apk

図2のようにエミュレータ上で「AndroGoat」のアイコンが表示されていることを確認します。

(図2)「AndroGoat」インストール直後

「AndroGoat」のアイコンを押し、図3のような画面が表示されればインストール完了です。

(図3)「AndroGoat」起動後

Frida-Serverの準備

次に「Frida-Server」を準備します。
「Frida」は動的解析を行うためのツールです。アプリで実行される関数をフックし、代わりにこちらで用意したコードを実行させることができるようになります。Androidのほかにも様々なOSで使用可能です。

「Frida」をAndroidで使用する場合、「Frida-Server」を対象のAndroid端末上で実行している必要があります。また、「Frida-Server」は使用している端末のアーキテクチャに対応したものを選ぶ必要があります。まずは以下のコマンドで今回使用しているAndroid端末のアーキテクチャを確認します。

> adb shell
> uname -a
Linux localhost 4.14.175-g6f3fc9538452 #1 SMP PREEMPT Wed Apr 8 17:38:09 UTC 2020 x86_64

x86-64ということが分かりました。それでは最新のFrida-Serverをダウンロードしてきます。今回は「frida-server-16.5.9-android-x86_64.xz」を使用します。

(図4)「Frida-Server」のダウンロード

ダウンロードが完了したら「Frida-Server」を解凍後、エミュレータに転送して実行します。
まず、以下のコマンドで解凍、転送します。

> xz -d frida-server-16.5.9-android-x86_64.xz
> adb push ./frida-server-16.5.9-android-x86_64 /data/local/tmp/

次に以下のコマンドで実行権限を付与、バックグラウンドで実行します。

> adb shell
> su
# chmod 755 /data/local/tmp/frida-server-16.5.9-android-x86_64
# /data/local/tmp/frida-server-16.5.9-android-x86_64  &

これでAndroid端末で「Frida-Server」を実行できました。

Objectionの準備

本来、「Frida」は自分や他の人が作成したスクリプトを実行して動的解析を行うツールです。しかし「Objection」を使用すると、「Objection」内で用意されているコマンドを用いてより簡単に「Frida」を用いた動的解析を行なえるようになります。

「Objection」のインストールはとても簡単です。以下のコマンドを実行します。

> pip3 install objection

これでインストールは完了しました。

「Objection」を実行してみましょう。実行にはアプリのパッケージ名が必要です。以下のようにAndroid端末側で確認します。

> adb shell
> su
# pm list packages | grep -i owasp
package:owasp.sat.agoat

パッケージの名前が取得できたので以下のコマンドで「Objection」を実行します。

> objection -g owasp.sat.agoat explore

実行すると図5のようにエミュレータでは「AndroGoat」が立ち上がり、ターミナル上では「Objection」のインターフェースが立ち上がります。

(図5)「Objection」起動後

これで「Objection」を使用する準備が整いました。

Objectionを使ってみるその1:root化検知バイパス

それでは「Objection」を使ってみます。
まずはroot化検知のバイパスを行います。root化されている端末でアプリが実行できると攻撃者はより多くの攻撃を試行できます。そのため、root化されている端末ではそもそもアプリを起動させない、といった対策が取られることがあります。そのような対策が取られた場合でも、root化の検知をバイパスできる場合があります。「AndroGoat」で試してみましょう。

「AndroGoat」でRootDetectionボタンを押します。するとRoot Detectionの画面に遷移してCHECK ROOTボタンが出てきます。CHECK ROOTボタンを押してみると、図6のようにDevice is rootedとメッセージが下部に出てきます。

(図6)Root Detectionの正常時の動作確認

root化されているかチェックする機能であることが確認できたので、バイパスしてみます。「Objection」で以下のコマンドを入力し、改めてCHECK ROOTボタンを押してみましょう。

> Android root disable

すると図7のようにAndroid端末に表示されるメッセージがDevice is not rootedに変わりました。「Objection」の出力も確認すると、root化を検知するために実行されたいくつかの関数に対して、すべてfalseの値を返していることが確認できます。

(図7)Root Detectionのバイパス後の動作確認

Objectionを使ってみるその2:戻り値の改ざん

先ほどはroot化を検知するためのいくつかの関数に対して「Objection」が自動でfalseを返しましたが、特定の関数に対して改ざんした戻り値を渡すこともできます。注意する点として、「Objection」ではboolean型、つまりTrueとFalseしか返せません。特定の文字列等を返したい場合は「Objection」ではなく、「Frida」のスクリプトを用意、実行する必要があります。

今回は「AndroGoat」のUnprotected Android Componentsを使用して戻り値の改ざんを試してみます。Unprotected Android Componentsのボタンを押すと、画面にPINの入力部分とVERIFY PINボタンが見えます。試しに適当な値を入力してボタンを押してみます。すると図8のようにIncorrect PIN enteredとメッセージが出てきました。

(図8)Unprotected Android Componentsの正常時の動作確認

それではPINの確認を行っている関数をバイパスできるかやってみましょう。冒頭でお伝えした通り「AndroGoat」はソースコードnew window[4]が公開されています。ソースコードを見ながら今回のPINの確認を行っている関数を特定します。ソースコードを確認していくとどうやら以下の関数new window[5]がPINの正誤を判断して応答するもののようです。

  • ファイル名:AccessControlIssue1Activity.kt
  • 関数名:fun isPinCorrect(pinValue: String):BooleanD

戻り値の使われ方を確認するとそのままif文の条件に使用されています。なのでisPinCorrectの戻り値をTrueにしてやればそのあとの処理が進んでいきそうです。

「Objection」からも関数を確認します。
以下のコマンドを実行します。

> android hooking list class_methods owasp.sat.agoat.AccessControlIssue1Activity
 public final boolean owasp.sat.agoat.AccessControlIssue1Activity.isPinCorrect(java.lang.String)

既にある程度分かっていますが、「Objection」を用いてどのような引数と戻り値が扱われているかも確認しておきます。以下のコマンドを入力した後にVERIFY PINボタンを押します。

> android hooking watch class_method owasp.sat.agoat.AccessControlIssue1Activity.isPinCorrect --dump-args --dump-return

図9の「Objection」の出力を確認すると、入力した「hogehoge」が引数として渡され、noneが返されていることが分かります。

(図9)Unprotected Android Componentsのバイパス後の動作確認

それでは戻り値をTrueに書き換えてみましょう。以下のコマンドで、指定した関数の戻り値を常にTrueになるように設定できます。

> android hooking set return_value owasp.sat.agoat.AccessControlIssue1Activity.isPinCorrect true

適当な値を入れてVerify PINボタンを押してみるとPINの検証をバイパスでき、図10のように請求書がダウンロードできるようになります。「Objection」の出力を確認すると戻り値がtrueに設定されていることが確認できます。

(図10)Unprotected Android Componentsのバイパス後の動作確認

まとめ

本記事ではモバイルアプリの動的解析ツールである「Objection」を紹介しました。「Objection」を使用することでより簡単に「Frida」を用いた動的解析を行うことができるようになります。
UIは色付けされており、コマンドの候補も表示されるので、初めてモバイルアプリの動的解析を行う方でも扱いやすいのではないでしょうか。
他にも「AndroGoat」にはSSL Pinningの無効化など、「Objection」を用いて突破できるものがあるので是非お試しください。

参考文献

執筆者プロフィール

川西 康仁(かわにし やすひと)
セキュリティ技術センター リスクハンティング・システムチーム

主にペネトレーションテスト、脆弱性診断、セキュリティ人材育成に従事し、NECグループのセキュア開発・運用を推進。
CEH、GIAC(GPEN)を保持、堅牢化コンテスト「Hardening 2024 Convolutions」にてLAC賞。

執筆者の他の記事を読む

アクセスランキング