Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

トレーニングコンテンツ:脆弱なAndroidアプリ「InsecureBankv2」の紹介 ~動的解析~

NECセキュリティブログ

2021年6月25日

NECサイバーセキュリティ戦略本部セキュリティ技術センターの中島健児です。本記事では、前回の記事[1]で紹介したAndroidアプリのセキュリティの基礎について学ぶことができる学習用アプリ「InsecureBankv2」new window[2]の続きとして簡単な動的解析をご紹介します。

  • Google Playストアで配布されているアプリを制作者や配布者の許可なくリバースエンジニアリングしないでください。本ブログに記載の内容を悪用した行為などは絶対におやめください。

InsecureBankv2についての簡単な説明や動的解析は前回のこちらのブログ[1]をご覧ください。今回はInsecureBankv2を題材として動的解析が学べるということを紹介します。まず、Root化済みのAndroid上でInsecureBankv2を実行してアプリのRoot化検知機能の動作を確認します。続いてFridaを使用してRoot化チェック部分をフックして検知機能をバイパスします。

使用したツール、ガイドライン

InsecureBankv2の解析に使用したツールを列挙します。各種ツールのライセンスやURLは本記事最後の参考欄に記載しています。

[使用したツール]
Android Virtual Device Manager(Android Studio付属)new window[3]:エミュレータとして使用

QARKnew window[4](バージョン4.0.0):Androidアプリ(.apk)を複数のデコンパイラを使ってデコンパイルするために使用

Android Debug Bridge(adb)new window[5](バージョン1.0.41):Android OSのコマンドラインツール。アプリのインストールやデバッグ、ファイルの転送等で使用

FRIDAnew window[6](バージョン14.2.18):Androidアプリの動的解析にて関数をフックするために使用

[参考にしたガイドライン]
一般社団法人 日本スマートフォンセキュリティ協会
Androidアプリのセキュア設計・セキュアコーディングガイドPDF[7]
PDFhttps://www.jssec.org/dl/android_securecoding.pdf

OWASP
Mobile Security Testing Guidenew window[8]
new windowhttps://github.com/OWASP/owasp-mstg/blob/master/Document/0x05j-Testing-Resiliency-Against-Reverse-Engineering.md

今回も前回同様InsecureBankv2はエミュレータ上のAndroid 5.1にインストールして動かしています。また、解析に当たって、” Androidアプリのセキュア設計・セキュアコーディングガイド”や” Mobile Security Testing Guide”を解析時の注目点や実装時の対策の参考としています。InsecureBankv2のセットアップについては、前回の記事をご覧ください。前回の記事の「InsecureBankv2のセットアップ」という項目が終了した時点から開始します。

Androidアプリ”InsecureBankv2”の解析

InsecureBankv2アプリの解析を行ってみます。Androidアプリ解析には大きく分けて静的解析と動的解析があります。前回は、静的解析をメインに紹介しました。今回は簡単な動的解析をしたいと思います。GitプロジェクトのREADME.markdownファイルに書かれている本アプリが持つ脆弱性のうち、以下の丸印◎を付けた項目” Root Detection and Bypass”のバイパスの確認を行います。カッコ付き星印(★)は前回静的解析で見た項目です。

Flawed Broadcast Receivers
Intent Sniffing and Injection
Weak Authorization mechanism
Local Encryption issues (★4)
Vulnerable Activity Components
Root Detection and Bypass ◎(★5)
Emulator Detection and Bypass
Insecure Content Provider access
Insecure Webview implementation
Weak Cryptography implementation (★4)
Application Patching
Sensitive Information in Memory
Insecure Logging mechanism (★1)
Android Pasteboard vulnerability
Application Debuggable
Android keyboard cache issues
Android Backup vulnerability (★2, 3)
Runtime Manipulation
Insecure SDCard storage
Insecure HTTP connections
Parameter Manipulation
Hardcoded secrets (★4)
Username Enumeration issue
Developer Backdoors (★6)
Weak change password implementation

Root化検知機能実装の確認とバイパス

アプリのトップ画面からログイン後にRoot化のチェックをしていることを前回の静的解析で確認しました。

ソースコード上ではRoot化のチェックをどこでどのように行っているのかを前回のブログで確認していますが、改めてもう一度簡単に確認します。デコンパイルして生成されたファイルにPostLogin.javaというファイルがあり、Root化の有無を検証する実装がありました。
" <pathtoqarkdecompile> /build/qark/procyon/com/android/insecurebankv2/PostLogin.java"

doseSUexist()メソッド

doesSuperuserApkExist()メソッド

showRootStatus()メソッド

doesSuperuserApkExist()で/system/app/Superuser.apkの存在有無をチェックしています。doesSUexist()では、"/system/xbin/which", "su"を実行してsuの存在有無をチェックしています。この2つのメソッドによるチェックでどちらか一方がtrueで返ってくるとこの端末はRoot化していると認識するようになっています。しかし、私が今回使用したAndroidイメージには/system/app/Superuser.apkや/system/xbin/which、suコマンドが存在しませんでした。そのため本アプリにRoot化を検知してもらうためにダミーのwhichとsuコマンドを作成してAndroid上に転送して配置しています。

次にInsecureBankv2付属のWalkthrough(Bypass Android Root Detection.docx)new window[9]で紹介されているRoot検知のバイパス手法を紹介します。まず、Apktoolnew window[10]を使用してAPKファイルからsmali形式のファイルに変換を行い、smali形式のファイルのRoot化判別部分を書き換えています。その後リビルドして再度インストールして実行しています。この方法には次のような課題があります。

  1. 少し修正を加えると原因不明でアプリが落ちることが多く、smali形式(Dalvik opcodes)に関するドキュメントが少なく原因の特定が困難であること。
  2. アプリが落ちるたびにコード書き換え→リビルド→インストールの手順を何度も繰り返すことになり効率が悪いこと。

そのため本記事では、Walkthroughに記載されている手法ではなく、Fridaを使用してRoot化検証を実施している部分をフックしてRoot化検知をバイパスできるか見ていきます。

まず、Fridaを使うための事前準備を行います。Fridaのツール一式をpipコマンド等でインストールします。続いてAndroid上で実行するfrida-serverをgithubから入手します。以下は入手手順の一例です。

ホストPC上で使用するFridaのインストール
$ sudo pip3 install frida
$ sudo pip3 install frida-tools

次に、Androidに転送するfrida-serverを入手します。今回のエミュレータはx86版のAndroidイメージを使用するため、x86版frida-serverを入手していますが、ARM版の Androidを使用する場合は適宜変更が必要です。
$ wget https://github.com/frida/frida/releases/download/14.2.18/frida-server-14.2.18-android-x86.xz
$ xz -d frida-server-14.2.18-android-x86.xz
$ mv frida-server-14.2.18-android-x86 frida-server

Fridaのツール一式を入手したら、frida-serverをAndroidに転送して実行します。以下は実行手順の一例です。
$ adb push frida-server /data/local/tmp/
$ adb shell "chmod 755 /data/local/tmp/frida-server"
$ adb shell "/data/local/tmp/frida-server &"

上述のように、静的解析の段階でdoesSuperuserApkExist()、 doesSUexist()の2つのメソッドの返り値によりRoot化の判別を行っていることが分かりました。今回は、この2つのメソッドに対してFridaでフックして返り値を変更するという方針でRoot化検知のバイパスを行います。Fridaではフックで使う言語をいくつか選択できます。今回はJavaScriptで書きます。以下のようなコードを書きました。

2行目: Fridaでフックするメソッドが定義されているクラスを指定します。前回の静的解析でPostLoginとわかっています。
4~7行目:doesSuperuserApkExist()メソッドのフックを記述しています。このフックでは、デバッグ用にメッセージの出力と、返り値を固定でtrueとしています。
9~12行目:4~7行目と同様です。ここではdoesSUexist()メソッドを指定しています。

このコードを rootCheck_Hook.jsというファイル名で保存しました。それではいよいよ上記フック用コードを使用してInsecureBankv2のRoot化検知をバイパスできるか試してみます。まず、ホストPC上でfrida-ps -U等を実行してAndrod上のfrida-serverが立ち上がっており通信できることを確認しておきます。続いて上記JavaScriptファイルを指定してフックを行います。
$ frida -U -l rootCheck_Hook.js -f 'com.android.insecurebankv2' --no-pause

-f の後にはフックするターゲットのアプリ名を入れます。
上記コマンド実行後、アプリが再起動します。JavaScriptコードがアプリにインジェクトされて関数が差し変わったはずです。続いて、アプリを操作してトップページにてIDとパスワードを入れてログインします。すると以下の画像のように”Device not Rooted!!”となっておりアプリの動作を変更できていることがわかります。

以下の画像は、ホストPC上でコマンドを実行している際の様子です。ログイン時にフック用コードが実行されてデバックメッセージが表示されました。

以上のようにInsecureBankv2が持つRoot化検知機能をFrida等でフックしてバイパスすることができました。解説書で示されている、smaliを修正してリビルド&再インストールする手法に比べると容易にアプリの動作を変更できました。

今回紹介したInsecureBankv2アプリのRoot化検知では、ソースコードが難読化されていなかったため、Root化の検知手法を容易に読み取ることができました。また、単純な検知機能を1つしか実装していないため、容易にバイパスできました。実際には複数の検知機能を組み合わせて実装することが必要です。例えばRoot化されたデバイスに存在することが多いファイルやプロセスのチェック、suコマンド実行の試行、 SafetyNet APIの使用等です。Root化検出については以下のページに情報がまとまっています。

まとめ

本記事では、InsecureBankv2という脆弱性を盛り込んだ学習用のAndroidアプリを、前回に引き続き紹介しました。本アプリ付属のWalkthroughの解説とは異なる解析手法の一例として、Frida を使用したアプローチによる動的解析を紹介しました。Fridaを使用することで従来の方法よりも効率的に動的解析を行えます。本アプリは、前回紹介した静的解析だけでなく、動的解析についても自分で手を動かしながら解析手法を学べます。静的解析に加えて動的解析を比較的簡単に体験できるので、Androidアプリの解析が初めてでも楽しんで学習できるのではないでしょうか。本アプリを練習台として様々な解析用のツールを試すこともできるでしょう。また、InsecureBankv2アプリで一通りの解析手法を学ぶことで、ガイドラインに記載してある対策がなぜ必要で有効なのかをより理解できるのではないかと思います。

参考

[関連ツール]

執筆者プロフィール

中島 健児(なかしま けんじ)
セキュリティ技術センター リスクハンティングチーム

リスクハンティングチームにて、NECがお客様へ納品するシステム・製品へのリスクアセスメント/脆弱性検査/ペネトレーションテストを通じて、安全・安心なシステム構築を支援する業務に従事
CISSP Associate、情報処理安全確保支援士(RISS) 保持

執筆者の他の記事を読む

Escキーで閉じる 閉じる