Google TensorFlow から YAML が脱落:深刻な RCE 脆弱性が原因

Google’s TensorFlow drops YAML support due to code execution flaw

2021/09/05 BleepingComputer — Google が開発した Python ベースの機械学習/人工知能プロジェクトである TensorFlow は、深刻ななコード実行の脆弱性に対処するため、YAML のサポートを終了した。YAML (Yet Another Markup Language) は、コンフィグレーション・ファイルや転送中のデータを扱い、人間が読める形にシリアライズする言語であり、開発者にとって便利な選択肢である。

TensorFlow における信頼できないデシリアライゼーションの脆弱性

TensorFlow および、TensorFlow のラッパー・プロジェクトである Keras をサポートするメンテナたちは、YAML の不適切な解析に起因する、信頼できないデシリアライズの脆弱性にパッチを適用した。この脆弱性 CVE-2021-37678 は、YAML 形式で提供された Keras モデルを、アプリケーションがデシリアライズする際に、攻撃者による任意のコード実行が生じるというものである。

デシリアライズの脆弱性は、認証されていないソースから送られてきた、不正なデータや悪意のデータを、アプリケーションが読み取ったときに発生するのが一般的である。アプリケーションがデータを読み込んでデシリアライズした後に、クラッシュによるサービス拒否 (DoS) 状態に陥ることがあり、最悪の場合には、攻撃者による任意のコード実行が生じる可能性もある。セキュリティ研究者である Arjun Shibu は、この YAML デシリアライズの脆弱性について、深刻度を 9.3 と評価し、また、TensorFlow のメンテナたちに報告している。

YAML の unsafe_load 関数は、かなり自由にデータをデシリアライズすることで知られている。具体的に言うと、信頼されていない入力に対して、また、安全ではない入力に対しても、すべてのタグを解決してくれる。理想的には、unsafe_load は信頼できるソースからの入力に対してのみ、また、悪意のあるコンテンツが含まれていない場合にのみ、呼び出されるべきものである。

シリアライズされていない YAML データに、攻撃者が悪意のペイロードを注入すると、デシリアライズのメカニズムを悪用して、任意のコードを実行することが可能になる。この脆弱性アドバイザリで紹介されている、 Proof-of-Concept (PoC) Exploit は、まさにこのことを示している。

JSON の利点

この脆弱性が報告された後に、TensorFlow は YAML サポートを完全に中止し、代わりに JSON デシリアライゼーションを使用することを決定した。プロジェクト・メンテナたちは、「YAMLフォーマットのサポートは、かなりの作業量を必要とするため、現時点では削除している」とアドバイザリで述べている。

さらに、「メソッド Model.to_yaml() および keras.models.model_from_yaml は、任意のコード実行に悪用される可能性があるため、RuntimeError を発生させるように変更された。YAML の代わりに JSON シリアライズを使用するか、より良い代替策として、H5 にシリアライズすることが推奨される」と付け加えている。

注目すべきは、YAML の unsafe_load を使用しているプロジェクトが、TensorFlow だけではないことが判明した点である。この関数の利用は、Python プロジェクトではかなり一般的なのだ。GitHub の検索結果では、この関数を参照している何千もの事例があり、改善を提案している開発者もいるようだ。脆弱性 CVE-2021-37678 の修正は、TensorFlow の Ver 2.6.0 で行われる予定だが、それ以前の Ver 2.5.1 / 2.4.3 / 2.3.4 にもバックポートされると、メンテナたちは述べている。

脆弱性を拾っていると、YAML はよく見かけられるプロダクトですが、この CVE-2021-37678 に関しては、YAML ではなく TensorFlow の脆弱性として、8月28日にチェックされていました。CVSS は 9.3 で、CWE-502(安全でないデシリアライゼーション) となっていますが、リモートからの攻撃は無しとなっています。以前に、「アプリケーションに含まれる Third-Party ライブラリの 79% が更新されていない?」という記事をポストしましたが、このパーセンテージは驚きでした。これは、ライブラリに限っての話ですが、オープンソース全体の弱点でもあります。YAML が TensorFlow に戻る日が来ると良いですね。

%d bloggers like this: