RubyでYAMLファイルを扱う際、YAML.load は非常に便利なメソッドです。
しかし、その便利さの裏には大きな落とし穴があります。
YAML.loadが行っていること
YAML.load は、YAMLをRubyオブジェクトへ変換します。
その際、単なるデータ構造だけでなく、
- 任意のクラスのインスタンス生成
- 初期化処理の実行
まで行われる可能性があります。
なぜ危険なのか
外部から渡されたYAMLを YAML.load すると、
- 意図しないオブジェクトが生成される
- 危険なメソッドが呼び出される
といった問題が発生します。
これは過去に、
リモートコード実行などの深刻な脆弱性につながったこともあります。
よくある誤解
設定ファイルだから安全、という思い込みは非常に危険です。
- 設定ファイルが改ざんされる
- 想定外の入力が混ざる
こうしたケースは現実に起こります。
安全な代替手段
現在は、基本的に YAML.safe_load を使うべきです。
safe_load では、
- 許可したクラスのみ読み込み
- 危険なオブジェクト生成を防止
といった制限がかかります。
実務での指針
- 外部入力は必ず
safe_load - 読み込むクラスを明示する
- 本当にYAMLが必要か見直す
この意識だけで、リスクは大きく下げられます。
まとめ
-
YAML.loadは強力だが危険 - 外部入力には使ってはいけない
- 安全な代替手段を選ぶ
便利な機能ほど、正しく理解して使う必要があります。