APK アナライザー

Android パッケージ(.apk ファイル)をドロップして、電話に近づける前に、それ自身が宣言している内容を読み取りましょう:パッケージ名とバージョン、対象とする SDK レベル、要求するすべての権限、デバッグとバックアップを許可するか、他のアプリが到達できるコンポーネントはどれか、そして署名に使われた証明書。ファイルは決してデバイスを離れません:アップロードされず、このページの中で開いて解析されます。疑わしい APK こそ、見知らぬ相手のサーバーに渡してはいけないファイルだからです。

ファイルをこの枠内のどこにドロップしてもかまいません。以下はすべて、パッケージ自体からこのデバイス上で読み取られます——マニフェスト、コンパイル済みリソース、署名ブロックです。

APK がコードを一行も実行する前に宣言すること

APK は意見を持った ZIP アーカイブです。Android がそのコードを何一つ実行する前に、システムは内部のバイナリ AndroidManifest.xml を読みます。このひとつのファイルが、驚くほど完全な意図の表明になっています。パッケージ——更新の照合に使われるアイデンティティ——とそのバージョンを名乗ります。アプリがサポートすると主張する最も古い Android リリースと、その動作規則に沿って構築されたリリースを述べます。ターゲット SDK が重要なのはそのためです:ターゲットが低いと、古くて緩い権限の動作が静かに生き続けます。アプリが将来使えるすべての権限を列挙します。宣言されていない権限は後から付与できないからです。ビルドがデバッグ可能かどうか——リリースに決して生き残ってはならないフラグ——と、そのデータがデバイスのバックアップに取り込まれてよいかどうかも述べます。さらにアプリのコンポーネント(アクティビティ、サービス、レシーバー、プロバイダー)を棚卸しし、それぞれに、デバイス上の他のアプリが呼び出せるかどうかを決めるエクスポート状態を付けます。権限チェックなしでエクスポートされたコンポーネントは Android の古典的な攻撃面であり、何もインストールせずに、ここでマニフェストの中に見ることができます。

物語のもう半分は署名です。Android は、既存のアプリと更新の両方が同じ鍵で署名されている場合にのみ、更新を上書きインストールします。つまり署名証明書のフィンガープリントはアプリのアイデンティティの連続性そのものです:同じパッケージ名でも別の鍵で署名されていれば、見慣れたラベルをまとった別のアプリです。このページは両世代の署名——META-INF の Jar 形式の証明書と APK Signature Scheme v2/v3 ブロック——を読み、各署名者のサブジェクト、発行者、有効期間、SHA-256 フィンガープリントを表示します。これらは証明書と鍵のマッチャーで、お持ちの鍵や CSR と照合できます。コンパニオンガイドインストール前に APK の中身を見るでは、この検査全体をチェックリストとして辿ります。正直な制限がふたつあります:このページは宣言を読むもので、振る舞いを読むものではありません——コードを逆コンパイルせず、アプリを実行せず、マルウェアかどうかも判定しません。そしてマニフェスト自体が曖昧な場合(intent-filter を持つコンポーネントで exported フラグが省略されている、コンパイル済みリソースで解決できないラベル)には、推測で隙間を埋めず、その旨を述べます。アプリが実行後にネットワークで何をするかについては、PCAP アナライザーがキャプチャを読みます。

よくある質問

私の APK ファイルはどこへ行きますか?

どこにも行きません。ファイルはこのページの中で、あなたのデバイス上で開いて解析され、アップロードも送信も保存もされません——ファイルの解析でネットワークリクエストは発生しません。ここではそれが他の多くのツールよりも重要です:最も検査したい APK は、すでに疑っているもの——フォーラムで拾ったファイル、直接ダウンロードしたもの、おかしいと感じるストアの掲載——であり、疑わしいバイナリをリモートのスキャンサービスに送ること自体が露出になるからです。ページが読み込まれればオフラインでも動作します。

APK をインストールする前に何を確認すべきですか?

上のすべてに表示される四点です。パッケージ名:発行者の本物の名前空間か、一文字だけ変えたそっくりさんか。権限:懐中電灯アプリに本当に連絡先、通話履歴、正確な位置情報が必要か——そして署名レベルや特殊レベルの要求が日常的な要求に紛れていないか。エクスポートされたコンポーネント:他のアプリが到達できるアクティビティ、サービス、レシーバー、プロバイダーはすべて、あなたが受け入れる攻撃面です。そして署名者:更新はインストール済みアプリと同じ署名証明書を持たなければなりません。どこかから「新しいバージョン」をサイドロードする前に、SHA-256 フィンガープリントを信頼できるコピーと照合してください。

これでアプリがマルウェアかどうか分かりますか?

分かりません。マニフェストだけでそれを約束するツールは誇大広告です。このページはパッケージの宣言——アイデンティティ、権限、コンポーネント、フラグ、署名——を読みます。これは不注意な開発者やなりすましを捕まえるには十分です:署名者の違うクローン、SMS アクセスを要求する懐中電灯、デバッグ可能なままのリリースビルド。しかしコードが実際に何をするかを判断するには、逆コンパイル、動的解析、あるいは信頼できるスキャナーによるバイナリ自体への判定が必要です。ここでクリーンな結果が出ても、「宣言上おかしい点は見当たらない」と受け取ってください。安全証明書ではありません。

一部の権限に「リファレンス表にありません」と出るのはなぜですか?

もっともらしい推測より、正直さが勝るからです。表示される保護レベル(通常、危険、署名、特殊)は、よく知られた android.* 権限と、フレームワークがそれぞれに割り当てるレベルをまとめた厳選テーブルに基づきます。ベンダーは独自の権限を追加し、メーカーはさらに追加し、新しい Android リリースは新しい名前を導入します。それらはどれもテーブルにないため、ページはその旨を明示します。レベルが不明なことは、その権限が無害でも危険でもあることを意味しません——このリファレンスがカバーしていないという意味であり、権限自体の名前と名前空間こそが確認の出発点です。

「エクスポート:指定なし」とはどういう意味ですか?

マニフェストが本当に何も言っていないという意味です。コンポーネントが intent-filter を宣言しながら android:exported を省略した場合、実際の答えはアプリのターゲット SDK と Android のバージョンに依存してきました——古い規則ではそうしたコンポーネントはデフォルトでエクスポートされ、新しい規則では開発者が決めるまでアプリのインストール自体を拒否します。自信たっぷりに「はい」か「いいえ」を表示するリーダーは、ファイルに存在しない事実を作り上げていることになるため、このページは省略そのものを報告します。ご自身のビルドでこの行が出たら、明示的に修正する価値のある一行です。