9:41
4/11/2022

Przestępcy próbują zainfekować komputery programistów trojanem W4SP Stealer. Jego ślady znaleziono w kilkunastu paczkach PyPI.

Złośliwe i ukryte instrukcje import

Wstrzykiwanie złośliwego kodu w mniejsze (i mniej znane) biblioteki, ale takie, które wykorzystywane są jako zależności do innych programach to znana technika, tzw. supply chain attack. Okazuje się, że od połowy października ktoś regularnie próbuje w ten sposób zainfekować programistów Pythona.

Jak informuje firma Phylum, ktoś sklonował różne biblioteki i dodał do nich złośliwą instrukcję __import__. Same biblioteki udostępniał też pod lekko zmienionymi nazwami.

Importy zostały wstrzyknięte w pliki setup.py lub __init__.py. Ale co ciekawe, niektóre z nich zostały dodane po sporej liczbie spacji, aby na pierwszy rzut oka nie były tak łatwo zauważalne:

Inną techniką wykorzystywaną przez atakujących było dodawanie “pip install” do plików setup.py.

Payload po deobfuskacji zawierał następujące żądanie:

hxxp://wasp.plague[.]fun/inject/Fu643XzaSbmCcnGN

To tylko jeden z przykładowych URL-i. Ale mimo wszystko warto sprawdzić logi wyjściowe z waszej sieci i środowisk programistycznych do tego adresu.
Co jeszcze warto zrobić? Sprawdźcie, czy od 12 października nie pobraliście i nie skorzystaliście z podmienionej, złośliwej wersji tych bibliotek:

typesutil
typestring
sutiltype
duonet
fatnoob
strinfer
pydprotect
incrivelsim
twyne
pyptext
installpy
faq
colorwin
requests-httpx
colorsama
shaasigma
stringe
felpesviadinho
cypress
pystyte
pyslyte
pystyle
pyurllib
algorithmic
oiu
iao
curlapi
type-color
pyhints

Supply chain attack to tylko jeden z przykładów ataków, które mogą być bolesne dla programistów. Inne bazują wprost na błędach w kodzie tworzonych aplikacji. Dlatego warto wiedzieć, jakich błędów nie popełniać i jakimi technikami/narzędziami takie błędy w porę wychwytywać. To pokazujemy na naszym szkoleniu z Atakowanie i Ochrony Webaplikacji na które Was zapraszamy. Oto lista najbliższych terminów:

Warszawa: 08-09 grudnia 2022r. — UWAGA: zostało tylko 1 wolne miejsce
Ostatnio ktoś zarejestrował się 29 listopada 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 30 listopada)
    2599 PLN netto (od 1 listopada)

Wrocław: 15-16 grudnia 2022r. — UWAGA: zostały tylko 4 wolne miejsca
Ostatnio ktoś zarejestrował się 01 grudnia 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 7 grudnia)
    2599 PLN netto (od 8 grudnia)

Kraków: 10-11 stycznia 2023r. — zostało 9 wolnych miejsc
Ostatnio ktoś zarejestrował się 28 listopada 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 9 grudnia)
    2599 PLN netto (od 10 grudnia)

ZDALNIE: 26-27 stycznia 2023r. — zostało 9 wolnych miejsc
Ostatnio ktoś zarejestrował się 01 grudnia 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 9 grudnia)
    2599 PLN netto (od 10 grudnia)

Warszawa: 07-08 lutego 2023r. — zostało 9 wolnych miejsc
Ostatnio ktoś zarejestrował się 01 grudnia 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 9 grudnia)
    2599 PLN netto (od 10 grudnia)

ZDALNIE: 01-02 kwietnia 2023r. — zostało 8 wolnych miejsc
Ostatnio ktoś zarejestrował się 01 grudnia 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 9 grudnia)
    2599 PLN netto (od 10 grudnia)

Poznań: 14-15 czerwca 2023r. — zostało 8 wolnych miejsc
Ostatnio ktoś zarejestrował się 25 listopada 2022r. → zarejestruj się na to szkolenie

    2299 PLN netto (do 2 grudnia)
    2599 PLN netto (od 3 grudnia)

Przeczytaj także:

21 komentarzy

