Pocket

みなさんこんにちは、大侍ことohbaです。

5/31にオープントーン主催のセミナー
エンタープライズ Webシステム カンファレンス~IT Technical Seminar V14~
を開催させて頂きました。

例年にも増して大好評で私たち主催者側も胸を撫で下ろしております。
私もセミナーの1コマを頂いて「せきゅりてぃ侍 ~事例から学ぶAndroidセキュリティの傾向と対策~を発表させて頂きました。
その中で皆様から頂いた質問に対して、もう少し突っ込んだ内容を書きたいと思います。

Q. 実際にAndroidに入れた後で、その中にマルウェアがあるかどうかを確かめる方法は?(入れた後の話)
A. セミナー会場では「基本的にはありません。」とお答えさせて頂きました。
その後、そのようなツール等あるか調査しましたがこれといったものはありませんでした。
その理由は、セミナー内でも簡単には説明しましたが、Android特有のセキュリティ機構によるところが大きいです。
殆ど(私が調べた限り全て)のAndroid向けセキュリティソフトは「ユーザモード権限」で動作しており、Androidがシステム的に保護しているファイルやディレクトリにはアクセス出来ません。
例えば、外部ストレージに移動出来ないアプリは「/data/app-private」にインストールされますが、このディレクトリは「ユーザモード権限」ではアクセス出来ません。
そのためマルウェアが外部ストレージ移動不可の設定をしていれば、「ユーザモード権限」で動作するセキュリティソフトではマルウェアを検知することは出来ません。
この他にも、「ユーザモード権限」でアクセス出来ない箇所は点在しており、マルウェアをインストール後検出することは非常に難しいと考えられます。
以上より、やはりAndroidのマルウェア対策の原則はインストール前に防ぐことが重要となります。
また、Android4.2(Jelly Bean)ではインストールする際、マルウェアスキャンを行なえるようになりましたので、それを活用することで、安全性を高めることが出来ます。

Q. Androidで、脆弱性を調べるツールは無い?(ソースレベルの話)

A.セミナー内では調査しておらず未回答となっておりましたが、調べたところいくつかの診断アプリケーションがあることを確認致しました。ただし、動作確認等の検証はしておりませんので、情報のみの展開となります。今回紹介するものは有料のサービスになっております。・『Tao RiskFinder』(Tao software)開発したアプリ(APKファイル)をアップロードすることで自動で脆弱性の検出をするようです。ContentProvider等のセキュリティ項目の脆弱性を検出するほか、マルウェアと間違われやすい項目も検出するようです。<http://www.taosoftware.co.jp/services/riskfinder/index.html>上記サービス以外にもソニーデジタルネットワークアプリケーションズから『Secure Coding Checker』が発表されているようですが、本原稿執筆時点ではソニーデジタルネットワークアプリケーションズのWebサイトには情報が掲載されておりませんでした。

Q. Androidの設定で、セキュリティを高める方法は?(OSレベルの話)
A. こちらも基本的には無いと回答させて頂きました。
強いて挙げるなら、「提供先不明のアプリ」のインストールを許可しないように設定することで、公式マーケット以外からのインストールを防ぐことが出来ます。但し、SDカードや、メール・公式以外のマーケットからはアプリのインストールが出来なくなりますので注意が必要です。

Q. Intentの設定は、ContentProviderと同じように簡単にできる?
A. こちらは、AndroidManifestへの記述で設定可能と説明させて頂きました。
具体的には以下のようにAndroidManifest.xmlを記述することになります。

①非公開Activityの場合
1. taskAffinity を用いてアフィニティを指定しない
2. Activity にはlaunchMode を指定せず、値をデフォルトのまま”standard”とする
3. exported=”false”により、明示的に非公開設定する

<!– 非公開Activity –>
<activity
android:name=”.PrivateActivity”
android:label=”@string/app_name”
android:exported=”false” />

②公開Activityの場合
1.Action 指定による暗黙的Intent を受信するようにIntent Filter を定義。
2.Activity を公開設定するには、AndroidManifest.xml のactivity 要素のexported 属性をtrueと設定するか、exported 属性そのものを設定しません。
<activity
android:name=”.PublicActivity”
android:label=”@string/app_name” >
<intent-filter>
<action android:name=”org.jssec.android.activity.MY_ACTION” />
<category android:name=”android.intent.category.DEFAULT” />
</intent-filter>
</activity>

③パートナー限定Activityの場合
1. taskAffinity を用いてアフィニティを指定しない
2. Activity にはlaunchMode を指定せず、値をデフォルトのまま”standard”とする
3. Intent Filter は定義してはならない
<activity
android:name=”.ExclusiveActivity”
android:exported=”true” />

④自社限定Activityの場合
1. 独自定義Signature Permission を定義する
2. taskAffinity を用いてアフィニティを指定しない
3. Activity にはlaunchMode を指定せず、値をデフォルトのまま”standard”とする
4. Activity 定義にて、独自定義Signature Permission を要求宣言する
5. Intent Filter は定義してはならない
<permission
android:name=”org.jssec.android.activity.proprietaryactivity.MY_PERMISSION”
android:protectionLevel=”signature” />

<activity
android:name=”.ProprietaryActivity”
android:exported=”true”
android:permission=”org.jssec.android.activity.proprietaryactivity.MY_PERMISSION” />

参考資料:JSSEC
『Androidアプリのセキュア設計・セキュアコーディングガイド』2013年4月1日版

如何でしたでしょうか?
また何かあれば情報を展開してきたいと思います。
それではまたの機会まで御免でござる。