最近在开发时查询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__,遵守社区规范。

参考文献:

  1. https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation
  2. https://xz.aliyun.com/t/7923
  3. https://nvd.nist.gov/vuln/detail/CVE-2017-18342