FireタブレットにGoogle Playをインストールするのは安全か?APKMirrorのapkファイルを検証してみた

私の現在所持しているスマホはAndroid4.xなため、古すぎてそろそろ使えないアプリが増えてきた。そこで、AmazonのKindle FireタブレットにGoogle Playストアをインストールして、Androidとして使いたくなってきた。

こちらの記事(FireタブレットにGoogle Playをインストールする方法【2018年版】)を参照したところ、apkファイルをダウンロードしてきてインストールするだけでできるらしい。しかも、PC不要でSilkブラウザだけで作業が完結する。

ならばやってみようと思ったのだが、問題はapkファイルのダウンロードするサイトである。先の記事では、APKMirrorというサイトからapkファイルを持ってきていた。

Googleのサイトからダウンロードしたapkファイルであれば安心できるのだが、どうやらGoogleからはGoogle Playをインストールするためのapkファイルは提供していないようだ。おそらく、ちゃんとライセンスされていないAndroid端末にはGoogle Playをインストールさせたくないとかさせてはいけないみたいなことがあるのだろう。

APKMirrorの評判

まず確認しておきたいのは、APKMirrorの評判である。日本語と英語で軽く検索してみたところ、肯定的な意見が多いように感じた。

APKMirrorが安全であるとしている1つ目の理由は、APKMirrorの運営者はandroidpolice.comの運営者と同一であるということである。アンドロイドポリスとは言っても、androidpolice.comを軽く閲覧してみた感じ、Android関連ガジェットやアプリの紹介記事などが多く、特に警察っぽい(セキュリティとかの)記事は見つからなかった。しかし、APKMirrorで何かおかしなapkファイルが混ざっていたりするとAndroid Policeの信頼にも関わるわけであるから、どこぞの者が運営しているかわからないサイトよりは信頼できる。

2つ目の理由は、アプリの署名をチェックする機能があるからである。
以下のようにダウンロードボタンの上部に「Verified safe to install」(インストールが安全であることを検証済み)という記載がある。

また、この記載をクリックすると、次のように証明書のフィンガープリントとapkファイルのハッシュ値が表示される。

しかし、そうはいってもこの表示自体、正しいのかどうか気になるところである。

APKMirrorで表示された証明書のフィンガープリントの確認

それでは、APKMirrorからapkファイルをダウンロードしてみて、ウェブサイト上で表示された情報と実際にapkファイルに入っている証明書のフィンガープリントが同一か確認してみよう。

以下のコマンドを入力する。
keytool -printcert -jarfile <apkファイル>

ちなみにこれはapkファイル内のMETA-INF/CERT.RSAの情報を参照しているようなので、
unzip -p <apkファイル> META-INF/CERT.RSA | keytool -printcert
としてもいい。

(ちなみに、META-INF/CERT.RSAはPKCS7という形式のファイルで、署名、公開鍵、公開鍵の証明書などが含まれているようである。)

すると、以下のような出力がある。
Owner: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Issuer: CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US
Serial number: c2e08746644a308d
Valid from: Fri Aug 22 08:13:34 JST 2008 until: Tue Jan 08 08:13:34 JST 2036
Certificate fingerprints:
         SHA1: 38:91:8A:45:3D:07:19:93:54:F8:B1:9A:F0:5E:C6:56:2C:ED:57:88
         SHA256: F0:FD:6C:5B:41:0F:25:CB:25:C3:B5:33:46:C8:97:2F:AE:30:F8:EE:74:11:DF:91:04:80:AD:6B:2D:60:DB:83
Signature algorithm name: MD5withRSA (weak)
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
(以下略)

Certificate fingerprintsに、ウェブ上で確認したのと同じハッシュ値が表示されている。

また、以下のコマンドでapkファイルが実際に正しく署名されているか検証できる。
jarsigner -verbose -verify <apkファイル>

実行すると、以下のような出力がある。
(上部略)
sm     2392 Thu Aug 21 17:13:34 JST 2008 res/layout/wait_for_device_country_activity.xml
sm     2358 Thu Aug 21 17:13:34 JST 2008 res/raw/gtm_analytics
sm     1640 Thu Aug 21 17:13:34 JST 2008 res/xml/account_preferences.xml
sm      512 Thu Aug 21 17:13:34 JST 2008 res/xml/authenticator.xml
sm      484 Thu Aug 21 17:13:34 JST 2008 res/xml/location_settings.xml
sm   2233060 Thu Aug 21 17:13:34 JST 2008 resources.arsc
s     21747 Thu Aug 21 17:13:34 JST 2008 META-INF/MANIFEST.MF
      21792 Thu Aug 21 17:13:34 JST 2008 META-INF/CERT.SF
       1580 Thu Aug 21 17:13:34 JST 2008 META-INF/CERT.RSA
  s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
- Signed by "CN=Android, OU=Android, O=Google Inc., L=Mountain View, ST=California, C=US"
    Digest algorithm: SHA1
    Signature algorithm: SHA1withRSA, 2048-bit key
jar verified.
Warning:
This jar contains entries whose certificate chain is not validated. Reason: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
This jar contains signatures that do not include a timestamp. Without a timestamp, users may not be able to validate this jar after any of the signer certificates expire (as early as 2036-01-08).

最初にsmという文字とapk内の各ファイル名が表示されるが、sは署名が検証された、mはMANIFEST.MFファイルにそのファイルが記載されている、ということのようだ。
/META-INF以下の各ファイル以外にsmの表示がされており、最後の方で「jar verified.」と出力されたので、問題なさそうである。(/META-INF以下のファイルについては、署名の検証に使うためのファイルなので、smの表示がされていないのは問題ない)

Warningが気になるが、署名がされていないとかぶっ壊れているといった類のものではないので、今回はスルーした。

以上により、APKMirrorのウェブ上で表示される証明書の情報とダウンロードしたapkファイル内の証明書の情報が同じであること、apkファイルが正しく署名されていることが確認できた。

証明書が本当にGoogleのものであるかの確認

さて、あとの問題は、この証明書が本当にGoogleのものであるかどうかである。apkファイル内の証明書は基本的にオレオレ証明書らしいから、認証局によって検証することはできないが、単純に、Androidスマホなどから正規のapkファイルをとってきて、その中の証明書と比較すれば確認できる。

正規のapkファイルの取得

正規のapkファイルを取得するのにはadbコマンドを使う。(この際、adbコマンドではなくapkファイルを復元するなどとうたわれているサードパーティのアプリなどを使ってapkファイルを取ってきてしまうと何の検証にもならないので注意)

ちなみに、adbコマンドを使用する準備ができていない場合には、本サイトのこの記事の中でadbコマンドのインストール方法を紹介している。これ以降では、adbコマンドでAndroid端末を操作できるようになっていることを前提として話を進める。

AndroidスマホなどをPCに接続し、以下のコマンドでAndroidにインストールされているパッケージ(アプリ)の一覧を表示できる。

adb shell pm list packages -f

ただし、これだと全て表示されてしまうため、以下のようにして必要なパッケージを検索する。

adb shell pm list packages -f | findstr <検索文字列>

ちなみに、今回はGoogle Playストアのインストールに必要なアプリを検証したいので、パッケージ名はそれぞれ
Google Account Manager は com.google.android.gsf.login
Google Services Framework は com.google.android.gsf
Google Play services は com.google.android.gms
Google Play Store は com.android.vending
である。

これらパッケージ名は、APKMirrorの各アプリページに「Package: com.android.vending」といった感じで記載されているからすぐわかる。

例えば、Google Play Store のパッケージを特定したい場合は、以下のようにコマンドを入力する。
adb shell pm list packages -f | findstr com.android.vending

すると、以下のように出力される。
package:/data/app/com.android.vending-1.apk=com.android.vending

この場合、「/data/app/com.android.vending-1.apk」がapkファイルの保存されているファイルパスである。

(ちなみに、apkファイルが保存されている/dataや/system/priv-appには一般ユーザにアクセス権限がないため、Android内のファイラーアプリなどではapkファイルを持ってくることはできなかった。root権限があれば持ってこられたかもしれないが、root権限は取得していない。)

apkファイルのファイルパスがわかったら、以下のコマンドでapkファイルをPC上へ持ってこられる。
adb pull <ファイルパス>

つまり、上記で確認したGoogle Play Storeのapkを取ってくるときには以下のようにコマンド入力する。
adb pull /data/app/com.android.vending-1.apk

ファイルはカレントディレクトリへダウンロードされる。apkファイルがダウンロードされたら、次はそのapkファイル内の証明書の確認を行う。

証明書の確認

証明書の確認は、さきほどと同様に以下のコマンドで行う。
keytool -printcert -jarfile <apkファイル>

すると、出力の一部に
Certificate fingerprints:
         SHA1: 38:91:8A:45:3D:07:19:93:54:F8:B1:9A:F0:5E:C6:56:2C:ED:57:88
         SHA256: F0:FD:6C:5B:41:0F:25:CB:25:C3:B5:33:46:C8:97:2F:AE:30:F8:EE:74:11:DF:91:04:80:AD:6B:2D:60:DB:83
という表示があった。これは、APKMirrorからダウンロードしたapkファイルの証明書のフィンガープリントと同じである。そのため、今回APKMirrorからダウンロードしてきたapkファイルの証明書はGoogleのものであろうことがわかった。

結論

以上により、筆者としては、今回APKMirrorからダウンロードしたapkファイルはGoogleが署名している可能性が高く、正規のものであろうと判断し、Kindle FireタブレットにGoogle Playストアをインストールしてみることとする。

主な参考ページ
How can I verify the authenticity of an APK file I downloaded?

0 件のコメント :

コメントを投稿