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
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。