Snyk CodeでYAMLデシリアライゼーションを検出する
Calum Hutton
2023年2月23日
0 分で読めますオープンソースプロジェクトにおけるYAMLインジェクションの問題をSnyk Codeで特定するため、調査を行いました。この脆弱性自体は新しいものではありませんが、YAMLインジェクションがもたらす潜在的な影響は大きく、調査対象として適していました。この調査により、Python、PHP、Rubyで書かれたオープンソースプロジェクトでいくつかの問題が見つかりました。この記事では、Ruby on Rails用プラグインであるバージョン2.3.2のgeokit-railsで見つかった問題に焦点を当てます。
YAML
YAMLは、JSONのような単なるデータ交換形式ではありません。仕様には、高度な機能が多数定義されており、セキュリティ調査の対象として注目に値します。たとえば、次のような機能があります。
カスタムタグ(例:PyYAML)
アンカーとエイリアス
属性のマージ
複数ドキュメントのストリーム
YAMLは、さまざまな言語でバイナリデータや任意のオブジェクトのシリアライズにも使われ、デシリアライゼーション脆弱性につながる可能性があります。この調査では、悪用に成功するとリモートコード実行(RCE)につながることが多い、こうした脆弱性を対象としています。
RubyにおけるYAMLデシリアライゼーション
RubyではYAMLパーサーが言語のコアに組み込まれているため、追加のライブラリは必要ありません。アプリケーションがRuby標準のYAMLパーサーを使用している場合、YAML.load()またはYAML.load_file()を、それぞれYAML.safe_load()またはYAML.safe_load_file()の代わりに使うと、デシリアライゼーション攻撃に対して脆弱になります。デフォルトで安全な代替YAMLパーサーとして、SafeYAMLプロジェクトも利用できます。
次のスクリプトと出力は、YAML.load()を使ってYAMLを安全でない方法で読み込む例です。
var変数には単純なRubyハッシュが格納され、yaml変数には同じハッシュをYAML形式でシリアライズしたものが格納されています。putsの2つの文が同じハッシュを表示するのは、yaml変数がYAML.load()を介してYAML文字列からハッシュにデシリアライズされているためです。この方法では、さらに複雑なオブジェクトもシリアライズおよびデシリアライズできます。
この調査の初期段階で、Ruby 2.xから3.xまで有効な汎用Ruby YAMLデシリアライゼーションガジェットを見つけました。これをデシリアライズすると、任意のコマンドが実行されます。
上記のYAMLペイロードは、YAML.load()またはYAML.load_file()で解析されると、デシリアライズ時にidコマンドを実行します。
ケーススタディ:geokit-rails(2.3.2)
geokit-rails gemは、アプリケーションに位置情報サービスを提供するRuby on Rails用プラグインです。このプラグインは、geokit-rails/ip_geocode_lookup.rb内のretrieve_location_from_cookie_or_service()メソッドを介して、安全でないYAML.load()メソッドを使用しています。
安全でないYAML.load()メソッドに渡されるデータは、リクエストで送信されたCookieを保持するRuby on Railsのcookiesパラメーターに由来します。適切なHTTPリクエストを作成すればCookieを直接制御できるため、これは攻撃者にとって好都合です。
概念実証
Ruby 3.0.0上でgeokit-railsプラグイン(バージョン2.3.2)を動かすRailsアプリケーションをセットアップしました。この問題を悪用するため、次のHTTPリクエストをアプリケーションに送信しました。このリクエストには、URLエンコードされたYAMLペイロードをgeo_location Cookieに含めています。
Railsアプリケーション内でペイロードがデシリアライズされて実行され、コマンド実行を証明するためにidコマンドが実行されました。
geokit-railsを使用するシステムでは、この脆弱性を悪用する攻撃者がRCEを引き起こし、システムを完全に乗っ取る可能性があります。
修正方法
この問題はgeokit-railsのメンテナーに責任ある開示を行い、座標情報を含むYAMLをJSONに置き換えることで、ソフトウェアのバージョン2.5.0で修正されました。この調査を受けて、Snyk CodeのYAMLインジェクション検出ルールを改善・強化したため、ユーザープロジェクト内のこうした問題をさらに検出できるようになりました。
Capture the Flagを始めよう
オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。


