9月5日、TensorFlowがコード実行の欠陥のためにYAMLのサポートを中止したとBleepingComputerが報じた。
Google's TensorFlow drops YAML support due to code execution flaw - BleepingComputer
TensorFlowの信頼されていないデシリアライゼーションの脆弱性
TensorFlowとKeras(TensorFlowのラッパープロジェクト)のメンテナが、YAMLの安全でない解析に起因する信頼できないデシリアライゼーションの脆弱性にパッチを適用した。
CVE-2021-37678として追跡されているこの重大な脆弱性は、アプリケーションがYAML形式で提供されたKerasモデルをデシリアライズする際に、攻撃者に任意のコードを実行される可能性がある。
原因はTensorFlowのコードにある「yaml.unsafe_load()」関数である。
unsafe_load関数はYAMLデータをかなり自由にデシリアライズする。
"信頼されていない入力に対して安全でないと分かっているものであっても"すべてのタグを解決する。
GitHubセキュリティアドバイザリで紹介されているPoC(Proof-of-Concept)の例は、まさにこれを実証するものだ。
from tensorflow.keras import models
payload = '''
!!python/object/new:type
args: ['z', !!python/tuple [], {'extend': !!python/name:exec }]
listitems: "__import__('os').system('cat /etc/passwd')"
'''
models.model_from_yaml(payload)
TensorFlowはYAMLを完全にやめてJSONを採用
脆弱性が報告された後、TensorFlowはYAMLのサポートを完全にやめ、代わりにJSONデシリアライゼーションを使用することにした。
プロジェクトメンテナは「YAMLフォーマットのサポートにはかなりの作業が必要であることから、今のところ削除しました」と述べている。
また、リリースノートには以下の記述がある。
「"Model.to_yaml()" および "keras.models.model_from_yaml" は、任意のコードを実行するために悪用される可能性があるため、"RuntimeError" を発生させるように変更されました」
「YAMLの代わりにJSONシリアライズを使用することをお勧めします。また、より良い方法として、H5にシリアライズします」
CVE-2021-37678の修正は、TensorFlowのバージョン2.6.0で行われた。
それ以前の2.5.1、 2.4.3、 2.3.4にもバックポートされている。