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.
Из выявленных 749 тысяч проблем 442 тысячи (41%) помечены как незначительные, 227 тысяч (30%) как проблемы умеренной опасности и 80 тысяч (11%) как опасные. Некоторые пакеты выбиваются из общей массы и содержат тысячи проблем: например, в пакете PyGGI выявлено 2589 проблем, в основном связанных с применением конструкции «try-except-pass», в пакете appengine-sdk найдено 2356 проблем. Большое число проблем также присутствует в пакетах genie.libs.ops, pbcore и 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
