TensorFlow是谷歌开发的基于Python的机器学习和人工智能项目。为修复一个代码执行安全漏洞,TensorFlow决定不再支持YAML。YAML(Yet Another Markup Language)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括C语言、Python、Perl,并从XML、电子邮件的数据格式。
CVE-2021-37678:TensorFlow不可信反序列化漏洞
安全研究人员Arjun Shibu在TensorFlow和Keras中发现了一个安全漏洞——CVE-2021-37678。该漏洞是由于不安全处理YAML引发的不可信反序列化漏洞,攻击者利用该漏洞可以在应用反序列化YAML格式中的Keras模型时执行任意代码。该YAML反序列化漏洞CVSS 评分为9.3分。反序列化漏洞主要发生于应用从不可信的源读取伪造的或恶意数据的情况。应用在读取和反序列化数据后,可能会引发DoS攻击条件甚至执行攻击者的任意代码。
漏洞来源于TensorFlow的yaml.unsafe_load()函数:
TensorFlow中有漏洞的yaml.unsafe_load()函数调用
unsafe_load函数的作用是反序列化YAML数据,该函数会解析所有的标签,包括来自不安全或不可信的输入。理想情况下,unsafe_load函数只有在输入来源于可信源时被调用。但攻击者利用通过在已经序列化的YAML数据中注入恶意payload来利用该机制执行代码。
该漏洞的PoC利用代码如下所示:
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
该漏洞提交后,TensorFlow决定启用YAML支持,并使用JSON反序列化。
但TensorFlow并不是唯一使用YAML unsafe_load的项目,该函数被广泛应用于Python项目中。GitHub显示有上千个引用该函数的搜索结果,目前已经有开发者提出了解决方案:
GitHub上使用unsafe_load的检索结果
目前,TensorFlow也已发布了该漏洞的补丁,受影响的版本和修复版本如下所示:
本文翻译自:https://www.bleepingcomputer.com/news/security/googles-tensorflow-drops-yaml-support-due-to-code-execution-flaw/如若转载,请注明原文地址