Tensorflow 是一个基于 Python 的机器学习和人工智能项目,该项目由 Google 开发。近日 TensorFlow 已经放弃了对 YAML 的支持,以修复一个关键的代码执行漏洞。
YAML 或 YAML Ain't Markup Language 是一种人类可读的数据序列化语言,用于在进程和应用程序之间传递对象和存储数据,许多 Python 应用程序都使用 YAML 来序列化和反序列化对象。
该漏洞的 CVE ID 为 CVE-2021-37678。TensorFlow 和 Keras(TensorFlow 的一个封装项目)的维护者表示,该漏洞源于对 YAML 的不安全解析,漏洞会在应用程序反序列化以 YAML 格式提供的 Keras 模型时,使攻击者可以执行任意代码。反序列化漏洞通常发生在应用程序读取来自非真实来源的不良或恶意数据时。
这个 YAML 反序列化漏洞的严重程度被评为 9.3 级,由安全研究员 Arjun Shibu 报告给 TensorFlow 维护者。
这个漏洞的来源是 TensorFlow 代码中臭名昭著的 @quot;yaml.unsafe_load()@quot; 函数。
安全研究员 Arjun Shibu 表示,@quot;我在 TensorFlow 中搜索了 Pickle 和 PyYAML 的反序列化模式,令人惊讶的是,我发现了对危险函数 yaml.unsafe_load() 的调用。@quot;
众所周知,@quot;unsafe_load@quot; 函数可以对 YAML 数据进行相当自由的反序列化 —— 它解析了所有的标签,即使是那些不受信任的输入上已知不安全的标签。该函数直接加载 YAML 输入而不对其进行清理,这使得使用恶意代码注入数据成为可能。
序列化的使用在机器学习应用中非常普遍。训练模型是一个昂贵且缓慢的过程。因此,开发人员经常使用预先训练好的模型,这些模型已经存储在 YAML 或 TensorFlow 等 ML 库支持的其他格式中。
在该漏洞被披露后,TensorFlow 的维护者决定完全放弃对 YAML 的支持,而使用 JSON 进行反序列化。值得注意的是,TensorFlow 并不是第一个、也不是唯一一个被发现使用 YAML unsafe_load 的项目。该函数的使用在 Python 项目中是相当普遍的。
TensorFlow 的维护者表示,CVE-2021-37678 漏洞将于 TensorFlow 2.6.0 版本的更新中进行修复,并且还将被回传到之前的 2.5.1、2.4.3 和 2.3.4 版本。自年初以来,Google 已经在 TensorFlow 上修复了 100 多个安全漏洞。
本文地址:https://www.oschina.net/news/159014/deserialization-bug-in-tensorflow