Dodaj komentarz
  1. Czy nazwa biblioteki nie jest tutaj błędna “colorsama”? Nie powinna być colorama? Może literówka? Prośba o potwierdzenie
    Pozdr
    Jacek

    • W art źródłowym: “Notice that some of the packages appear to be obvious attempts at typosquatting like twyne and colorsama (which squats on twine and colorama respectively)…”

    • To chyba polowanie na literówki. Poszukałem kilku z tych paczek w pypi – już ich tam nie ma.

    • To wszystko jest polowanie na literówki i pomylone nazwy. Żadna prawdziwa libka nie została podmieniona, a jedynie zrobiono ich kopie z “poprawkami” i wstawiono z podobną nazwą. Nie wiem co jest gorsze, to że ktoś takie durne pułapki zastawia, czy to że ten tekst robi z tego sensację.

  2. Czy ktoś na prawdę przegląda kod bez aktywnej funkcji word wrap? Przecież to proszenie się o problemy, niezależnie od tego czy ktoś doda wprost złośliwy kod czy obelżywe wyrażenia w komentarzu.

    • To prawda, ja codziennie o 5.00 rano rozpoczynam dzień od przeglądania mojego node_modules. Oczywiście z włączonym world-wrap, aby nie uciekły mi żadne chamskie kawałki kodu ukryte za spacjami czy długimi komentarzami. Linijka po linijce analizuję kod paczek, które dodaje lub aktualizuje, na szczęście mój node_modules jest w repo gita, więc na lajcie mogę odpalić diffa i oszczędza mi to naprawdę dużo czasu. Około godziny 14:00 kończę przeglądanie zmian w paczkach i mogę się wziąć za normalne kodzenie, wpisując już nadgodziny. Jest to trochę męczące, nie powiem, ale szef nie chce przydzielić mi nikogo do pomocy bo mówi że to przepalanie budżetu, a dopiero co mamy napisane 3 widoki w naszej aplikacji React.js. Scrum master natomiast zrzuca na mnie odpowiedzialność że sprint niedowieziony… ja natomiast odpowiadam aby pogadał z dependecy botem bo to jego wina, nie moja.

  3. Clickbaitowy nagłówek sugeruje że to *istniejące* pakiety zostały “zainfekowane”, a tak naprawdę pojawiły się *nowe* pakiety o podobnych nazwach w środku których jest trojan.

    • Sprawa wcale nie jest błacha. Nie każdy podchodzi z taką ostrożnością, jak CombatCode. Wielokrotnie widziałem doskonałych programistów, którzy stracili czujność przez rutynę i nawał pracy. Nie machajcie ręką na sprytne i wstrętne triki, tak samo jak cenieni Specjaliści z wąskich dziedzin, którzy tłumaczą mi przynoszenie do restrykcyjnych obszarów swoje prywatne sprzęty. W naszym środowisku powinniśmy być bardziej świadomi.

  4. Dlatego zawsze lepiej trzymać się systemowego repo, bo tam raczej podrobionych bibliotek nie będzie.

    • Nie będzie też aktualnych wersji wielu bibliotek

  5. Cypress to JSowa paczka, a nie Pythonowa. Skad sie wziela na liscie?

    • Najwyraźniej była taka paczka na PyPI (już jej nie ma) i była zainfekowana. Prawdopodobnie to był główny cel istnienia tej paczki.

    • Oj… https://pypi.org/project/cypress-common/

  6. Dla szybkiego sprawdzenia:

    import subprocess
    from subprocess import Popen

    with Popen([“ifconfig”], stdout=subprocess.PIPE) as proc:
    output = proc.stdout.read().decode()

    plist = [“typesutil”,”typestring”,”sutiltype”,”duonet”,”fatnoob”,”strinfer”,”pydprotect”,”incrivelsim”,”twyne”,”pyptext”,”installpy”,”faq”,”colorwin”,”requests-httpx”,”colorsama”,”shaasigma”,”stringe”,”felpesviadinho”,”cypress”,”pystyte”,”pyslyte”,”pystyle”,”pyurllib”,”algorithmic”,”oiu”,”iao”,”curlapi”,”type-color”,”pyhints”]

    for elem in plist:
    if elem in output:
    print(f”Found installed package {elem}”)

    • Nie będę uruchamiał przypadkowych wirusów z neta.

  7. Dla szybkiego sprawdzenia:

    import subprocess
    from subprocess import Popen

    with Popen([“pip”, “list”], stdout=subprocess.PIPE) as proc:
    output = proc.stdout.read().decode()

    plist = [“typesutil”,”typestring”,”sutiltype”,”duonet”,”fatnoob”,”strinfer”,”pydprotect”,”incrivelsim”,”twyne”,”pyptext”,”install>

    for elem in plist:
    if elem in output:
    print(f”Found installed package {elem}”)

  8. Bo libsy i packagesy xDDD qrwa to sie bierze od producenta prosto z jego stajnii a nie przez manadery pakietów, zgadnijcie co siedzi w npm i composerze hahaahahah, python jako pierwszy wypłynał, ciekawe co z wtyczkami do wordpressa bedzie za akcja na grudzien / styczen 2022/2023 ja wiem co bedzie, a bedzie przejebane. takze wrogom polecam i kolegom po fachu brać jednak prosto od producenta checksumowac wszsytko i trzymać u siebie w kolekcii, bedzie mniej problemow, we hooj osob wiedzialo o tym tylko siedzialo cicho, welcome poland, ale tak to jest jak sie szcza na najebanego kodera to potem dziwne rzeczy sie dzieja, a teraz kazdy bedzie olewal, oprucz tych co sie nie przejechali lub wierza jezscze w ludzii, generalni nie wesolo

  9. A Wasp to nie była Lisbeth Salander, a Plague to ten hacker co jej pomagał? Tak się zastanawiałam, czy ktoś z komentujących to zauważył

  10. Ulala, to się porobiło. Ciekawe jako będzie to miało impakt na te aplikacje, które już stoją i czy nie położy to jakiś kolosów.

  11. W świecie Java (Java, Scala, Kotlin) mamy coś takiego jak Maven Central. Nikt nie kopiuje instrukcji pobierania paczek z innej strony niż ta. Strona własna autora biblioteki dla mnie to zawsze miejsce gdzie szukam dokumentacji i nic więcej.

    Jakbym zobaczył 2 biblioteki na identycznym na pierwszy rzut oka namespace w Maven to już wzbudziło by moje podejrzenia co do źródeł.

  12. W świecie Pythona mamy pypi.org

    Poza tym istnieją narzędzia ułatwiające weryfikację bibliotek np. Synopsis BlackDuck (nie jest specyficzne dla Pythona).

    Na poziomie firmy można wymusić pobieranie bibliotek z wewnętrznego serwera np. Nexus.

    Nie zmienia to faktu, ale o ile pierwsza porada jest łatwa do implementacji, to dwie kolejne już wymagają pracy, a czasem i pieniędzy na licencje.

Twój komentarz

Zamieszczając komentarz akceptujesz regulamin dodawania komentarzy. Przez moderację nie przejdą: wycieczki osobiste, komentarze nie na temat, wulgaryzmy.

RSS dla komentarzy: