インストール前に APK の中身を確認する

APK は宣言書付きの zip ファイルです。Android がそのコードを 1 行も実行する前に、パッケージはすでに、自分が何者であると主張しているか、どの Android バージョンに対応するか、何をする許可が欲しいか、自分のどの部分を他のアプリが呼び出せるか、そして誰が署名したかを述べています。そのどれも、インストールなしで確認できます。先に読むことで、盲目的な信頼は 10 分の点検に変わります。そしてその点検だけで、たいてい判断がつきます。

サイドロードする APK を先に見るべき理由

公式ストアのアプリには、商品ページ、レビュー履歴、提供元のページが付いてきます。ベンダーのサイト、ミラー、フォーラムの投稿、チャットのメッセージ、古いバックアップからダウンロードしたサイドロード APK には、その文脈が一切なく、インストール画面が代わりになることもありません。Android のインストーラーはアプリ名とアイコンを見せ、権限は最後になって、グループ化され簡略化された形で、あなたが立ち止まって考える可能性が最も低い瞬間に現れます。アプリが一度インストールされ起動されれば、すでに付与された権限を持ち、ネットワークを使っているかもしれません。質問するのに一番安い瞬間はその前、ファイルがまだただのファイルである間です。

これはサイドロード自体への反論ではありません。ベンダーは正規のアプリを直接配布し、企業は社内ツールをこの方法で展開し、古いバージョンが実際の問題を解決することもあります。ここで言いたいのは、手渡されたものを読むことです。このサイトの APK アナライザー はブラウザの中でパッケージを解析します。ファイルはアップロードも実行もされず、マニフェスト、権限、コンポーネント、署名証明書が 1 つの画面に並びます。どのツールを使うにせよ、この順序を守ってください。先に点検し、後でインストールする。点検に耐えられないアプリは、それ自体が答えです。

マニフェストはアプリ自身の宣言

すべての APK には AndroidManifest.xml がバイナリ XML として格納されており、これはアプリ自身についての宣言です。パッケージ名(com.example.app のような、Android が使う一意の識別子)、数値の versionCode、人間向けの versionName を記します。アプリに含まれるコンポーネント、要求する権限、想定するハードウェアとソフトウェアの機能も宣言します。Android がこのファイルの多くを強制するため、ストアのページやダウンロードページよりも安易に偽るのが難しくなっています。アプリは宣言していない権限をこっそり使うことはできず、名前が異なるパッケージのアップデートを装うこともできません。

マニフェストの 2 つの数値は、保守の状況について驚くほど多くを語ります。minSdkVersion はアプリが動作する最も古い Android です。下限が非常に低いということは、何年も前のデバイスとセキュリティモデルへの対応を意味し、必要な場合もあれば、単に引き継がれて忘れられた場合もあります。targetSdkVersion はアプリが従うと主張する Android の動作レベルです。Google は毎年、ストアのアップデートに必要なターゲットを引き上げています。高いターゲットは新しいプライバシーとセキュリティのルールの適用を受けることを意味するからです。ターゲットが数年前のままのサイドロードアプリは自動的に悪意があるわけではありませんが、新しいルールを避けてきた、あるいは満たしたことがないことを伝えています。理由を問うべきでしょう。

権限は正しく読む

Android は権限を分類し、その分類は名前よりも重要です。通常の権限はインストール時に自動的に付与されます。ネットワークアクセスが身近な例で、システムが低リスクと判断するからです。危険な権限は、連絡先、メッセージ、正確な位置情報、マイク、カメラなどの機微なデータと操作を扱い、ユーザーが拒否できる実行時の確認が必要です。署名権限は同じ証明書で署名されたアプリ、またはシステム自体にしか付与されません。したがって、第三者のアプリがそれを宣言しても何も得られません。権限リストを読むときは、個々の行を判断する前に、頭の中でこれらの分類に分けてください。

判断を決めるのは件数ではなく文脈です。懐中電灯が SMS の読み取りを求めることに誠実な理由はありません。一方、メッセージアプリが同じ権限を求める場合は、少なくとも説明できます。認証コードの読み取り、または標準のメッセージアプリになるという申し出です。銀行アプリは正当に多くの権限を求めることがありますが、単純なゲームが数件だけ求めていても、その中にそぐわない 1 件が含まれているかもしれません。だから権限の数だけでアプリを採点しないでください。危険な権限ごとに、その権限がなければ壊れるこのアプリの機能は何かと問うてください。機能に対応づけられない要求こそが発見であり、インストール時の要約が隠すのはまさにそれです。

エクスポートされたコンポーネントと、それが生む攻撃面

アプリはコンポーネント——アクティビティ(画面)、サービス、ブロードキャスト受信機、コンテンツプロバイダー——で構成され、マニフェストはそのうちどれがエクスポートされているか、つまりデバイス上の他のアプリから到達可能かを述べます。エクスポートされたコンポーネントは、既定で誤りではありません。共有ターゲット、ファイルを開く機能、ディープリンクは、コンポーネントが意図的にエクスポートされ、保護され、現代の Android では明示的に宣言されることで動作します。リスクは、公共の扉になるべきではなかったエクスポート済みコンポーネントにあります。どのアプリでも起動できるサービス、どのアプリでも引き起こせる受信機、権限チェックを前に置かずアプリのデータを求める相手に渡してしまうプロバイダーです。

