FreeBSD VuXML: Documenting security issues in FreeBSD and the FreeBSD Ports Collection

py-yaml -- FullLoader (still) exploitable for arbitrary command execution

Affected packages
py27-yaml < 5.3.1
py35-yaml < 5.3.1
py36-yaml < 5.3.1
py37-yaml < 5.3.1
py38-yaml < 5.3.1

Details

VuXML ID aae8fecf-888e-11ea-9714-08002718de91
Discovery 2020-03-02
Entry 2020-04-27
Modified 2020-04-29

Riccardo Schirone (https://github.com/ret2libc) reports:

In FullLoader python/object/new constructor, implemented by construct_python_object_apply, has support for setting the state of a deserialized instance through the set_python_instance_state method. After setting the state, some operations are performed on the instance to complete its initialization, however it is possible for an attacker to set the instance' state in such a way that arbitrary code is executed by the FullLoader.

This patch tries to block such attacks in FullLoader by preventing set_python_instance_state from setting arbitrar properties. It implements a blacklist that includes extend method (called by construct_python_object_apply) and all special methods (e.g. __set__, __setitem__, etc.).

Users who need special attributes being set in the state of a deserialized object can still do it through the UnsafeLoader, which however should not be used on untrusted input. Additionally, they can subclass FullLoader and redefine state_blacklist_regexp to include the additional attributes they need, passing the subclassed loader to yaml.load.

References

CVE Name CVE-2020-1747
FreeBSD PR ports/245937
URL https://bugzilla.redhat.com/show_bug.cgi?id=1807367
URL https://github.com/yaml/pyyaml/pull/386