セキュリティとプライバシー · Clash 技術ブログ

Clash のリモートルールセットは安全か:rule-providers の提供元、更新、改ざんリスクを確認する

rule-providers がアカウントのパスワードを直接読み取ることはありませんが、ドメインの出口を変更できます。使用前に少なくとも提供元、更新履歴、ロールバック用ファイルを確認し、重要なルールの更新時には差分も確認してください。

  • rule-providers
  • ルールセット
  • サプライチェーン
  • セキュリティ
目次

自動更新されるリモートルールは、自分が設定を変えていなくても、サイトへのリクエストの経路を変えることがあります。ダウンロードの成功だけでなく、管理者、追加されたドメイン、異常時に前のファイルへ戻せるかも確認します。重要なアカウントの通信が予想外の経路に流れた場合、見た目の整ったファイルより接続記録とルールの差分が判断材料になります。

ルールファイルはパスワードを読めなくても、重要な通信の出口を変えられる

Rule Provider(rule-providers)の内容と設定内のルール順序、特に先頭に近い DOMAIN-SUFFIX ルールを確認します。ルール集合が直接パスワードを読むことはありませんが、直接接続、プロキシ、拒否の判断に関わります。範囲が広すぎると、銀行、会社の管理画面、内部ネットワークでのログインのリクエストが未知のノードを通る可能性があります。出所不明で自動更新され、戻す手段もない場合は、こうした変更を確認してください。

接続記録に想定外のポリシーが出たら、以前の信頼できるルールのバックアップがあれば復元し、なければこの Provider のルール参照を一時的に外します。設定を再読み込みして既存接続を切り、発生時刻、Provider 名、一致した項目、最終出口をリポジトリの変更と比較して、誤収録、ローカルの順序違い、リモートの内容の置き換えを区別してください。

raw のアドレスはどのリポジトリ、管理者、コミットに対応する?

追加前に答えられる必要があること

  • この raw ファイルが属する公開リポジトリとメンテナー
  • リポジトリのコミット履歴がルールのテーマと一致しているか
  • 取得内容は想定した YAML テキストまたは MRS のバイナリルールファイルであり、ログイン画面、スクリプト、短縮リンクの転送ではない
  • 現在の設定で、前回ダウンロードしたローカルファイルを保持できるか
  • エラー発生時に、この Provider だけを無効にする方法が分かるか

ブランチのアドレスはコミットのたびに内容が変わるため、信頼済みで更新が必要なルールに適しています。コミットハッシュのアドレスは内容が固定され、銀行や会社への直接接続など、変更が少なく影響の大きいルールに適しています。二つは併用でき、すべての入手元を一時間おきの更新に設定する必要はありません。

rule-providersのURL、形式、キャッシュパスはどう設定する?

レビュー可能な Rule Provider の例
rule-providers:
  research:
    type: http
    behavior: domain
    format: yaml
    url: https://raw.githubusercontent.com/OWNER/REPO/COMMIT/rules.yaml
    path: ./ruleset/research.yaml
    interval: 86400

rules:
  # REPLACE_WITH_POLICY 必须换成当前配置中已经存在的策略组
  - RULE-SET,research,REPLACE_WITH_POLICY
  - MATCH,DIRECT

OWNER、REPO、COMMIT、REPLACE_WITH_POLICY はすべてプレースホルダーであり、コピー後にそのまま有効にすることはできません。確認済みのリポジトリ、固定コミット、既存のポリシーグループへ置き換えてください。

behavior と format はリモートの内容に合わせ、path にはコアが許可し、書き込める場所を指定します。ルール参照は MATCH より前に置きますが、会社のネットワーク、LAN、直接接続が必須の高優先度ルールより前には置かないでください。

更新に成功したら、ルール数と更新時刻を確認し、よく知っているドメインを数件選んで一致を確認します。画面に「更新完了」と表示されただけでは、現在の実行時設定が新しいファイルを実際に参照していることを証明できません。

重要なルールを更新する前に、diff で変更内容を確認する

独立した確認用ディレクトリにrules.last.yamlを用意します。内容は、すでに確認して信頼できる前回のルールのバックアップにしてください。rules.new.yamlは今回確認するダウンロードファイルです。名前や場所が違う場合は実際のパスに変更し、候補ファイルを使用中のProviderキャッシュへ直接書き込まないでください。

以下のコマンドは一つずつ実行します。RULE_URLを、信頼できるリポジトリの特定コミットに固定した実際のURLへ変更してください。ダウンロードに失敗したら止め、残っているかもしれない古いファイルのハッシュ計算や比較を続けないでください。前回の信頼できるバックアップがなければ候補の内容を確認するだけで、diffの結果がないことを「変更なし」とは判断できません。

自分が管理するターミナルで比較する。先に RULE_URL を置き換えてください
RULE_URL='https://raw.githubusercontent.com/OWNER/REPO/COMMIT/rules.yaml'
curl -L --fail --show-error -o rules.new.yaml "$RULE_URL"
sha256sum rules.new.yaml
diff -u rules.last.yaml rules.new.yaml | less

macOS では sha256sum の代わりに shasum -a 256 を使用できます。ハッシュで分かるのは、二つのファイルが同じかどうかだけで、内容自体の信頼性は証明できません。実際に確認すべきなのは、追加項目と削除項目、リポジトリのコミット説明、ルールのテーマが一致しているかどうかです。

ファイルが数千行から突然数十行へ減った場合、先頭に <!doctype html> が現れた場合、動画用ルールへ多数のアカウントや銀行ドメインが一度に追加された場合は、自動更新を停止してください。

更新後に想定外の経路を使う場合は、信頼できるルールに戻して既存接続を切る

異常発生時の対処

  1. この Provider の更新を停止する

    以前の信頼できるルールのバックアップがあればそのファイルを復元し、なければ RULE-SET の参照を一時的に外します。

  2. 設定を再読み込みして接続を切断する

    新しいリクエストは元のポリシーへ戻ります。既存のセッションは出口を自動では変更しません。

  3. リポジトリの変更内容と比較する

    項目の誤収録、アドレスの移行、形式の変更、入手元の検証不能のどれに該当するか確認します。

  4. 機密性の高いアカウントを確認する

    ログインリクエストが想定外の出口を通った場合は、ログイン履歴を確認し、リスクに応じて認証情報を変更してください。

  5. 固定コミットまたは別の入手元へ切り替える

    説明できないリモートファイルでは、自動更新を再び有効にしないでください。

参考資料