TensorFlow 因代码执行缺陷已弃用 YAML ,建议使用 JSON 来替代
技术编辑:MissD 丨发自 思否编辑部
公众号:SegmentFault
据外媒报道,由于安全缺陷,由谷歌提供的开源机器学习和人工智能项目—— TensorFlow 已经放弃了对 YAML 的支持。在最新版本中,Google 已将 YAML 删除,以解决不受信任的反序列化漏洞执行问题。
据悉,本次编号为 CVE-2021-37678 的漏洞 ,是由研究员 Arjun Shibu 提交给谷歌的,其严重程度较高,CVSS 得分为 9.3 。
YAML 是一种更可读的格式,用于表示数据序列化。研究人员发现,当 TensorFlow 代码加载 yaml.unsafe_load()函数时,攻击者可通过该漏洞,在应用程序反序列化 yaml 格式提供的 Keras 模型上执行任意代码。
通常,反序列化漏洞容易发生在应用程序从不真实的源读取格式错误或恶意数据之时,此时 TensorFlow 中的反序列化漏洞,可能导致 DoS 崩溃或拒绝服务。更糟糕的是,此漏洞甚至可以执行任意代码。
以上,就是为什么 “yaml.unsafe_load()” 函数漏洞的 CVSS 得分高达 9.3 分(满分 10 分),且“臭名昭著”的原因。
众所周知,“unsafe_load” 函数反序列化 YAML 数据的方式相当宽松,并可以解析所有标记,包括已知不受信任的标记。
这意味着在理想情况下,unsafe_load 应该只在没有任何恶意内容的可信源输入上调用。否则,攻击者则可以利用反序列化机制,通过将恶意负载注入到尚未序列化的 YAML 数据中,以执行想要执行的代码。
一项关于漏洞概念脆弱性咨询的 PoC 示例,证实了这一点:
从 tensorflow.keras 导入模型有效载荷 = ''' !!python/object/new:type args: ['z', !!python/tuple [], {'extend': !!python/name:exec }] listitems: "__import__('os').system('cat /etc/passwd')" ''' models.model_from_yaml(payload)
正因为如此,在研究人员通知 Google 该漏洞后,TensorFlow 的维护人员决定完全放弃 YAML 的使用,转而使用 JSON 反序列化。
“鉴于 YAML 格式支持需要大量工作,现在我们已经删除了它,”同一项目咨询中的维护人员称,“引发 RuntimeError 的 Model.to_yaml()和 keras.models.Model_from_yaml 已被替换,因为它们可能被滥用而导致任意代码执行”。同时,维护人员解释了与修复相关的发行说明。
同时,维护人员还举例说明了 YAML 导致的其他漏洞和修复。维护人员建议开发人员使用 JSON 反序列化而不是 YAML,或使用 H5 序列化等更好的替代方法。
值得注意的是,TensorFlow 并不是唯一使用 YAML 不安全加载函数的项目。在 Github 上搜索可以发现大量 Python 项目使用该不安全函数。
鉴于潜在的安全问题,研究人员建议,这些项目应及时解决这个问题,使用这些项目的开发人员也应注意安全。
据了解,TensorFlow 有望解决版本 2.6.0 中的漏洞问题,即删除 YAML 支持。届时,2.5.1、2.4.3 和 2.3.4 的早期版本也将被修复,使用该项目的开发人员也应及时升级到最新版本。