PR

Androidにおけるセキュリティ設計と動作(後編)

2012年3月9日(金)
タオソフトウェア株式会社

3.5.3 SIMに関する識別子

電話番号
アンドロイドでは、ユーザの電話番号を取得することも可能です。悪意のあるプログラムが電話番号を取得し、ネットワークを介して収集することが考えられます。このようなプログラムに間違えられることがないよう、電話番号の取り扱いには十分注意してください。
電話番号を取得するには、READ_PHONE_STATEパーミッションが必要です。
IMSI
IMSI(International Mobile Subscriber Identify)は、国際移動体加入者識別番号です。IMSIはUSIMカードに割り当てられる番号です。
IMSIを取得するには、READ_PHONE_STATEパーミッションが必要です。
ICCID
ICCID(IC Card ID)は、SIMカードのシリアル番号です。ICCIDを取得するには、READ_PHONE_STATEパーミッションが必要です。

リスト3-7 READ_PHONE_STATEが必要な情報の取得

TelephonyManager telephonyManager =
  (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

// GSMのMSISDNにはREAD_PHONE_STATEが必要
String phoneNumber = telephonyManager.getLine1Number();
Log.v(TAG, "phoneNumber(電話番号)=" + phoneNumber);
// SIMのシリアル番号にはREAD_PHONE_STATEが必要
String simSerialNumber = telephonyManager.getSimSerialNumber();
Log.v(TAG, "simSerialNumber(ICCID)=" + simSerialNumber);

// GSMのIMSIにはREAD_PHONE_STATEが必要
String subscriberId = telephonyManager.getSubscriberId();
Log.v(TAG, "subscriberId (IMSI)=" + subscriberId);
// ボイスメール名にはREAD_PHONE_STATEが必要
String voiceMailAlphaTag = telephonyManager.getVoiceMailAlphaTag();
Log.v(TAG, "voiceMailAlphaTag=" + voiceMailAlphaTag);
// ボイスメール番号にはREAD_PHONE_STATEが必要
String voiceMailNumber = telephonyManager.getVoiceMailNumber();
Log.v(TAG, "voiceMailNumber=" + voiceMailNumber);

リスト3-8 出力例

10-24 14:20:53.173: V/Activity(11558): phoneNumber(電話番号)=09044444444
10-24 14:20:53.183: V/Activity(11558): simSerialNumber(ICCID)=6981300120205039856
10-24 14:20:53.183: V/Activity(11558): subscriberId (IMSI)=243133058138201
10-24 14:20:53.183: V/Activity(11558): voiceMailAlphaTag=ボイスメール
10-24 14:20:53.213: V/Activity(11558): voiceMailNumber=1417

ここではREAD_PHONE_STATEパーミッションが必要なメソッドだけを取り上げましたが、TelephonyManagerクラスには、パーミッションが必要なメソッドが他にもいろいろあります。たとえばキャリア名を返すgetSimOperator()メソッドは、NTTドコモの場合は44010を返します。

これらの値は個人のプライバシーに関わる情報となり得るため、取得する場合は厳重な取り扱いが必要です。アプリケーションによるセキュリティホールができないように注意するのはもちろんですが、それに加えて、ファイルやデータベースには保存しないようにし、もし保存する場合は暗号化やハッシュ処理を用いるなどの対応が必要です。

SIMに紐付けられた番号は、SIMを紛失して再発行した場合は変化します。また、IMEIの説明でも触れたように、これは携帯電話でのみ取得できる番号であり、SIMが入っていないデバイスでは取得できません。また、これらの値は偽造することが可能なので、プログラムの処理で識別子として利用することはお勧めしません。

3.5.4 その他の識別子

MACアドレス
MAC(Media Access Control)アドレスは、ネットワーク機器に割り当てられるアドレスであり、原則として端末ごとに一意な値となります。MACアドレスは無線LANやBluetoothのハードウェアから取得することが可能ですが、すべてのデバイスにWiFiがあるわけではありません。また、無線LANがオンになっていないと、ハードウェアがMACアドレスを返さないことがあります。
WiFiのMACアドレスを取得するには、ACCESS_WIFI_STATEパーミッションが必要です。

リスト3-9 MACアドレスの取得

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();

String macAddress = wifiInfo.getMacAddress();
Log.v(TAG, "macAddress=" + macAddress);

リスト3-10 出力例

10-24 14:25:53.873: V/Activity(11900): macAddress=45:A8:AF:32:71:52
シリアル番号
Android 2.3(Gingerbread)以降では、android.os.Build.SERIALが使用できます。携帯電話ではないデバイスは、ここに一意なデバイスIDを格納します。なお、携帯電話によっては値を返すものもあります。
なお、シリアル番号を取得するにあたってパーミッションは必要ありません。

リスト3-11 シリアル番号の取得

Log.v(TAG, "android.os.Build.SERIAL=" + android.os.Build.SERIAL);

リスト3-12 出力例

// Experia Arc 2.3.3携帯電話なのでunknownを返す
10-24 15:21:52.593: V/Activity(2851): android.os.Build.SERIAL=unknown
// Optimas Pad
10-24 15:21:52.593: V/Activity(2851): android.os.Build.SERIAL=265224030251710
著者
タオソフトウェア株式会社

2005年創業の独立系ソフトハウス、代表取締役 谷口 岳
サーバサイドアプリケーション開発会社としてスタート。Google社のアンドロイドに発表当初より着目し、研究開発を開始。現在はアンドロイド専業(受託開発)として、アンドロイド端末上で動作するアプリケーションやアンドロイド端末と連携して動作するサーバ側アプリケーションを数多く手がけている。日経BP社主催Android Application Award 2010 Springにて「tWakeUpCallMaker」が大賞を受賞。2010年5月に、プログラミング不要でアンドロイドアプリを作成できる「DOROKURI」サービスを開始。記事執筆、講演など多数。
ブログ(開発者向け情報を発信)

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています