scikit-learn (sklearn) w wersjach do 0.23.0 włącznie jest podatne na wykonanie dowolnych poleceń systemowych poprzez deserializację niezaufanych danych w funkcji joblib.load(). Podatność ma krytyczną ocenę CVSS 9.8 i może być wykorzystana zdalnie bez uwierzytelnienia.
▸ Pokaż oryginał (EN)
scikit-learn (aka sklearn) through 0.23.0 can unserialize and execute commands from an untrusted file that is passed to the joblib.load() function, if __reduce__ makes an os.system call. NOTE: third parties dispute this issue because the joblib.load() function is documented as unsafe and it is the user's responsibility to use the function in a secure manner
Funkcja joblib.load() deserializuje obiekty Python z pliku, co umożliwia wykonanie kodu zdefiniowanego w metodzie __reduce__ deserializowanego obiektu. Jeśli atakujący dostarczy spreparowany plik (np. model ML), metoda __reduce__ może wywołać os.system() z dowolnym poleceniem systemowym. Warto zaznaczyć, że dokumentacja scikit-learn explicite ostrzega przed ładowaniem plików z niezaufanych źródeł — część społeczności traktuje to jako błąd użytkownika, a nie samego oprogramowania.
Atakujący, który skłoni aplikację do załadowania spreparowanego pliku, może wykonać dowolne polecenia systemu operacyjnego z uprawnieniami procesu uruchamiającego kod, co prowadzi do pełnego przejęcia kontroli nad systemem.
Należy nigdy nie przekazywać do funkcji joblib.load() plików pochodzących z niezaufanych źródeł. Producent dokumentuje tę funkcję jako niebezpieczną przy użyciu z niezaufanymi danymi. Zaleca się weryfikację integralności plików modeli (np. sumy kontrolne, podpisy kryptograficzne) przed ich załadowaniem oraz stosowanie mechanizmów izolacji (sandbox) dla procesów ładujących modele. Należy zastosować patche dostępne u producenta zgodnie z referencjami.
scikit-learn (sklearn) w wersjach do 0.23.0 włącznie — wszystkie aplikacje i pipeline'y ML, które przekazują do funkcji joblib.load() pliki pochodzące z niezaufanych lub niekontrolowanych źródeł.
Istnieje spór co do zasadności tej podatności — producent oraz część społeczności wskazuje, że funkcja joblib.load() jest jawnie udokumentowana jako niebezpieczna przy użyciu z niezaufanymi plikami i odpowiedzialność za bezpieczne jej stosowanie spoczywa na użytkowniku. Dowód koncepcji (PoC) został opublikowany przez użytkownika 0FuzzingQ na GitHub.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HScikit Learn
APPScikit-Learn≤ 0.23.0