Yaml las bibliotecas de python también son capaces de serializar objetos de python y no solo datos en bruto:
print(yaml.dump(str("lol")))
lol
...
print(yaml.dump(tuple("lol")))
!!python/tuple
- l
- o
- l
print(yaml.dump(range(1,10)))
!!python/object/apply:builtins.range
- 1
- 10
- 1
Verifica cómo el tuple no es un tipo de dato bruto y, por lo tanto, fue serializado. Y lo mismo ocurrió con el range (tomado de los builtins).
safe_load() o safe_load_all() utiliza SafeLoader y no soporta la deserialización de objetos de clase. Ejemplo de deserialización de objetos de clase:
import yamlfrom yaml import UnsafeLoader, FullLoader, Loaderdata =b'!!python/object/apply:builtins.range [1, 10, 1]'print(yaml.load(data, Loader=UnsafeLoader))#range(1, 10)print(yaml.load(data, Loader=Loader))#range(1, 10)print(yaml.load_all(data))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=Loader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=UnsafeLoader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.load_all(data, Loader=FullLoader))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.unsafe_load(data))#range(1, 10)print(yaml.full_load_all(data))#<generator object load_all at 0x7fc4c6d8f040>print(yaml.unsafe_load_all(data))#<generator object load_all at 0x7fc4c6d8f040>#The other ways to load data will through an error as they won't even attempt to#deserialize the python object
El código anterior utilizó unsafe_load para cargar la clase de python serializada. Esto se debe a que en versión >= 5.1, no permite deserializar ninguna clase de python serializada o atributo de clase, sin un Loader especificado en load() o Loader=SafeLoader.
Note que en versiones recientes ya no puede llamar a .load()sin un Loader y el FullLoaderya no es vulnerable a este ataque.
RCE
Se pueden crear cargas útiles personalizadas utilizando módulos de Python YAML como PyYAML o ruamel.yaml. Estas cargas útiles pueden explotar vulnerabilidades en sistemas que deserializan entradas no confiables sin la debida sanitización.