Jak ochronić się przed złośliwymi paczkami w PyPI

Kilka sposobów na rozpoznanie niebezpiecznych paczek w Python Package Index.

Opublikowano 09.01.2023 16:11

Coraz częściej słyszymy o atakach, w których wykorzystywane są złośliwe paczki Pythona. Niebezpieczny kod jest umieszczany w pliku setup.py a następnie całość wysyłana jest do repozytorium PyPI.

Każdy programista, który zainstaluje złośliwą paczkę przy pomocy komendy pip install może zostać ofiarą tego ataku. I nie jest to takie trudne.

  1. Możesz się po prostu pomylić. Zamiast requests napisać requesys, requesrs lub requesr. Ta pomyłka mogłaby sprawić, że Twoje pliki zostałyby zaszyfrowane.
  2. Możesz nie wiedzieć jaka jest oficjalna pisownia biblioteki.
    • requests czy requests3
    • flask-sqlalchemy czy flasksqlalchemy
    • jinja czy jinja2 czy jinja3

Co robić? Kilka pomysłów poniżej.

  • Nie ufaj opisom i statystykom wyświetlanym na stronie pypi.org. Pod te statystyki można się podszyć. Wystarczy w pliku setup.cfg podać adres do repozytorium z odpowiednią ilością gwiazdek.
    To technika to Star Jacking. Jej przykład znajdziesz w paczce requests3.
    Requests to popularna biblioteka. Problem w tym, że jej prawidłowa nazwa to requests (bez 3 na końcu).
    Jeśli nie wiesz, że tak łatwo można sfałszować statystyki to możesz odnieść złudne wrażenie, że pobierasz prawidłową wersję. Tą sztuczkę wykorzystywano już w przeszłości.
    I w sumie się nie dziwię. To ewidentny przykład źle zaprojektowanego GUI.

  • Sprawdź dzienną liczbę pobrań biblioteki. Złośliwe paczki nie są pobierane zbyt często. Łatwo zweryfikujesz to na stronie PyPI Stats. Na tym wykresie doskonale widać, że fałszywa paczka jest pobierana tylko kilka razy dziennie.

  • Sprawdź liczbę historycznych wydań. Popularne projekty powstają latami i można prześledzić ich historię. Widać, że nowe wersje pojawiały się co miesiąc/rok. Jeśli paczka ma tyko 2 wersje, które na dodatek powstały w przeciągu ostatniego miesiąca - to jest to dość mocno podejrzane.

  • Zweryfikuj czy jakieś znane projekty korzystają z tej paczki. Nie oznacza to, że jest bezpieczna (bo przecież oni też mogli się dać nabrać) - ale zawsze to jakaś dodatkowa informacja. Te informacje znajdziesz na libraries.io. Na samym dole, po prawej stronie widnieje lista used by.

  • Nie pobieraj paczek przy pomocy pip download. W ten sposób też możesz uruchomić złośliwy kod. Zamiast tego pobierz plik ręcznie używając zakładki download files. Możesz teraz sprawdzić ich kod źródłowy w poszukiwaniu podejrzanych funkcji/słów kluczowych.
    • system
    • popen
    • eval
    • exec
    • powershell

#programisci