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/