Hydraのロギング設定における、安全でない呼び出し可能オブジェクトの解決を許可する問題
## 概要
Hydraは、Pythonのロギング設定を`logging.config.dictConfig()`に渡していました。Pythonのロギング設定機能は、設定ファイルで指定されたインポート可能なクラスやファクトリを解決し、実行することができます。これには、ハンドラ、クラスの値、フォーマッタ、フィルタ、ハンドラ、キュー、およびリスナーのファクトリなどが含まれます。
このロギングの処理は、Hydraのターゲットポリシーによって制御されていませんでした。すでに`instantiate()`による保護が行われていたバージョンでも、ロギングの解決処理は、`instantiate()`を使用しなかったため、その制御を回避していました。
攻撃者がHydraのロギング設定を制御できる場合、Hydraがロギングを設定する際に、カスタムクラスやファクトリを使用して、アプリケーションの権限でコードを実行することが可能です。
## 修正
Hydraは、現在、Hydraによって設定されたPythonロギングにおける、呼び出し可能オブジェクトの解決と実行に、ターゲットポリシーを適用しています。カスタムファクトリ、ハンドラ、フォーマッタ、フィルタ、キュー、リスナー、エイリアス、検出結果、および呼び出し可能オブジェクトの使用を許可する前に、承認を行います。
Hydra 1.3.6では、セキュリティ強化されたブラックリストを使用しています。Hydra 1.3のブラックリストは、可能な限り防御を強化するためのものです。これは完全なセキュリティ境界ではなく、信頼できないロギング設定を安全にするものではありません。
Hydra 1.4.0.dev9では、実行許可リスト(ホワイトリスト)を推奨される主要なセキュリティ境界として導入しました。ブラックリストは、互換性のための代替手段として残されています。実行許可リストが提供される場合、Hydraは、組み込みのロギング設定で使用されるターゲットを自動的に許可します。一方、カスタムロギングの統合は、信頼できるPythonコードによって明示的に承認される必要があります。許可リストが提供されない場合、Hydraは警告を表示し、従来の代替動作を維持します。
## 対策
Hydra 1.3.6にアップグレードするか、1.4のプレリリース版をテストする場合は、Hydra 1.4.0.dev9以降にアップグレードしてください。
Hydra 1.3では、信頼できないソースからログ設定を構成しないでください。Hydra 1.4以降では、カスタムのログ出力先を、信頼できるPythonコードによって提供される厳格な実行許可リストで制限します。この実行許可リストは、呼び出し可能なオブジェクトの選択を制御し、すべてのログ設定の一般的な検証を行うものではありません。
Hydra 1.4の実行許可リストの設定については、以下のドキュメントを参照してください。
https://hydra.cc/docs/advanced/execution_whitelist/
影響を受けるパッケージ:
- pip (Python) hydra-core: 影響を受けるバージョンは1.3.6未満、1.3.6で修正済み。
- pip (Python) hydra-core: 影響を受けるバージョンは1.4.0.dev0以上、1.4.0.dev9未満、1.4.0.dev9で修正済み。