Hydraの古いターゲットブラックリストは、PyYAMLの安全でない読み込み機能を許容する。
## 概要
Hydraの古いターゲットブラックリストには、PyYAMLの安全でない読み込み機能に関する記述が不足している。
もしアプリケーションが攻撃者によって制御されたターゲットと引数を`instantiate()`関数に渡した場合、`yaml.unsafe_load`のような機能が、設定ファイルによって制御されたYAMLストリームを通じてPythonコードを実行する可能性がある。このYAMLストリームには、Pythonオブジェクトの構築に関する情報が含まれている。
## 影響と前提条件
攻撃者は、アプリケーションがインスタンス化する関連するターゲットと引数を制御する必要がある。
設定された関数は、アプリケーションのプロセス権限で実行される。
これは、ベストエフォートで行われた古いブラックリストの脆弱性である。
これは、信頼できるPythonコードによって提供されるHydra 1.4の実行許可リストを回避するものではない。
現実的な攻撃シナリオとしては、Hugging Faceのような第三者のリポジトリからダウンロードされたモデルに、攻撃者が制御する設定ファイルが同梱されている場合が考えられる。
被害者が、この設定ファイルをアプリケーションコードを通じて読み込む際に、古いHydraのインスタンス化機能を使用し、効果的なターゲット制限が適用されていない場合、モデルのメタデータが被害者のプロセス上でコードを実行する可能性がある。
このモデル読み込み攻撃の手法は、元のHydraのアドバイザリ(GHSA-2cp2-2r3c-7p7r)および関連するUnit 42の研究で詳しく説明されている。
これは、Hugging Faceのすべてのモデル、または現在修正されている関連ソフトウェアに影響があることを意味するものではない。
Hydra 1.3のブラックリストは、多層防御の一環であり、完全なセキュリティ境界ではない。
Hydra 1.4は、非推奨の許可リストを使用しない古いパスにおいて脆弱性がある。
インストールされたアプリケーションのラッパーは、名前ベースのブラックリストの範囲を超える間接的な操作を実行する可能性がある。
この修正は、任意の構成を安全にするものではない。
`unsafe_load`に関する問題は、実際に再現されたものである。
PyYAML 6.0.3の`full_load`関数は、示された`python/object/apply`というペイロードを拒否するため、この問題は、PyYAMLのすべての読み込みAPIがそのペイロードを実行することを意味するものではない。
## 対策
この修正により、yaml 名前空間内の関数が制限されます。ただし、yaml.safe_load、yaml.safe_load_all、yaml.safe_dump、および yaml.safe_dump_all という特定の関数は例外として許可されます。ローダーのクラス、コンストラクタの登録、一般的なダンプ/ロードAPI、および名前空間内の他のターゲットは、引き続き制限されます。既存のcanonical-identityチェックは、エイリアスもカバーしています。この修正は、Hydra 1.4における、信頼できる用途のための明示的なunsafeオプションの無効化機能を維持しています。
## 対策
信頼できない設定を instantiate() または call() に渡さないでください。Hydra 1.4の場合、信頼できるPythonコードから、許可された実行対象を限定的に指定してください。信頼できない設定が、自身の実行ポリシーを選択したり、チェックを無効にしたりしないようにしてください。
## 対象となるバージョン
報告されている、未完の修正が含まれる安定版の範囲は、hydra-core 1.3.6から1.3.7です。また、1.4のプレリリース版の旧バージョンも影響を受けています。具体的には、1.4.0.dev9、1.4.0.dev10、1.4.0rc1、および 1.4.0rc2が含まれます。関連するブラックリストに関する注意喚起(GHSA-rqx7-p7vv-w7hr)は、1.3.6および1.4.0.dev9で初めて修正されました。これらのバージョン範囲は、その修正後の残存する問題を示しています。
## 貢献者
報告者:zx (@manus-pi)。
影響を受けるパッケージ:
- pip (Python) hydra-core: 影響を受けるバージョンは、1.3.6以上、1.3.8未満。1.3.8で修正済み。
- pip (Python) hydra-core: 影響を受けるバージョンは、1.4.0.dev9以上、1.4.0rc3未満。1.4.0rc3で修正済み。