本番アプリでは、マニフェストの 2 つのフラグを直接確認する価値があります。デバッグ可能とマークされたアプリケーションは、接続されたマシンのツールで取り付けて検査できます。それは開発用の設定であり、有効なまま出荷するのは、そのリリースの作り方についての危険信号です。バックアップを許可すると、アプリのプライベートデータがデバイスのバックアップに含まれる可能性があります。便利かもしれませんが、アプリの中に留まると思っていたデータが、ずっと管理の緩い場所へ移る可能性もあります。どちらのフラグも、アプリが有害である証拠にはなりません。どちらも確認は安く、完成品では正当化が難しく、ダウンロードページには決して現れない種類の詳細です。

署名証明書:Android の身元システム

すべての APK は署名されており、署名証明書は Android が持つ身分証明書に最も近いものです。Android が既存のアプリの上にアップデートをインストールするのは、新旧両方のコピーが同じパッケージ名と同一の署名者を共有する場合だけです。この 1 つのルールが多くの静かな仕事をします。すでに信頼しているアプリのトロイ化したアップデートを他人が送れないのは、その人が元の鍵を持っていないからであり、証明書の指紋(通常は SHA-256 ダイジェストとして表示)が継続性を確認する実用的な方法であることも意味します。ベンダーが期待される指紋を公開しているなら、照合してください。このサイトの証明書と鍵のマッチャーは、証明書と鍵全般について同じ指紋の考え方を扱います。

指紋が何を証明し、何を証明しないかを明確にしてください。指紋は、このファイルが特定の秘密鍵の保有者によって署名されたこと、そして同じ鍵で署名された別のファイルと一致するかどうかを証明します。鍵の保有者が誠実であること、力量があること、さらには証明書のサブジェクト欄に記された企業であることさえ証明しません。その欄は署名者自身が記入するからです。再パッケージされたアプリは通常、オリジナルとは異なる証明書で署名されています。そのため、指紋の不一致は強い停止信号であり、一致は継続性の信号にすぎません。Android における身元とは鍵の継続性であり、それ以外ではありません。そのつもりで扱ってください。

インストール前のチェックリスト

部品を固定の順序で組み合わせれば、点検は数分で終わります。第一に身元。パッケージ名は期待したアプリと一致し、バージョンコードとバージョン名はダウンロードしようとしたリリースとして妥当ですか。第二に保守。最低およびターゲット SDK レベルはどのくらい古く、それは今も手入れされているアプリに相応しいですか。第三に権限。危険な権限を挙げ、それぞれを機能に対応づけ、説明できないものがあれば立ち止まってください。第四に攻撃面。どのコンポーネントがエクスポートされ、デバッグとバックアップは有効ですか。第五に署名。証明書の指紋は提供元が述べた値、または少なくともすでに信頼しているコピーと一致しますか。ファイルを APK アナライザー にかけ、1 つの画面でこのリストを順に確認してください。

そして、2 つではなく 3 つの区分で決めてください。すべてが機能に対応づけられ、指紋が一致すればインストールする。ほとんどが合うが 1 件の監視が必要なら、慎重にインストールする——テストデバイスで、仕事用プロファイルで、あるいは疑問のある権限を付与せずに。パッケージ名が間違っている、指紋が一致しない、危険な権限の背後に想像できる機能がない場合は、やめること。やめるコストはダウンロード 1 回分であり、逆方向はアカウントを失う可能性があります。そしてこの習慣を過大にしないでください。これはパケットキャプチャ・アナライザーの最初の 10 分と同じトリアージです。どこへでも持ち歩くデバイスに居場所を与える前に、ファイルが自身について宣言していることを、速く、正直に読む行為です。

よくある質問

マニフェストがきれいに読めれば APK は安全ですか?

いいえ。マニフェストは宣言であり、振る舞いの報告ではありません。アプリは控えめでまったく妥当に見える権限とコンポーネントの組を宣言しながら、コードの中では悪く振る舞うことができます。本拠へ接続する、正当に付与された権限を乱用する、インストール後に新しい振る舞いをダウンロードする、などです。マニフェストを読むことはトリアージです。食い違う身元、説明できない権限、むき出しのコンポーネント、誤った署名証明書を、速く安く見つけます。それはマルウェアの判定ではありませんし、マニフェストの読み取りを緑色の「安全」スタンプに変換するツールは、証拠が支える以上のことを主張しています。

なぜ同じアプリでもツールによって表示される権限が違うのですか?

通常、正当な理由が 3 つあります。第一にバージョン制限。権限には maxSdkVersion が付く場合があり、ある Android レベルまでしか適用されません。ツールによって、その項目を表示するかどうかが異なります。第二にグループ化。Android は確認時には権限をグループで表示しますが、マニフェストは個別の権限を列挙します。そのため、グループ表示は完全なリストより短く見えます。第三にマージ。アプリにバンドルされたライブラリは独自のマニフェスト項目を持ち込み、ビルド時に最終ファイルに統合されます。そのため、インストールされたマニフェストには、アプリ自身のコードのどの部分も宣言したことのない権限が含まれていることがあります。違いは、どの理由が当てはまるかを見るきっかけであり、改ざんの自動的な証拠ではありません。

何もインストールせずに APK を確認できますか?

はい。それがブラウザローカルのアナライザーの要点です。APK はファイルとして解析されます。バイナリマニフェストが復号され、リソースがラベルと文字列のために読み取られ、署名証明書が抽出されて指紋が付けられます。アプリのコードは決して実行されず、どのデバイスにも何もインストールされません。そしてこのサイトのアナライザーでは、ファイルがアップロードされることもありません。解析はブラウザタブの中で行われます。確認サービスが APK をサーバーにアップロードするよう求めてきたら、そのファイル——社内ビルドであるかもしれません——が、そもそも他人のマシンの上に置かれるべきものかどうか、自問してください。