Grupa badaczy z Uniwersytetu w Turku (Finlandia) opublikowała wyniki analizy pakietów w repozytorium PyPI pod kątem użycia potencjalnie niebezpiecznych konstrukcji, które mogą prowadzić do pojawienia się luk w zabezpieczeniach. W trakcie analizy 197 tysięcy pakietów zidentyfikowano 749 tysięcy potencjalnych problemów z bezpieczeństwem. W 46% pakietów występuje przynajmniej jeden taki problem. Najczęściej występujące problemy to niedociągnięcia związane z obsługą wyjątków oraz używaniem mechanizmów, które dopuszczają podstawianie kodu.
Spośród 749 tysięcy zidentyfikowanych problemów, 442 tysiące (41%) oznaczono jako niewielkie, 227 tysięcy (30%) jako problemy o umiarkowanym ryzyku i 80 tysięcy (11%) jako niebezpieczne. Niektóre pakiety wyróżniają się na tle innych i zawierają tysiące problemów: na przykład w pakiecie PyGGI zidentyfikowano 2589 problemów, głównie związanych z używaniem konstrukcji "try-except-pass", w pakiecie appengine-sdk znaleziono 2356 problemów. Wiele problemów występuje również w pakietach genie.libs.ops, pbcore i genie.libs.parser.
Należy zauważyć, że wyniki uzyskano na podstawie przeprowadzenia zautomatyzowanej analizy statycznej, która nie uwzględnia kontekstu użycia danej konstrukcji. Programista narzędzia bandit, które wykorzystano do skanowania kodu, wyraził opinię, że z powodu dość wysokiej liczby fałszywych alarmów, wyniki kontroli nie mogą być bezpośrednio uznawane za luki w zabezpieczeniach bez dodatkowego ręcznego przeglądania każdego problemu.
Na przykład, analizator uważa za problem bezpieczeństwa stosowanie niepewnych generatorów liczb losowych oraz algorytmów haszujących, takich jak MD5, podczas gdy w kodzie podobne algorytmy mogą być używane do celów nie mających wpływu na bezpieczeństwo. Analizator również uznaje za problem jakąkolwiek obsługę danych zewnętrznych w niebezpiecznych funkcjach, takich jak pickle, yaml.load, subprocess i eval, jednak takie użycie niekoniecznie musi wiązać się z pojawieniem się luki i w rzeczywistości zastosowanie tych funkcji może być zrealizowane bez zagrożenia dla bezpieczeństwa.
Wśród kontroli wykorzystanych w badaniu:
- Użycie potencjalnie niebezpiecznych funkcji exec, mktemp, eval, mark_safe itp.
- Niebezpieczne ustalanie praw dostępu do plików.
- Podłączenie gniazda sieciowego do wszystkich interfejsów sieciowych.
- Użycie twardo zakodowanych haseł i kluczy.
- Użycie zdefiniowanego z góry katalogu tymczasowego.
- Użycie pass i continue w obsługiwaniu wyjątków w stylu catch-all;
- Uruchamianie aplikacji webowych opartych na frameworku Flask z włączonym trybem debugowania.
- Użycie niebezpiecznych metod deserializacji danych.
- Użycie funkcji haszujących MD2, MD4, MD5 i SHA1.
- Użycie niebezpiecznych algorytmów szyfrowania DES i trybów szyfrowania.
- Użycie niebezpiecznej implementacji HTTPSConnection w niektórych wersjach Pythona.
- Określenie schematu file:// w urlopen.
- Użycie generatorów liczb pseudolosowych do realizacji zadań kryptograficznych.
- Użycie protokołu Telnet.
- Użycie niebezpiecznych parserów XML.
Dodatkowo można zauważyć, że w katalogu PyPI odkryto 8 złośliwych pakietów. Przed usunięciem problematyczne pakiety zostały pobrane ponad 30 tysięcy razy. W celu ukrycia złośliwej aktywności oraz ominięcia ostrzeżeń prostych analizatorów statycznych w pakietach zastosowano kodowanie bloków kodu przy użyciu Base64 oraz zorganizowano ich wykonanie po dekodowaniu poprzez wywołanie eval.
W pakietach noblesse, genesisbot, are, suffer, noblesse2 i noblessev2 zidentyfikowano kod do przechwytywania numerów kart kredytowych oraz haseł zapisanych w przeglądarkach Chrome i Edge, a także do przesyłania tokenów kont z aplikacji Discord oraz wysyłania danych o systemie, w tym zrzutów ekranu. W pakietach pytagora i pytagora2 istniała możliwość pobierania i wykonywania zewnętrznego kodu wykonywalnego.
Źródło: opennet.ru
