Yaml python kütüphaneleri, yalnızca ham verileri değil, aynı zamanda python nesnelerini serileştirme yeteneğine de sahiptir:
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
tuple'ın ham bir veri türü olmadığını ve bu nedenle serileştirildiğini kontrol edin. Aynı şey range için de geçerlidir (builtins'ten alınmıştır).
safe_load() veya safe_load_all() SafeLoader kullanır ve sınıf nesnesi serileştirmesini desteklemez. Sınıf nesnesi serileştirme örneği:
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
Önceki kod, serileştirilmiş python sınıfını yüklemek için unsafe_load kullandı. Bunun nedeni, sürüm >= 5.1'de, load() içinde Loader belirtilmediğinde veya Loader=SafeLoader olduğunda, herhangi bir serileştirilmiş python sınıfını veya sınıf niteliğini deseralize etmeye izin vermemesidir.
Not edin ki son sürümlerde.load()artık bir Loader olmadançağrılamaz ve FullLoader bu saldırıya artık savunmasız değildir.
RCE
Özel yükler, PyYAML veya ruamel.yaml gibi Python YAML modülleri kullanılarak oluşturulabilir. Bu yükler, güvenilir olmayan girişi uygun bir şekilde temizlemeden deseralize eden sistemlerdeki zayıflıkları istismar edebilir.