YAML出现严重的反序列化漏洞,谷歌TensorFlow将采用 JSON
编译:代码卫士
YAML (Yet Another Markup Language) 是开发人员使用的人类可读数据序列化语言,用于处理配置文件和传输中的数据。
TensorFlow 和 TensorFlow 的封装项目 Keras 的维护人员修复了因 YAML 解析不安全而引发的不可信序列化漏洞。该漏洞的编号为 CVE-2021-37678,为严重漏洞,可使攻击者在应用程序反序列化 YAML 格式下的 Keras 模型时执行任意代码。
一般而言,当应用程序从未认证来源读取畸形或恶意数据时就会触发反序列化漏洞。应用程序读取并反序列化数据后,它可能崩溃,从而导致拒绝服务条件或在更糟糕的情况下执行攻击者的任意代码。
该 YAML 反序列化漏洞的评分为9.3,由安全研究员 Arjun Shibu 报告给 TensorFlow 的维护人员。
而该漏洞的源头在于 TensorFlow 代码中的 “yaml.unsafe_load()” 函数。
该函数很随意地反序列化 YAML 数据,它会解析所有的标记,甚至会解析已知的不安全的不受信任输入。也就是说,在理想情况下 “unsafe_load” 应当仅被来自不可信来源的输入调用,而且应当不含任何恶意内容。否则,攻击者可利用该反序列化机制,通过在尚未被序列化的 YAML 数据中注入恶意 payload 的方式执行所选代码。
安全公告分享了此类 PoC exploit:
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 格式支持要求大量工作,因此我们暂时将其删除。我们已取代 `Model.to_yaml()` 和 `keras.models.model_from_yaml` 方法,触发 “RuntimeError”,因为它们可被滥用于引发任意代码执行。建议使用JSON 反序列化,或者更好的选择是序列化至 H5。“
值得注意的是,TensorFlow 并非第一个也非唯一一个使用 YAML unsafe_load 函数的项目。该函数在 Python 项目中的使用非常普遍。
GitHub 搜索结果显示有数千个项目使用该函数,其中有些开发人员提议进行改进。
该漏洞的修复方案将在 TensorFlow 版本2.6.0中现身,同时将被反向兼容至之前版本 2.5.1、2.4.3以及2.3.4。
@whyseu @。@HFwuhome@惊蛰 @nimo @XuZ @淡然 @Marco韬 @王孟 @Wecat@nwnλ @MOBE @湘北二两西香葱@※ @搬砖小土妞@云烟过眼 @r00t@小风 @傲雪@最好走的路是套路 @Zhao.xiaojun @浅笑淡然 @X-Star @Erick2013 @小秦同学 @X @王骏 @欢寻 @nbp@Mr. Guo
如下是本书相关讲解:
APACHE OFBIZ XML-RPC 反序列化漏洞 (CVE-2020-9496) 的复现与分析
XStream 反序列化漏洞 (CVE-2020-26258 & 26259) 的复现与分析
Apache Commons Collections反序列化漏洞分析与复现
https://www.bleepingcomputer.com/news/security/googles-tensorflow-drops-yaml-support-due-to-code-execution-flaw/
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。