由谷歌提供的开源机器学习和人工智能项目TensorFlow目前已经放弃为YAML提供支持,放弃原因是继续支持YAML可能存在安全问题。在最新版中谷歌移除YAML支持以解决不受信任的反序列化漏洞执行问题,此漏洞编号为CVE-2021-37678严重性等级为高危,评分达到9.3分,由研究人员Arjun Shibu提交给谷歌的。
YAML是个可读性更高用来表达数据序列化的格式,研究人员发现TensorFlow代码中加载 yaml.unsafe_load() 函数,利用缺陷攻击者能够在应用程序反序列化以YAML格式提供的Keras模型时执行任意代码,当应用程序读取来自不真实来源的格式错误或恶意数据时通常就会发生反序列化漏洞。
而TensorFlow中的反序列化漏洞可能会导致DoS拒绝服务供给,更糟糕的时利用此漏洞甚至可以执行任意代码,这也是这枚漏洞的评分达到9.3分(满分10分)的原因。为此谷歌已经将TensorFlow以及Keras项目的YAML解析给停掉,以此解决潜在的安全问题。
unsafe_load函数可以相当自由地反序列化YAML数据,可解析所有标签即使是那些已知的不受信任的标签。理想状态下unsafe_load应该只在来自可信来源且没有任何恶意内容的输入上调用,但攻击者也可以利用反序列化机制通过在尚未序列化的YAML数据中注入恶意负载来执行攻击者想要执行的代码。
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的使用全面转向JSON反序列化。维护者表示:鉴于YAML格式支持需要大量工作,因此我们决定将其删除。这名维护者还举例YAML引起的其他漏洞和修复案例。维护者建议开发者们使用JSON反序列化而不是YAML,或者更好的替代方案H5序列化。
值得注意的是TensorFlow并非唯一一个使用YAML unsafe_load函数的项目,在Github上检索可以发现大量Python项目使用这个不安全的函数。鉴于潜在安全问题这些项目都应该及时解决此问题,而对使用这些项目的开发者来说也应该注意安全。
另外TensorFlow预计将在2.6.0版中解决漏洞也就是移除YAML支持,此前版本中2.5.1、2.4.3、2.3.4版也将获得修复,请使用此项目的开发者们及时升级最新版本。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/142707.html