WeSeong ログイン
← 記事一覧に戻る
Android

Androidのセキュリティに関する知識、動的解析と静的解析、MultiDexの簡単なまとめ

Androidのセキュリティに関する知識、動的解析と静的解析、MultiDexの簡単なまとめ

Ⅰ. 概要

Androidのセキュリティに関する基本的な知識について説明します。まず、静的解析と動的解析について解説します。静的解析とは、アプリケーションが実行されていない状態でソースコードを分析し、脆弱性(欠陥)を発見する手法です。一方、動的解析は、アプリケーションが実行されている状態で、HookingやELF実行ファイルの構造を分析し、脆弱性を特定する手法です。モバイルアプリケーションの主なチェック項目としては、まず、OSの改ざん検出機能の有無、次に、プログラムの完全性の検証、次に、メモリ内の重要な情報の漏洩の有無、そして、デバイス内の重要な情報の保存の有無、最後に、画面の強制実行による認証手順の回避などが挙げられます。



Ⅱ. Androidのセキュリティに関する様々な知識

主な内容は 動的分析(省略) 定常解析(省略) MultiDex今後、この内容に基づいて詳細な解説を行う予定です。そのため、冒頭部分は、一連の流れとしてまとめることが難しい可能性があることをご了承ください。まず、iOSも同様ですが、Androidでは、悪意のあるアプリからデバイスを保護するために、アプリに 開発者の署名これは重要です。署名がないアプリは、インストールや実行ができないだけでなく、署名は唯一の識別子であるため、改ざんも困難です。 SMS詐欺(SMSを利用した個人情報の窃取および金銭詐取)同じ攻撃を仕掛ける場合、ウェブアドレスを基にしますが、攻撃側が実際に個人情報を取得しようとする際に、どのようなデバイスを使用しているのか、実際に使用されているデバイスなのかを確認するにはどうすればよいでしょうか。ウェブ開発の際に考慮すべき点ですが、オペレーティングシステムに… ユーザーエージェント「ユーザーエージェント」の値が利用できるため、相手のデバイスに関する情報を特定し、攻撃を試みることができます。これにより、ウェブサービスでは、モバイル端末とPCを区別してウェブページを表示する「レスポンシブデザイン」に対応したり、OSに合わせた悪意のあるコードを配信したりすることが可能になります。


ヒント: Nox PlayerやLD Playerのような仮想Androidアプリを評価する際には、Bluetooth、通信事業者、電話番号などの情報も確認することがあります。


※ ネットワーク環境の構築においては、ネットワークの分離により、社内ネットワークとゲストネットワークを区別し、セキュリティを維持する手法も用いられます。


以前の投稿では、iPhoneはセキュリティが高いと述べていますが、実際にはiPhoneもAndroidもC言語のコードが含まれているため、セキュリティ上の脆弱性につながる可能性があります。特に、ゲームなどのアプリケーションを開発する際に、iPhoneとAndroidの両方に対応した開発会社では、共通のC言語のコードが含まれる可能性があるため、注意が必要です。Androidの場合、ネイティブライブラリを通じてC言語のコードを実行することができます。


AndroidのAPKファイルをデコンパイルし、再パッケージ化、コンパイルする際に、コードを分析したり、変更したりする実習を行いました。その際に使用するデコンパイル、コンパイルのコマンドのみを記載します。また、Androidのasm言語であるsmaliに関する参考となるGoogleのドキュメントも添付します。

java -jar apktool_2.5.0.jar(java의 디컴파일, 컴파일 도구) d(디컴파일 옵션) apk(디컴파일 할 apk명) path(저장경로 및 디렉토리명)
java -jar apktool_2.5.0.jar b(컴파일 옵션) directory(컴파일 할 소스 코드 담긴 디렉토리) -o(이 옵션 다음에 apk 저장할 디렉토리) apk(새로 만들 apk명)

ダルビクのバイトコード  |  Androidのオープンソースプロジェクト  |  Android オープンソースプロジェクト

ダビク実行可能形式  |  Androidのオープンソースプロジェクト  |  Android オープンソースプロジェクト



Ⅲ. 静的解析と動的解析

静的解析アプリケーションが起動していない状態で ソースコード内にこれは、欠陥を発見するための分析手法です。 復元 ソースコードをアセンブリ言語または元のテキストから解析を試みます。その際、apktoolやjadxなどのツールを使用できます。Androidの場合、AndroidManifest.xmlや署名などを確認することで、どのような権限を使用しているか、悪意のあるコードかどうかをある程度把握することができます。DEX構造においては、各機能が classes.dexそのため、


この構造に基づいて、ソースコードの分析を試みます。


