Jak w łatwy sposób zainfekować 17 000 komputerów programistów

dodał 9 czerwca 2016 o 10:34 w kategorii Włamania  z tagami:
Jak w łatwy sposób zainfekować 17 000 komputerów programistów

Programiści, robicie literówki? Jeśli tak, to możecie paść ofiarą banalnego i niezwykle skutecznego ataku na Wasze komputery. W ciągu trzech miesięcy zainfekowano w taki sposób ponad 17 tysięcy komputerów, w tym 170 w Polsce.

Nikolai Tschacher, student z Hamburga, w ramach swojej pracy dyplomowej wymyślił sprytny sposób infekowania komputerów programistów. Oparł go na literówkach popełnianych w trakcie próby instalacji pakietów.

Literówki, wszędzie litrówki

Od wielu lat znane są ataki polegające na rejestrowaniu domen z literówką w nazwie. Ktoś wpisuje adres swojej ulubionej strony, popełnia błąd i ląduje na zupełnie innej witrynie. Nikolai wymyślił jednak inny sposób wykorzystania literówek, wycelowany w programistów. Jak namówić programistę do zainstalowania złośliwego oprogramowania? Nie trzeba go namawiać, sam je zainstaluje. Np. zamiast

sudo pip install requests

może przecież wpisać

sudo pip install reqeusts

Na tym pomyśle Nikolai oparł swoją pracę dyplomową. Wybrał trzy repozytoria pakietów: pypi.python.org (Python), rubygems.org (Ruby) oraz npmjs.com (Node.js). Do każdego z nich pakiety może wgrywać każdy kto na taki pomysł wpadnie. Nikolai wygenerował ok. 200 pakietów, których nazwy oparł na popularnych pakietach z lekka modyfikacją. Wykorzystał

  • błędy gramatyczne / słownikowe (np. coffe zamiast coffee)
  • nazwy pakietów które są instalowane w standardowym zestawie i nie ma ich w wyżej wymienionych repozytoriach
  • błędy wynikające z rozkładu klawiatury (np. 7 zamiast u).

Oczywiście umieszczenie pakietu w repozytorium a następnie jego zainstalowanie przez ofiarę nie wystarcza – trzeba jeszcze zmusić komputer ofiary do uruchomienia złośliwego kodu zawartego w fałszywym pakiecie. Okazało się to dość proste w przypadku Pythona, trochę trudniejsze dla Node.js i możliwe w Ruby dzięki kilku sztuczkom. Po szczegóły odsyłamy do wpisu autora eksperymentu.

Życie programisty

Życie programisty

17 tysięcy ofiar

Sukces eksperymentu musiał chyba zaskoczyć jego samego. W fałszywych pakietach Nikolai umieścił proste programy które łączyły się z jego serwerem i przesyłały do niego adres IP ofiary, informacje o jej systemie operacyjnym a także uprawnieniach użytkownika. Program wyświetlał także komunikat informujący o błędzie popełnionym przez użytkownika i celu prowadzonego badania. W ciągu kilku miesięcy trwania eksperymentu Nikolai zarejestrował połączenia z 17 289 unikatowych adresów IP. 15 221 połączeń wygenerował Python, 1631 Ruby a 525 Node.js. W ponad 40% przypadków kod wykonywany był z uprawnieniami administratora. Prawie połowa połączeń pochodziła z komputerów pracujących pod kontrolą Linuksa, trochę mniej Windowsa a na trzecim miejscu uplasował się OS X.

Najpopularniejszy pakiet urllib2 został zainstalowany prawie 4 tysiące razy w ciągu zaledwie dwóch tygodni. Z 17 tysięcy adresów IP do nazwy domenowej udało się rozwiązać ponad 11 tysięcy, wśród których trafiły się domeny .GOV, .MIL a także 170 adresów z domeny .PL. Co ciekawe, Nikolai pobrał także historię wykonywanych poleceń z prawie półtora tysiąca komputerów (co wydaje się nam już poważną ingerencją w prywatność użytkowników jaka nie przystoi naukowcowi). Na tej podstawie zidentyfikował kolejne warianty literówek które można wykorzystać w następnych atakach.

Jak zapobiegać?

Jak wiadomo programiści nie przestaną robić literówek, dlatego trzeba znaleźć inne sposoby eliminacji lub ograniczenia tego rodzaju ataków. jednym z pomysłów jest wyeliminowanie możliwości uruchomienia kodu w momencie instalacji pakietu. Inną opcją jest zablokowanie możliwości rejestracji pakietów o nazwach zgodnych z najczęściej popełnianymi błędami (chociażby na podstawie analizy błędów serwera z pakietami).  Dopóki takie zmiany nie zostaną wprowadzone programistom polecamy szczególnie uważać w trakcie instalacji.