Shikata Ga Nai

Private? There is no such things.

第26回:APK署名のチェックと再署名の意味

Hello there, ('ω')ノ

🧾 APKの署名ってなに?

Androidアプリ(APKファイル)には、「このアプリは確かに○○が作ったものです」という証拠(デジタル署名)が埋め込まれています。

これは次のような目的で使われます:

目的 内容
開発者の証明 どの開発者がビルドしたアプリかを判定する
改ざん防止 APKが一部でも書き換えられていれば署名が一致しなくなる
アップデートの整合性 同一署名でないと上書きインストールができない

🔐 なぜ署名がセキュリティに関わるの?

署名が一致している=改ざんされていないという証拠になります。

たとえば、攻撃者が次のような悪意のある改変を行った場合:

  • Javaコードを逆コンパイルして、情報を抜き取るコードを追加
  • 通信先を偽のサーバーに書き換える
  • 課金処理をスキップするように改変する

こういった操作がされると、元の署名では再署名できません。 再び使えるようにするには、「攻撃者が別の署名をつけ直す(=再署名)」必要があるのです。

つまり、署名をチェックすれば「このアプリは公式か?改ざん版か?」を見分けることができます。


🔍 署名のチェック方法(静的解析)

✅ 1. keytool を使って署名情報を見る

APKを apktooljadx で展開しなくても、署名ファイルは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を修正した場合は、再署名しなければ動作しない
  • 診断では keytoolapksigner を使って署名の整合性をチェックしよう!

Best regards, (^^ゞ