動的分析これは、実行中の環境で脆弱性を特定するための分析手法です。ユーザーの入力や処理の流れを改ざんすることで、どのような脆弱性が生じる可能性があるかを検証します。実行中の環境で、データや処理の流れを改ざんするために使用されます。 誘いこれは重要です。広く知られているHooking技術を利用して、アプリケーション内のどのクラスやメソッドが存在し、どのようなメソッドが動作しているのかを把握し、さらに操作することも可能です。 フリーダこれはJavaScriptをベースにしていますが、ある程度のテンプレートは用意されていますが、独自のコードロジックを構築する必要があります。また、Javaの JEBまた、そのような商用ソフトウェアも存在します。一般的に、ELF(Executable and Linkable Format)という、元々はUNIX系の実行ファイルを指すファイル形式の「so(Shared Object)」拡張子を持つファイルが、Android環境では動的にロードされることが多いようです。これらのファイルはC/C++で記述されており、ネイティブライブラリを通じて動作しますが、Androidの基盤であるLinuxシステムと連携しています。

検査項目

説明

OS変調の検出機能の適用状況

OSが改変(ルート化、脱獄)されたデバイスを使用する場合、セキュリティ上の脅威が増大するため、OSの改変後にサービスの利用が可能かどうかを確認することが重要です。

プログラムの信頼性検証

改ざんされたプログラムが正常に動作する場合、悪意のあるコードが含まれて再配布されるなどのセキュリティ上の脅威があるため、改ざんされたプログラムが正常に動作するかどうかを確認する必要がある。

メモリ内の重要な情報が漏洩したかどうか

利用者端末のメモリ領域において、重要な利用者の情報が平文で公開されていないかを確認する。

端末内に重要な情報が保存されているかどうか

アプリケーションで使用されるフォルダや外部ストレージに存在するファイルに、重要な情報が保存されているかどうかを確認する。

画面を強制的に実行することで認証プロセスを回避

画面の強制実行、認証に関連するファイルの改ざんなど、認証プロセスを回避できる可能性の確認

上記の表から、モバイルアプリケーションで確認すべき主要な項目は5つあります。まず、 OS変調の検出これは、オペレーティングシステムの管理者権限を取得し、デバイスに対する完全な制御が可能かどうかを確認するものです。Androidの場合 ルート化iPhoneの場合 脱獄これは、一般ユーザーがデバイスをルート化または脱獄した場合、セキュリティ機能であるサンドボックスが機能しなくなることで、セキュリティが著しく低下する可能性があることを意味します。もちろん、悪意のあるコードによって管理者権限が侵害されると、デバイスに保存されているすべてのデータが漏洩し、深刻な事態を引き起こす可能性があります。


※ モバイル端末だけでなく、PCでも特定のプログラムを使用する際、そのプログラムがOSの高い権限を利用する場合があります。そのため、そのプログラムをハッキングして、自分のPCの情報を取得される可能性があるため、注意が必要です。例えば、VMwareやNox Playerなどの仮想マシンは、カーネルに直接アクセスできるため、危険です。


そのため、このようなOSの変更を検知するために、特定のアプリを使用したり システム設定ファイル(ro.debuggable, service.adb.root) 背後を確認するか、Androidのシステムにアクセスして、ルートコマンドである「su」が実行されているかどうかを確認する。 ルート化時にインストールされるファイル(/sbin/su、/system/su、/system/bin/su、/system/xbin/su、/system/app/Superuser.apkなど)もし、そのような場所があるかどうかを確認することができます。

getprop | grep debug

このコマンドを入力してみると、


このような結果から、`ro.debuggable`の値が0の場合、ルート化されていない状態であり、1の場合、ルート化されている状態であることがわかります。


プログラムの信頼性検証これは、一般のユーザーが特に注意すべき点であり、見た目からは 見た目上は正常に見えても、内部には悪意のあるコードが潜んでいる可能性があるため。 注意が必要です。特に、Google Playストアのような公式のストアではなく、APKマーケットなどからダウンロードするアプリは、リスクが高いです。一方、iOSは、基本的にApp Storeからダウンロードする必要があるため、比較的安全と言えます。また、Windowsでも、ウェブ上から簡単にプログラムをダウンロードして使用できるため、同様に注意が必要です。一度インストールしてしまうと、後で問題が発生する可能性があるからです。


メモリ内の重要な情報が漏洩するこれは、すべてのデバイスが持つメモリを攻撃する可能性があるため、セキュリティに特に注意を払う必要がある点です。実際、すべてのアプリケーションはメモリに割り当てられ、さまざまなデータが蓄積・削除されるため、もし誰かがリアルタイムで メモリ情報をダンプもしそうであれば、私のアカウント情報、パスワード、クレジットカード番号、口座情報などがすべて漏洩する可能性があります。そのため、私が入力した重要な情報は、メモリに保存されている状態になります。 もし単独で存在する場合、脆弱性そして、 暗号化メモリ情報が漏洩する可能性を考慮し、それを特定できないようにする必要があります。特にウェブ上ではセキュリティに注意を払うことが重要です。JavaScriptはセキュリティ上の弱点があるため、そのまま公開すると危険です。 データベースに個人情報を保存する際にも、暗号化を適用する。そして、その解読には専門的な知識や技術が必要であり、容易に解読できるものであってはならない。


