保護強度とクローズドプラグイン
RenMori はオープンコアアーキテクチャを採用しています。オープンソースの renmori CLI がアーカイブ化、検証と CI 連携を担い、固定のオープンソースのベースライン形式を内蔵しています。完全な強度の保護は、クローズドのネイティブプラグインが提供します。プラグイン自体は無料のビルド済みバイナリであり、非公開なのはそのソースコードのみです。
2 つの保護強度
ベースライン形式はコンテナの構造が公開されており、鍵とリーダーが平文でゲームと共に配布されます。既存のツールを無効化することはできますが、標的を絞った攻撃者に対しては実質的な保護になりません。正式なリリースにはフル保護を使用してください。両者の脅威モデルは脅威モデルを参照してください。
強度の決定方法
デフォルトの動作が自動的な格下げよりも失敗を選ぶのは、ベースライン強度しか持たないビルドを気付かないままリリースすることを防ぐためです。「プラグインがあればフル保護、なければベースライン」という動作が必要な場合は、auto を明示的に指定してください。
プラグインの取得順序
プラグインが必要な場合、renmori は以下の順序で探し、最初に利用可能だったものを使用します。
--plugin PATHで指定したファイル- 環境変数
RENMORI_PLUGINで指定したファイル - ローカルキャッシュ内のプラグイン
- 公開 Release からの自動ダウンロード
指定したパスが存在しない場合は、stderr にその旨を表示して次の手順に進みます。RENMORI_NO_DOWNLOAD を設定した場合は手順 4 をスキップします。
自動ダウンロード
プラットフォームとファイル
プラグインは renmori を実行するプラットフォームに応じて選択され、ゲームの対象プラットフォームとは関係ありません。対象プラットフォームは --platforms または自動検出によって決まります。上表以外のプラットフォームにはダウンロード可能なプラグインがないため、--plugin で指定するか、ベースライン保護を使用するしかありません。
ダウンロードの手順
- ダウンロード先の決定:デフォルトは
https://github.com/MewBaka/RenMori/releases/download/<tag>/で、<tag>のデフォルトは現在のバージョンに組み込まれたプラグインタグ(RENMORI_PLUGIN_TAGで上書き可能)。RENMORI_PLUGIN_BASE_URLを設定した場合はそのアドレスからダウンロード - 確認:対話型端末では
Full protection needs the closed plugin. Download <asset> from <url> ? [Y/n]と表示し、nまたはnoと回答するとダウンロードを中止(CLI の出力言語は中国語または英語のみであり、ここでは英語出力の文言を示す)。CI、非対話環境、--quietまたは-yの場合は確認せずにダウンロード - 同じアドレスにある
SHA256SUMSを取得し、対象ファイルのチェックサムを探す。該当するエントリが見つからない場合は中止 - プラグインファイルをダウンロードして SHA-256 を計算し、
SHA256SUMSと照合。一致しない場合はファイルを破棄し、Downloaded plugin failed its checksum; discardedと表示 - まず一時ファイルに書き込み、その後アトミックにキャッシュパスへ置き換え。macOS と Linux では実行権限を設定
いずれかの手順が失敗した場合、プラグインは利用不可とみなされます。強度が未設定の場合はコマンドが失敗し、auto の場合はベースラインにフォールバックします。
キャッシュの場所
キャッシュは Release タグごとのディレクトリに保存されるため、renmori をアップグレードしたり RENMORI_PLUGIN_TAG を変更したりすると、対応するタグの新しいディレクトリが使用されます。キャッシュディレクトリを削除すれば、強制的に再ダウンロードできます。
環境変数
オフライン環境と社内ネットワーク
- 事前キャッシュ:ネットワークに接続できるマシンで一度フル保護を実行し、キャッシュディレクトリをオフラインマシンの同じ場所にコピー
- パスの固定:プラグインファイルをビルドマシンに配置し、
RENMORI_PLUGINまたは--pluginで指定 - 社内ミラー:社内サーバーでプラグインファイルと
SHA256SUMSの両方を提供し、RENMORI_PLUGIN_BASE_URLでそのアドレスを指定 - ネットワークアクセスの禁止:
RENMORI_NO_DOWNLOAD=1を設定し、ビルド処理が一切ネットワークリクエストを発行しないようにする
CI でプラグインをキャッシュする方法はCI との連携を参照してください。
ケイパビリティハンドシェイク
プラグインを使用する前に、renmori は capabilities サブコマンドでプラグインを呼び出し、返された JSON を読み取ります。この JSON には、プラグインが対応するインターフェースバージョンと利用可能な強度のリストが含まれます。以下の場合、プラグインは利用不可とみなされます。
- プラグインを実行できない、0 以外の終了コードを返す、または 30 秒以内に応答しない
- 返された内容が有効な JSON ではない
- インターフェースバージョンが
renmoriの要求するバージョンより古い(この場合、stderr にplugin interface … unsupportedと表示される)
ハンドシェイクに成功すると、renmori は protect サブコマンドでプラグインを呼び出し、ソースディレクトリ、出力ディレクトリ、強度、プラットフォーム、ランチャー、除外リスト、チャンクサイズとロックダウン設定を含むリクエスト JSON を stdin 経由で渡し、プラグインの stdout の最終行から結果を読み取ります。プラグインの進捗情報は直接 stderr に出力されます。プラグインのファイル名が .py で終わる場合は現在の Python インタープリタで実行し、それ以外の場合は直接実行します。
オープンソースのツールとクローズドプラグインの間の完全なプロセスインターフェースは、オープン部分とクローズド部分のインターフェースを参照してください。