46% pakietów Pythona w repozytorium PyPI zawiera potencjalnie niebezpieczny kod

Grupa badaczy z Uniwersytetu w Turku (Finlandia) opublikowała wyniki analizy pakietów znajdujących się w repozytorium PyPI pod kątem wykorzystania potencjalnie niebezpiecznych konstrukcji, które mogą prowadzić do luk. Podczas analizy 197 tys. pakietów zidentyfikowano 749 tys. potencjalnych problemów bezpieczeństwa. 46% pakietów ma przynajmniej jeden taki problem. Do najczęstszych problemów należą niedociągnięcia związane z obsługą wyjątków i wykorzystaniem funkcji umożliwiających podstawianie kodu.

Spośród 749 tysięcy zidentyfikowanych problemów 442 tysiące (41%) oznaczono jako drobne, 227 tysięcy (30%) jako umiarkowane, a 80 tysięcy (11%) jako niebezpieczne. Niektóre pakiety wyróżniają się na tle innych i zawierają tysiące problemów: na przykład pakiet PyGGI zidentyfikował 2589 problemów, związanych głównie z użyciem konstrukcji „try-except-pass”, a pakiet appengine-sdk znalazł 2356 problemów. Duża liczba problemów występuje także w pakietach genie.libs.ops, pbcore i genie.libs.parser.

Należy zaznaczyć, że wyniki uzyskano w oparciu o zautomatyzowaną analizę statyczną, która nie uwzględnia kontekstu zastosowania określonych konstrukcji. Twórca pakietu bandit Toolkit, który został użyty do skanowania kodu, wyraził opinię, że ze względu na dość dużą liczbę fałszywych alarmów, wyników skanowania nie można bezpośrednio uznać za luki bez dodatkowego ręcznego sprawdzenia każdego problemu.

Przykładowo analizator uznaje użycie zawodnych generatorów liczb losowych i algorytmów mieszających, takich jak MD5, za problem bezpieczeństwa, podczas gdy w kodzie takie algorytmy mogą zostać wykorzystane do celów niemających wpływu na bezpieczeństwo. Analizator uznaje również za problem jakiekolwiek przetwarzanie danych zewnętrznych w niebezpiecznych funkcjach, takich jak pickle, yaml.load, subprocess i eval, ale takie użycie niekoniecznie wiąże się z podatnością i w rzeczywistości użycie tych funkcji może zostać zaimplementowane bez zagrożenia bezpieczeństwa .

Wśród testów wykorzystanych w badaniu:

  • Używanie potencjalnie niebezpiecznych funkcji exec, mktemp, eval, mark_safe itp.
  • Niebezpieczne ustawienie praw dostępu do plików.
  • Dołączenie gniazda sieciowego do wszystkich interfejsów sieciowych.
  • Stosowanie haseł i kluczy ściśle określonych w kodzie.
  • Korzystanie z predefiniowanego katalogu tymczasowego.
  • Używanie funkcji przekazywania i kontynuowania w procedurach obsługi wyjątków typu catch-all;
  • Uruchamianie aplikacji internetowych opartych na frameworku internetowym Flask z włączonym trybem debugowania.
  • Stosowanie niebezpiecznych metod deserializacji danych.
  • Używa funkcji skrótu MD2, MD4, MD5 i SHA1.
  • Stosowanie niepewnych szyfrów DES i trybów szyfrowania.
  • Użycie niezabezpieczonej implementacji HTTPSConnection w niektórych wersjach Pythona.
  • Określanie schematu file:// w urlopen.
  • Korzystanie z generatorów liczb pseudolosowych podczas wykonywania zadań kryptograficznych.
  • Korzystanie z protokołu Telnet.
  • Używanie niezabezpieczonych parserów XML.

Dodatkowo można zauważyć, że w katalogu PyPI wykryto 8 szkodliwych pakietów. Przed usunięciem problematyczne pakiety zostały pobrane ponad 30 tysięcy razy. Aby ukryć złośliwą aktywność i ominąć ostrzeżenia przed prostymi analizatorami statycznymi w pakietach, bloki kodu zostały zakodowane przy użyciu Base64 i wykonane po zdekodowaniu za pomocą wywołania eval.

Pakiety Noblesse, genesisbot, are, cierpią, Noblesse2 i Noblessev2 zawierają kod umożliwiający przechwytywanie numerów kart kredytowych i haseł przechowywanych w przeglądarkach Chrome i Edge, a także przesyłanie tokenów kont z aplikacji Discord i wysyłanie danych systemowych, w tym zrzutów ekranu zawartości ekranu. Pakiety pytagora i pytagora2 zawierały możliwość ładowania i wykonywania kodu wykonywalnego stron trzecich.

Źródło: opennet.ru

Dodaj komentarz