poem:signature-spoofing
何が脆弱性だって?
目次
最終更新
Administrator
2022/07/28

注意

裏取りが済んでない記事未満の何かを垂れ流すスペース。
内容は現状のまま無保証で掲載されるし、見解は所属を代表した公式なものではないし、何かを推奨するものではない。
記載の内容を真似したことで起こるいかなる損害についても責任を負わない。

わたしは既にAndroidのカスタムROM開発からは手を引いたので、これ以上要らんこと聞いてこないでくれ。
ここに書いてる以上のことは無い。以下の戯言はやる気があった頃のめんどくさい主張とその根拠である。

microG が必要とする Signature Spoofing と LineageOS 側の立ち位置について

私も調べててよくわからなくなったので鵜呑みにせず参考程度に。

どっかで LineageOS に対する dis を見かけたけど私の知ってる話と違う気がしたので調べ直している話。

ざっくり

  • microG は GMS やPlayストアになりすますためにパッケージの署名偽装を可能にするパッチをカスタムROM側に必要としている
  • このパッチを当てることによるリスクがあるのは事実だが、GMSかmicroGを導入する限りは大きく影響を受けない(はず)
    • 逆に どっちも使わない場合にリスクが顕現する ことに注意
    • そして実装次第でリスクの範囲に差が出る
  • LineageOS 側は CyanogenMod 時代から セキュリティ上のリスク などを理由にこのパッチを一貫して reject している
    • が、根拠というか説得力に乏しい節はある(後述)
    • あとは当時のパッチの不備の指摘
    • まあ公式ビルドに含めたくない気持ちはわかる
  • CalyxOS は導入にあたり、セキュリティ上のリスクについては対策している
  • 少なくともこれを指して「LineageOS が安全でない」とする言説は 誤り である
    • 他の点は知らん

microG とは

本題ではないのでざっくりとしか説明しない。実際にどう使うかはこの記事では扱わないことに注意。

追記: microG のインストールについては別記事 poem:setup-microg で扱う。

不自由なソフトウェアである Google Play サービスに代わって、アプリケーションが Google API を利用するための FLOSS での代替実装。

プライバシーや自由を確保しながら、Google Play サービスに依存している Android の主要機能(プッシュ通知とか)を活用し続けることができる。

他のメリットにはバッテリやCPUへの負荷軽減、不必要な肥大化の回避などが挙げられる。

Signature Spoofing とは

microG は その目的のために、Google Play サービスの核である GmsCore (と、必要に応じて Play ストア)のあるべき場所に収まって、自身が正規のパッケージであるふりをする(成り代わる)必要がある。

Google Play サービスを利用するアプリケーションには Play Service Client Library が埋め込まれており、このライブラリはアプリケーションの署名に使用した証明書を要求することでデバイスにインストールされている Google Play サービスが特定の秘密鍵で署名されていることを確認する。また、Playストアがインストールされており、先と同じ秘密鍵を用いて署名されていることも確認する(このために microG には FakeStore がある)。

Signature Spoofing ではアプリケーションがインストール済みのパッケージについて署名に使用した証明書を要求した際に、パッケージに含まれる証明書の代わりに なりすまし用の証明書常に 返すようになる。つまり、 microG GmsCore 自身の証明書ではなく正規の GmsCore が持つべき証明書を返すことで microG GmsCore はあたかも正規の GmsCore であるかのように振る舞うことが可能になる。


Signature Spoofing に対応したシステム上で、 microG の FakeStore が実際に android.permission.FAKE_PACKAGE_SIGNATURE を要求する様子。
何も知らないとぎょっとしそうなメッセージだが、何も知らないのにこんなところを触るべきではない。

セキュリティリスクについて

https://blogs.fsfe.org/larma/2016/microg-signature-spoofing-security/

上の記事読んでもらえばいいんですが、具体例のひとつとしては以下

  • Signature Spoofing を有効にした状態では、 microG 同様に Google Play サービスに成り代わろうとする不正なアプリ [1] によって Google に送信されようとしているデータとかを覗けるおそれがある
    • が、GAppsかmicroGが導入されている環境では既にある Google Play サービスに成り代わることはできないのでこのリスクは軽減される

LineageOS の場合

LineageOS は…というか、彼らは前身の CyanogenMod の頃から一貫してこれらのパッチを reject している。

見解については CyanogenMod 時代の議論 から引っ張り出してくると、

  • ここで追加される機能(Signature Spoofing)がパッケージのなりすましを目的としている事実がある限り、公式リポジトリにマージすることは無い
    • ただし、これを必要としていて自分でパッチを当ててビルドする人、このパッチを適用した派生ディストリビューションの作成、ユーザーがこの機能をサポートするディストリビューションへ移行するなどの余地は残されている

というのが彼らのスタンスということになっている。

あとは先述のセキュリティリスクも、実装次第で塞げるはずだけど当該パッチでは特に対処されていないというのも reject の一因ですね。

microG が必要な人達からすれば頑なに態度を崩さない!悪!みたいに見えるかもしれないけど、サポートしている機種数や利用者などの規模を見るとそこに影響を与えかねない公式ビルドにリスキーな変更を入れることへの抵抗は大きくて、まあコミュニティとしての立ち回りはそんなもんだと思う。

CalyxOS の場合

CalyxOSなら安全!みたいなのを見たのでなんかやってんのかなあと思って掘ったら こんな経緯 があって、

What I want to do:

  • Hardcode the signature spoofing to only work with the microg GmsCore, and FakeStore if required
  • Ensure that it is the microg replacement by checking their signature, it could be signed with a separate key (and not the default system key) if that works (will need us to maintain an additional "microg" key but worth it IMO).
  • No runtime permission prompt for this, no developer option entry to enable this for all apps - This only works with GmsCore (and FakeStore), and nothing else.
  • Could even hardcode the spoofed signature here to ensure that they can only spoof the one signature.

つまり CalyxOS の場合、先のセキュリティリスクや CyanogenMod 時代の議論の中での指摘に対応する形で、Signature Spoofing は完全に microG を使うため だけ に導入するものGmsCoreFakeStore のみが対象)であって、それ以外のパッケージでは利用できないように ハードコードする 、なりすまし用の証明書もGoogleの使用するGmsCoreのそれをハードコードする(他の証明書を用いた不正ななりすましの防止)、などの対策を行っている。それに加えて、最初から microG を同梱するならば問題は起きないというのが CalyxOS なりの答えっぽい。

  • Permission FAKE_PACKAGE_SIGNATURE required
  • Only microG and FakeStore can spoof signature
  • Only the official Google signature can be spoofed, the "fake-signature" field is unused.

Allow selective signature spoofing for microG (f5fc0bbb)

実際のコミット。com.google.android.gms (GmsCore) と com.android.vending (PlayStore/FakeStore) のみに絞っている。

参考

上では使わなかったけどメモ


  1. 例えば雑に microG をforkして接続先を Google ではないところにしちゃったりとか ↩︎

2024 lindwurm. All rights reserved. | Powered by Wiki.js