PocketRoles · 安全のしくみ
コード署名のポリシー
配るファイルにどんな署名を付けているか、まだ付けていないものは何か、自分で確かめるにはどうするか。いまの本当の状態を、そのまま書いています。
いまの状態
- 配るファイルの一覧(
SHA256SUMS.txt)に、作者の署名を付けています(v0.5.5 から)。 - Aegis の定義ファイルに、作者の署名を付けています。署名の合わないファイルは使いません。
- exe などのプログラムに、Windows のコード署名(発行元の証明書)は、まだ付いていません。はじめて開くときに、Windows の青い警告が出ます。
コード署名ってなに?
ファイルに付ける「しるし」です。「だれが作ったか」と「あとから書き換えられていないか」を確かめられます。
PocketRoles に関係する署名は 2 種類あります。
- 作者の鍵での署名付いています
PocketRoles が自分で作った鍵で付けます。配るファイルの一覧と、Aegis の定義ファイルに付けています。 - Windows のコード署名(Authenticode)まだです
証明書を出す会社が発行元を確かめたうえで、プログラムに付けるものです。これがあると Windows が「発行元」を表示でき、青い警告が出にくくなります。
いま署名しているもの
配るファイルの一覧(SHA256SUMS.txt)
v0.5.5 から、GitHub Releases の 1 つのリリースに、次の 4 つのファイルを付けます。
| ファイル | 中身 |
|---|---|
PocketRoles-<版>.zip | MOD 本体 |
PocketRoles-Setup-<版>.zip | ランチャー |
SHA256SUMS.txt | 上の 2 つの指紋(SHA-256)の一覧 |
SHA256SUMS.txt.sig | その一覧への、作者の署名 |
「指紋」は SHA-256 というハッシュです。ファイルが 1 バイトでも変わると、指紋も変わります。
一覧には # release=<版> の行があります。だから、古いリリースの一覧を新しいリリースに使い回すことはできません。同じ版を、別の中身で署名し直すこともしません。署名した版と中身の記録を作者の PC に残していて、道具がそれを断ります。
SHA256SUMS.txt はこんな形です。
# format=PocketRoles.Release.Sums.v1
# release=0.5.5
<64 文字の指紋> PocketRoles-0.5.5.zip
<64 文字の指紋> PocketRoles-Setup-0.5.5.zip
Aegis の定義ファイル(aegis/definitions.txt)
チートの検知ルール、NG ワード、共有 BAN の一覧などが入ったファイルです。MOD と Aegis のトレイアプリが、GitHub から自動で受け取ります。
このファイルにも、同じ鍵で署名(definitions.txt.sig)を付けています。
MOD とトレイアプリは、署名の合うファイルだけを使います。署名がない・合わない・無効にした鍵で署名されている・いま使っているものより古い、のどれかなら、そのファイルは使いません。そのときは、プログラムに入っている値(と、前に確かめて保存したファイル)を使います。
結果は、トレイアプリのスキャン画面(「署名 OK」)と、MOD の /ac rules で見られます。
署名の鍵
- 方式
- RSA 3072 ビット / SHA-256
- keyid
91400fdf0f5af4ca— 公開鍵の指紋(SHA-256)の先頭 16 桁です。.sigファイルの 2 行目にkeyid=91400fdf0f5af4caと書いてあります。- 秘密の鍵
- 作者の PC にだけあります(パスワード付き)。控えを 1 つ、ネットにつながない場所に置いています。GitHub にも、自動でビルドする仕組みにも置いていません。
- 公開鍵
- MOD とトレイアプリのプログラムの中に入っています(ソースでは
src/Net/AegisRules.csとaegis/Aegis.ps1)。 - 鍵が漏れたら
- 新しい鍵に替えて、古い鍵を「無効にした鍵」の一覧に入れた版を出します。無効にした鍵で署名したファイルは、それ以降使われません。
まだ署名していないもの
いま配っているファイル(ランチャーの .cmd と .ps1、MOD の DLL)と、いま作っている exe のランチャーには、Windows のコード署名が付いていません。
そのため、はじめて開くときに、青い画面「Windows によって PC が保護されました」(SmartScreen)が出ます。これは「発行元を確かめられない」という意味で、「ウイルスが見つかった」という意味ではありません。開くには「詳細情報」→「実行」を押します。
心配なときは、開く前に、下の「確かめ方」でファイルを確かめてください。
もう 1 つ、正直に書いておきます。いまのランチャーは、ダウンロードのときに SHA256SUMS.txt を自分では確かめません。確かめられるのは、あなたが下の手順を行ったときだけです。
確かめ方
1. 指紋の確認(壊れていない・すり替わっていないか)
- GitHub Releases の同じリリースから、zip と
SHA256SUMS.txtを同じフォルダーにダウンロードします。 - そのフォルダーで PowerShell を開きます。フォルダーの何もないところを、Shift を押しながら右クリック →「PowerShell ウィンドウをここで開く」(Windows 11 では「ターミナルで開く」)。
- 次を打って Enter を押します。
Get-FileHash .\PocketRoles-0.5.5.zip - 出てきた
Hashの 64 文字が、SHA256SUMS.txtの同じ名前の行と同じなら OK です。大文字と小文字の違いは気にしなくて大丈夫です。
まとめて確かめたいときは、この 1 行です(ファイルごとに OK か NG が出ます)。
Get-Content .\SHA256SUMS.txt | ForEach-Object { if ($_ -match '^([0-9a-f]{64}) (.+)$') { $ok = (Get-FileHash -LiteralPath ".\$($Matches[2])").Hash -ieq $Matches[1]; ('{0} {1}' -f $(if ($ok) { 'OK' } else { 'NG' }), $Matches[2]) } }
これで分かること:
- ダウンロードの途中で壊れていない。
- 一覧に書いてあるファイルそのものである。
- 一覧そのものがすり替えられていないかは、これでは分かりません。それは次の「署名の確認」で分かります。
2. 署名の確認(一覧が作者の出したものか)
確かめる道具は、PocketRoles のソースに入っています(tools/sign-definitions.ps1)。秘密の鍵もパスワードも要りません。
- GitHub のページで「Code」→「Download ZIP」を押してソースを取り、展開します。
- リリースの 4 つのファイル(zip 2 つ・
SHA256SUMS.txt・SHA256SUMS.txt.sig)を、1 つのフォルダーに置きます。 - PowerShell で次を打ちます(2 か所の
<…>は、自分のフォルダーに変えます)。powershell -NoProfile -ExecutionPolicy Bypass -File "<ソースのフォルダー>\tools\sign-definitions.ps1" -VerifyRelease "<4 つを置いたフォルダー>\SHA256SUMS.txt" - 「署名 OK(鍵 91400fdf0f5af4ca)」と、緑の「検証 OK」が出れば、作者の鍵で署名された一覧です。同時に、zip の指紋も一覧と比べます。
- 赤い文が出たら、そのファイルは使わないでください。お問い合わせから知らせてもらえると助かります。
3. Aegis の定義ファイル
自動です。MOD とトレイアプリが、受け取るたびに署名を確かめます。自分で見たいときは、トレイアプリのスキャン画面の「署名 OK」か、MOD の /ac rules を見てください。
だれが署名を決めるか
- PocketRoles は、作者 1 人で作っています(GitHub: @wakayamachannel)。
- 署名は毎回、作者が自分の PC でパスワードを入れて行います。自動では署名されません。
- ほかの人からの変更(Pull Request)は、作者が全部読んで確かめてから取り込みます。
- 作者の GitHub アカウントは、2 段階認証(2FA)を使っています。
これから
- exe のランチャーに Windows のコード署名を付ける予定で、その申し込みの準備をしています。まだ承認されていません。承認されたら、このページに書き足します。
- 署名が付いても、はじめのうちは青い画面が出ることがあります。Windows が新しい発行元を信用するまで、少し時間がかかるためです。
- MOD 本体(
PocketRoles.dll)は、ビルドに Among Us のファイルが要るため、この予定には入っていません。
くわしい説明と連絡先
- くわしい説明(GitHub): docs/CODE-SIGNING.md
- 質問: お問い合わせ
- セキュリティの問題: SECURITY.md(GitHub)