Hello there, ('ω')ノ
🧾 APKの署名ってなに?
Androidアプリ(APKファイル)には、「このアプリは確かに○○が作ったものです」という証拠(デジタル署名)が埋め込まれています。
これは次のような目的で使われます:
目的 | 内容 |
---|---|
開発者の証明 | どの開発者がビルドしたアプリかを判定する |
改ざん防止 | APKが一部でも書き換えられていれば署名が一致しなくなる |
アップデートの整合性 | 同一署名でないと上書きインストールができない |
🔐 なぜ署名がセキュリティに関わるの?
署名が一致している=改ざんされていないという証拠になります。
たとえば、攻撃者が次のような悪意のある改変を行った場合:
- Javaコードを逆コンパイルして、情報を抜き取るコードを追加
- 通信先を偽のサーバーに書き換える
- 課金処理をスキップするように改変する
こういった操作がされると、元の署名では再署名できません。 再び使えるようにするには、「攻撃者が別の署名をつけ直す(=再署名)」必要があるのです。
つまり、署名をチェックすれば「このアプリは公式か?改ざん版か?」を見分けることができます。
🔍 署名のチェック方法(静的解析)
✅ 1. keytool
を使って署名情報を見る
APKを apktool
や jadx
で展開しなくても、署名ファイルはZIP内部に存在しています。
keytool -printcert -jarfile sample.apk
すると次のような出力が得られます:
Owner: CN=Example Company, OU=Dev, O=Example, C=JP Issuer: CN=Example Company, OU=Dev, O=Example, C=JP Serial number: 1234567890ABCDEF Valid from: Tue Jan 01 ... SHA1: 3A:AB:4E:...
このSHA1指紋を控えておくことで、公式版と診断用APKとの違いを判別できます。
✅ 2. apksigner
ツールで検証する(Google公式)
apksigner verify sample.apk
改ざんされていない正規APKなら:
Verified using v1 scheme (JAR signing): true Verified using v2 scheme (APK Signature Scheme v2): true
と表示されます。
false
が出た場合は、署名が壊れている or 再署名されている可能性が高いです。
🔁 再署名とは?なぜ行うの?
再署名(Re-signing)とは、「もともと誰かが署名したAPKを、別の署名鍵で再度署名し直す行為」です。
✅ どうして再署名が必要になるか?
- 診断者が逆コンパイルしてコードを書き換えたあとに再パッケージすると、元の署名が壊れる
- 開発者でない限り、元の署名鍵は持っていないため、自分のテスト用鍵で再署名するしかない
✅ 再署名の例(jarsigner
)
jarsigner -keystore my-test-key.keystore -storepass password sample.apk alias_name
再署名したAPKは、元のアプリと別物として扱われるため、次のような制限があります:
制限 | 内容 |
---|---|
アップデート不可 | 元アプリと署名が異なるので上書きできない |
OS制限 | Android 11以降では再署名APKの動作に制限があることも |
Playストア非対応 | Google Playでは再署名アプリは受け付けられない |
🧠 診断時のチェックポイント
チェック項目 | 内容 |
---|---|
署名が正規の開発者のものであるか? | SHA1や署名情報を照合 |
改ざんされていないか? | apksigner で整合性チェック |
再署名されていないか? | 開発元とは違う証明書名やIssuerになっていないか |
🛡️ 実践での使いどころ
- 診断対象アプリの真正性確認(正規アプリか?海賊版か?)
- 改変されたAPKかどうかを見分ける
- ペネトレーションテスト時に再署名APKを使用するための前提知識として重要
✅ まとめ
- Androidアプリには開発者の署名情報が埋め込まれている
- 署名を比較すれば、改ざんや偽アプリを検出できる
- APKを修正した場合は、再署名しなければ動作しない
- 診断では
keytool
やapksigner
を使って署名の整合性をチェックしよう!
Best regards, (^^ゞ