アプリのインストール方法
誰が配ったものを信頼できるかで、入れ方が決まります。信頼できないものが多いほど、自分で用意するものが増えます。
想定する脅威
| 脅威 | 例 | 避ける入れ方 |
|---|---|---|
| 配る場所が乗っ取られる | GitHub Pagesやリポジトリが改ざんされる、偽のサイトに誘導される | 自分のPages、リリース、自分でビルド |
| リリースが差し替えられる | 作者のアカウントや署名鍵が盗まれる | 自分でビルド |
| 導入に使うPCが汚染されている | PCやブラウザのマルウェアが、入れるものを書き換える | Webアプリ(PCを使わない)。LockdownのQRでは、PCは表示するだけで、中身はリリースが決める |
| ビルドの材料が汚染されている | Rustやnpmの依存パッケージ、ビルド環境 | ソースを読んで自分でビルドする(材料は信頼したまま) |
このアプリが用意しているもの
- 4つの配り方: このサイト、自分のPages、作者のリリース、自分のビルド。後ろへ行くほど信頼する相手が減ります。
- リリースの署名と
SHA256SUMS: リリースのAPKは作者の鍵で署名されます。SHA256SUMSで分かるのはダウンロードが壊れていないことで、リリースそのものの差し替えは見抜けません。一度入れると、Androidは同じ鍵で署名された更新しか受け付けません。 - WASMのSHA-256照合: APKとiOSアプリは、読み込む署名エンジンのSHA-256が一致しなければ動きません。Webアプリでは照合するコード自体もサイトから届くので、サイトの差し替えは防げません。
- バージョン名: Webアプリは 設定 › このアプリのバージョン で動いているバージョンを確かめられます。GitHubのActionsでビルドすれば、同じコミットからは同じ名前になるので、リリースノートの「Web app build」と比べられます(手元のMacなど、別の種類のマシンでビルドすると一致しません)。
信頼するもので選ぶ
Webアプリのコードはどの配り方でも同じで、違うのは誰が配るかだけです。そこを信頼できないときに、端末の種類で分かれます。端末のほかのアプリを信頼できるかどうかは、入れ方ではなく使い方で決めます。
入れ方ごとに何を信頼するか
どの入れ方でも、このリポジトリのコードとOSは信頼します。●は信頼する、△は条件によって信頼する、—は信頼しなくてよい、です。
| Webアプリ(このサイト) | Webアプリ(自分のPages) | 自分でビルド(iOS) | 自分でビルド(Android) | リリースのAPK | |
|---|---|---|---|---|---|
| このサイト | ● | — | — | — | — |
| 作者のリリース | — | — | — | — | ● |
| 自分のGitHubとActions | — | ● | — | — | — |
| ビルド環境 | — | △※1 | ● | ● | — |
| 導入に使うPC | — | — | ● | ● | ● |
| 導入ページ | — | — | — | △※2 | ● |
| ブラウザエンジン | ● | ● | △※3 | △※3 | △※3 |
| 導入中のネット | つなぐ | つなぐ | 要ることがある | つながない | つながない |
| 手間 | 小 | 中 | 大 | 大 | 小 |
| 確認状況 | iPhone実機で確認済み | forkからは未確認 | シミュレーターのみ | 実機で確認済み | 実機で確認済み |
※1 GitHubのランナーとnpmの依存パッケージを信頼します。
※2 導入ページの「APK だけ入れる」で入れるときです。
※3 ネイティブアプリも画面と入力はWebView(iOSはWKWebView)で描くので、ブラウザエンジンを一部信頼します。鍵と署名エンジンはネイティブ側にあります。Webアプリでは、鍵も署名エンジンもブラウザの中にあります。
導入ページ: 導入ページはブラウザ(ChromeかEdge)からWebUSBでスマホに書き込みます。つないでいる間は、スマホに対してadbのすべての操作ができます。ページはこのリポジトリからビルドしたものです。
このサイト: Webアプリはホーム画面に入れて最初に開いたときにサイトから全ファイルを取り込み、その後はオフラインで動きます。その時点のサイトの中身を信頼します。ネットにつながると新しいバージョンが届き、ホーム画面に戻って開き直したときに切り替わるので、入れたあとはネットにつながないでください。
自分でビルドしたAPKは作者のリリースと署名鍵が違うので、リリースのAPKの上から更新することはできません。
手順はクイックスタートにあります。