Sporo programistów #python…

Sporo programistów #python wie, aby nie używać pickle na danych od użytkownika ponieważ podczas ich deserializacji może dojść do ataku object injection i wykonania złośliwego kodu.
Ale co z innymi formatami? Czy również są niebezpieczne?
W kolejny odcinku #od0dopentestera o plikach yaml.

import yaml
with open("test.yaml", "r") as s:
y = yaml.load(s)
print y['imie']

Format yaml nie jest tak prosty jak mogło by się wydawać.
W standardowym użyciu sam rozpoznaje on typ danych który jest do niego przekazywany.
Czasami jednak chcielibyśmy mieć kontrolę nad typem przechowywanym w konfiguracji.
Stąd też tagi – czyli polecenia rozpoczynające się od wykrzyknika, dzięki którym możemy wybrać typ samodzielnie.
Tak jak tutaj – gdzie 0.7 będzie traktowana jako string a nie jako float.

moj_string: !!str 0.7

Niektóre parsery implementują specyficzne dla danego języka tagi – i tak w przypadku pythona możemy zdefiniować tuple:

moja_tupla: !!python/tuple [1, 2]

Gdzie zatem znajduje się dzisiejszy błąd?

W parserze używanym w pythonie możemy również skorzystać z tagu apply, który pozwala na wywołanie dowolnej funkcji z dowolnego modułu.
Jest to więc równoznaczne z możliwością wykonania dowolnego kodu na atakowanym serwerze.
W naszym przypadku użyjemy funkcji system do wyświetlenia zawartości bieżącego katalogu:

imie: !!python/object/apply:os.system ["dir"]

Jak się ochronić przed tym błędem?

Zamienić funkcję load na safe_load.

#naukaprogramowania #programowanie #informatyka #it #nauka #technologia #ciekawostki #gruparatowaniapoziomu

Comments are closed.