TensorFlow 删除 YAML 支持,建议 JSON 作为替补方案!
Posted 苏小宓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow 删除 YAML 支持,建议 JSON 作为替补方案!相关的知识,希望对你有一定的参考价值。
TensorFlow,作为一个主流的开源 Python 库,最初由 Google 开发用于机器学习领域,逐渐成为 GitHub 顶级开源 TOP 10 项目之一。
近日,Google TensorFlow 项目团队宣布了一项重大的改变,由于存在一个关键代码执行漏洞,其取消对另一种标记语言 YAML 的支持。TensorFlow 团队表示,鉴于 YAML 支持需要大量工作,因此暂时删除了 YAML。
YAML 是一种可读性高,用来表达资料序列化的格式。开发者常用 YAML 作为通用格式来存储数据并在进程和应用程序之间传递对象。据 GitHub 公告称,TensorFlow 和 Keras(TensorFlow 的包装库)使用了不安全的函数来反序列化 YAML 编码的机器学习模型。
臭名昭著的 “yaml.unsafe_load()”函数
上文所提及的不安全函数指的是 “yaml.unsafe_load()”函数(https://github.com/tensorflow/tensorflow/blob/460e000de3a83278fb00b61a16d161b1964f15f4/tensorflow/python/keras/saving/model_config.py#L100),其中“unsafe_load”函数可以相当自由地反序列化 YAML 数据,它能够解析所有标签,“即使是那些在不受信任的输入上不安全的标签”。
而这样的漏洞会带来怎样的后果?
事实上,在理想情况下,“unsafe_load”应该只在没有任何恶意内容的可信源输入上调用。反之,攻击者可以利用反序列化机制,通过在尚未序列化的 YAML 数据中注入恶意负载来执行他们选择的代码。
对此,安全研究人员追踪发现,这个关键漏洞可使攻击者能够在应用程序反序列化以 YAML 格式提供的 Keras 模型时执行任意代码,其将该漏洞称之为 CVE-2021-37678。
简单来看,序列化将对象转换为字节流。反序列化则可以视为与序列化相反的过程,其中使用字节流在内存中重新创建实际的 Java 对象。因此,当不受信任的数据被用来滥用应用程序的逻辑时,就会发生不安全的反序列化。
当应用程序读取反序列化数据后,或造成应用程序崩溃,导致拒绝服务 (DoS) 条件,甚至带来更为糟糕的结果,即执行攻击者的任意代码。
最初该漏洞由安全研究员 Arjun Shibu 发现,并上报给了 TensorFlow 项目的维护者。
来自 Coalfire 的管理负责人 Andrew Barratt 解释称,只要大多数高级语言支持基于对象的数据格式,反序列化错误就一直存在,甚至出现在解析数据流以获取常见结构之前。Barratt 说,使用常见结构化格式的处理对象往往需要访问大块内存,因此解析过程中的错误总是会导致数据泄漏到内存区域,攻击者可能会操纵这些区域以进行远程代码执行。
解决方案
此次,这个 YAML 反序列化漏洞的严重性被标记为 9.3 等级,影响范围较为广泛。据悉,本次漏洞影响 TensorFlow 2.3.2、2.4.2 与 2.5.0 版本,Keras 的 0.1.0 到 2.6.0 版本均受影响。
作为解决方案,在宣布弃用 YAML 之后,TensorFlow 团队建议开发者以 JSON 替代 YAML 序列化,或使用 H5 序列化作为替代。与此同时,TensorFlow 官方有望在 2.6.0 版本中修复该漏洞,届时,也早期版本如 2.5.1、2.4.3 和 2.3.4 也会进行修复。
最后值得注意的是,TensorFlow 并不是第一个或唯一一个使用 YAML 的unsafe_load 的项目,该函数在 GitHub 的 Python 项目中相当普遍,对此,一些开发者建议道,这些项目应及时解决这个问题,使用这些项目的开发人员也应注意安全。
参考:https://www.bleepingcomputer.com/news/security/googles-tensorflow-drops-yaml-support-due-to-code-execution-flaw/
以上是关于TensorFlow 删除 YAML 支持,建议 JSON 作为替补方案!的主要内容,如果未能解决你的问题,请参考以下文章
AppEngine文档建议使用命令行标志而不是app.yaml文件元素