端末内の重要な情報を保存ただし、これは一般的なケースではありません。 重要な個人情報が、一般的なディレクトリや外部のストレージに保存されている。もしそのようなことが起こった場合、デバイスが一度でもハッキングされると、すべての個人情報が漏洩する可能性があります。ゲームの場合、ユーザーデータが残っている場合は、それを操作してゲームを楽しむことも可能ですが(…)、そのようなケースはほとんどないでしょう。銀行のような、より重要な情報が扱われる場合も同様です。 重要な情報はサーバー上で管理されており、サーバーのセキュリティにも細心の注意を払っているため、 一般的には安全であると言えるでしょう。もしユーザーが、デバイス内に重要な情報を個別に保存していない限り、比較的安全です。


画面を強制的に起動した場合の認証手順のスキップログインやキーの入力など、 認証プロセスに関連するファイル特定のアプリに侵入し、ユーザーの個人情報を取得する方法として、システムを操作して迂回することができます。 Androidmanifext.xml権限とコンポーネントの設定が定義されており、エクスポートされた値が true の場合、他のアプリケーションやシステムからそのサービスに直接アクセスできるようになり、false の場合は、アプリケーション内部でのみアクセス可能になります。もし、これらの設定により、外部からそのアプリケーションに ログイン関連の活動そのログインプロセスにアクセスし、その活動を実行する。 別のアクティビティを呼び出す 認証プロセスを回避し、本来のログイン機能とは異なる悪意のあるコードを実行させることが可能です。



Ⅳ. MultiDex

MultiDex要するに、Dexの構造は二重構造になっていると理解すると良いでしょう。


この画像を見ていただくと、この構造がどのように生まれたのかが理解できるかと思います。この構造が生まれた背景は… 方法の限界 それは、単純なアプリケーションの場合には当てはまりませんが、非常に多くの機能を提供したり、開発段階で多くのライブラリを参照し、多くのメソッドを使用する場合、単一のDexに収めることが難しくなるからです。 64KB 参照制限これは「64K参照制限」と呼ばれています。これは、実際には65,536個の方法を超えることができないため、値が64 x 1,024と一致するためです。そのため、画像のように 主要データベースわあ サブ・デックスこの構造では、複数の要素が互いに連携し、動的に動作するように設計されています。しかし、必ずしもこの構造を採用する必要はなく、むしろこの構造の利点がある場合もあります。 Sub Dexの場合、コードが隠れてしまう可能性があるため、 重要なコードは、Sub Dexに隠して実行できるように設計されており、Main Dexでは一般的なコードを実行できます。この構造のAPKファイルを逆コンパイルすると、MainとSub Dexが別の領域に存在することが確認できます。


ELF (実行可能・リンク可能形式)ここでは、Android上でどのように呼び出され、どのように動作するかを簡単に説明します。


Androidのネイティブライブラリを参照し、C/C++で記述されたコードを実行する際、DEX構造におけるクラスのメソッドが、その中に参照する必要があるELFメソッドが存在する場合、 PLT (手続き連携表)これにより、ロードが可能になります。PLTは、外部のプロシージャと接続するためのテーブルで、プロシージャの住所を GOT(グローバルオフセットテーブル)GOTを参照してロードすることができます。GOTは、PLTが参照するプロシージャの住所を保持するテーブルであり、図のようにELFファイルに組み込まれています。つまり、AndroidのDEX構造において、CLASSのMETHODは、自身のロジックに応じて実行する必要があるELFのメソッドをPLTに保持しており、このPLTはGOTを参照してロードすることができます。



APKファイルを開くと、さまざまな構成が見られますが、libというディレクトリが存在します。このディレクトリにはELFファイルが含まれており、中を見ると、


この形式で含まれています。`.so`という拡張子は、Linuxにおける実行ファイルを意味し、ELFはWindowsのPEファイルと同様に、Linuxにおける実行ファイルの構造を表します。



おまけ

今日は、実際に文章を書く前に、まずレビューを書きました。今週は、特に投稿の数が減る予定でしたが、ハッキングに関する技術を学んだため、書くことが難しくなってしまいました…(笑)。そこで、個人的にまとめて、この投稿で脆弱性診断の部分を最後に終わらせることにします。投稿の数が減ったことで、少しスッキリした感じもします。😆