WifiInfo.getMacAddressが常に02:00:00:00:00:00を返す件(Android 6.0)
Android6.0でBluetoothとWifiのMACアドレスの扱いが変更になりました。
Android 6.0 Changes のAccess to Hardware Identifierに記載があります。
少量なので簡単に翻訳してみました。
ユーザデータ保護のため今回のリリースからAndroidはアプリケーションがWi-FiおよびBluetoothのAPIを使用して端末固有識別子へのアクセスする機能を削除しました。
WifiInfo.getMacAddress()とBluetoothAdapter.getAddress()メソッドは02:00:00:00:00:00を返します。
近距離外部のデバイスのBluetoothやWifiのハードウェア識別子にアクセスするには、ACCESS_FINE_LOCATION や ACCESS_COARSE_LOCATIONの権限を持っている必要があります。
- WifiManager.getScanResults()
- BluetoothDevice.ACTION_FOUND
- BluetoothLeScanner.startScan()
NOTE:Android 6.0(API Level23)の端末がバックグラウンドでWi-FiもしくはBluetoothのスキャンを開始した場合、外部の端末にはその処理がランダムなMACアドレスから発信されたものとして認識されます。
簡単に纏めると
- BluetoothやWifiのMacアドレスを取得すると常に02:00:00:00:00:00を返す。
- スキャンする時はパミッションが必要になった。
- WiFiやBluetoothスキャン時にランダムのMACアドレスを使用するようになった。
となります。
iOSでは去年8月頃にWifiネットワークスキャン時にMACアドレスをランダムに生成するという変更が入りましたので、その追従という形なのでしょうか。。。。
参考
過去ANDROID_IDやIMEI等の取得が問題になりました。正しい目的のために使用すればいいのですが、これらの値はユーザによる変更が困難な性質があります。このため認証に使用すると、ユーザが端末を買い替えると認証失敗したり。逆に中古で買った端末が前のユーザと同一視してしまう等の問題が起こったりします。また広告モジュール等で無断で名寄せに使用される問題はまだまだ継続しています。ユーザにより自由に変更が可能な値であれば、ユーザによる対処方法があるのですが、変更ができないためどうしようもないのが現状です、上記のID以外にも変更が困難な値はあるのですが、今回WifiやBluetoothのMACアドレス(ユーザによる変更困難な値)が、取得不可能になるという思い切った変更が加わりました。
// 自分のMACアドレスを取得(02:00:00:00:00:00)を返す。 WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String macAddress = wm.getConnectionInfo().getMacAddress();Android 6.0で常にMACアドレスは、02:00:00:00:00:00を返します。
補足として、Android 6.0未満の場合は端末を起動してから一度もWifi接続をしていない時nullを返しましたが、Android 6.0では常に02:00:00:00:00:00を返します。
BluetoothのMACアドレスの検証コード
// 自分のMACアドレスを取得(02:00:00:00:00:00)を返す。 String macAddress = BluetoothAdapter.getDefaultAdapter().getAddress();Android 6.0で常にMACアドレスは、02:00:00:00:00:00を返します。
Wifi,BluetoothのMACアドレスの取得は不可能になりました。取得可能になるパミッションも有りません。これらの値をユーザ認証やその一部に使用しているのであれば(している人はあまりいないと思いますが政治的な理由によりしているアプリがあるかもしれない)ロジックの変更をする必要がありますし、なんらかのユニークIDが必要であればUUIDを生成する等で対処する必要があります。
スキャン時におけるランダムMACアドレス
スキャン時におけるランダムMACアドレス生成の目的はやはりプライバシーの保護です。 アンドロイド端末では、WifiをONにしている状態では接続できるアクセスポイントを探すために、アクセスポイントのスキャンをしています。この時に端末のMACアドレスも一緒に情報を出してしまっているため、外部からMACアドレスの取得が可能です。端末に近い場所でしか収集はできませんが、例えば、巨大なショッピングセンター全体で、スキャンをしていけば、その人がどのようなルートを通って買い物をしたのかわかります。特に問題ないじゃないかと思われるかもしれませんが、同意を取らずに、プライバシー情報(しかも変更困難な情報)を収集しておりプライバシー問題となります。(海外でこのようなトラッキングをし問題となった事例があります)
この問題を解決するために、アンドロイド端末からのスキャンの時は、ダミーのMACアドレス値を使用するようになりました。
まとめ&宣伝
あまり話題になっていない地味な変更ですが、なんか絶対忘れてしまって、絶対いつかはまる気がしています。
RiskFinderでは、アプリケーションの脆弱性問題だけではなく、プライバシーに関わる問題についても警告をだしたりしています。現在WifiInfo.getMacAddress()とBluetoothAdapter.getAddress()を使用しているプログラムを書いている方は、プライバシー云々に関わらずマストで修正をする必要があるのではないかと思っております。 このためRiskFinderではこれらのメソッドがあった場合に以下のメッセージを出しています。