最近在开发时查询Python YAML库的文档[1],发现了CVE-2017-18342[3],评分9.8,不错。
pip3 install PyYAML==4.2b4 -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn
在使用了小于5.1的PyYAML库的应用中,只要yaml.load()
及等效函数存在且参数可控,就可以被利用。例如:
python3 -c 'import yaml; yaml.load("!!python/object/new:os.system [uname -a]")'
其中payload为:
"!!python/object/new:os.system [uname -a]"
高于5.1版本的库默认不存在此漏洞,除非指定了UnsafeLoader
,见文献[2]。我在开发时则使用了:
yaml.load(f, Loader=yaml.SafeLoader)
顺便说一句,如何查看库版本呢?查看模块的__version__
属性即可,这个对于大多数流行第三方库都是适用的:
>>> requests.__version__
'2.24.0'
>>> yaml.__version__
'5.3.1'
>>> json.__version__
'2.0.9'
反过来说,自己在开发模块时也考虑给出__verions__
,遵守社区规范。
参考文献: