Tylna furtka odkryta w bardzo popularnej bibliotece JS kradła BTC

dodał 27 listopada 2018 o 07:00 w kategorii Wpadki  z tagami:
Tylna furtka odkryta w bardzo popularnej bibliotece JS kradła BTC

Biblioteka pobierana dwa miliony razy w tygodniu dostała tylną furtkę umożliwiającą kradzieże bitcoinów. A cały proces infekcji polegał na tym, że ktoś kogoś poprosił o przejęcie nad nią kontroli. Witajcie w świecie darmowego oprogramowania.

Wczoraj wieczorem wybuchła bomba – okazało się, że bardzo popularna biblioteka Node.js EventStream korzystała z kodu, który korzystał z kodu, który był złośliwy – i do tego zaszyfrowany. Ta sytuacja trwała od tygodni i nikt się nie zorientował.

Jakim cudem

Jak zainfekować bibliotekę pobieraną dwa miliony razy tygodniowo? Wystarczy poprosić. Tak niestety wygląda smutna rzeczywistość programistów, którzy kiedyś coś stworzyli, nie chcieli na tym zarabiać, a teraz zostali z bagażem obowiązku wspierania swojego dzieła, z którego korzystają miliony. Ale o tym za moment – najpierw spójrzmy, co się stało.

Krótkie wyjaśnienie – Node.js to bardzo, ale to bardzo popularne środowisko uruchomieniowe pomagające szybko i skutecznie budować aplikacje WWW. Używa managera pakietów npm, który z kolei korzysta z ogromnego repozytorium kodu. Prawie każdy pomysł, jaki możecie mieć, ktoś już miał i oprogramował. Zamiast zatem pisać dużo swojego kodu, można użyć już gotowego. Wygodne. Ale niestety nie zawsze bezpieczne. Sześć dni temu jeden z użytkowników popularnego pakietu EventStream zgłosił problem. Dodany do EventStream moduł flatmap-stream zawierał złośliwy kod o nieznanym wówczas jeszcze przeznaczeniu. Skąd się wziął złośliwy moduł?

Twórca pakietu EventStream otrzymał ofertę pomocy w utrzymywaniu pakietu i z niej skorzystał. Nie znał osoby, której przekazał prawa modyfikacji – ale nie widział w tym problemu. Nowy deweloper wprowadzał drobne zmiany. Najpier 8 września dodał do kodu inny moduł, flatmap-stream. Moduł ten nie robił nic złego, był niewinny jak świeżo narodzone niemowlę. Dopiero 5 października do flatmap-stream dodano złośliwy kod, który automatycznie stał się też częścią popularnego EventStream. Sprytne.

Co robił złośliwy kod

Pierwsze analizy kodu wskazywały jedynie, że robi coś niedobrego – lecz nikt nie wiedział co, ponieważ kluczowy fragment kodu był zaszyfrowany algorytmem AES, a kluczem była… nazwa innego, nieznanego pakietu. Odszyfrować docelowy kod można było, dopiero gdy w aplikacji znajdował się moduł będący celem ataku. Bardzo mądra technika, utrudniająca analizę i zapewniająca, że nie będzie przypadkowych ofiar. Udało się jednak ustalić, że celem ataku była aplikacja Copay – „bezpieczny” portfel BTC.

Jeśli używaliście portfeli Copay w wersji od 5.0.2 do 5.1.0 i macie jeszcze swoje bitcoiny, to przenieście je szybko do innego portfela. Możecie skorzystać z wersji podobno już bezpiecznej, czyli 5.2.0 lub innego rozwiązania. Celem złośliwego kodu była kradzież kluczy prywatnych portfeli BTC. Na razie nie wiemy, czy cel został osiągnięty – ale warunki ku temu bez wątpienia istniały.

Z technicznego punktu widzenia złośliwy kod sprawdza, czy został uruchomiony we właściwej aplikacji, a następnie przeszukuje wszystkie portfele BTC i BCH. Szuka tych, w których saldo BTC > 100 lub saldo BCH > 1000 i wysyła ich klucze prywatne oraz hasła do serwera w Kuala Lumpur. Tu znajdziecie sam kod, a historię dobrze podsumowuje thegrugq:

Co począć z tym problemem

Początkowo część społeczności obwiniała głównego dewelopera EventStream za to, że oddał kontrolę nad pakietem przypadkowej osobie. On sam jednak odpowiadał bardzo sensownie – pakiet stworzył, ponieważ dawało mu to radość, lecz potem radość się skończyła, a została ciężka praca nad utrzymywaniem modułu. Bezpłatna praca – warto zauważyć. Nic więc dziwnego, że gdy pojawiła się oferta pomocy, chętnie z niej skorzystał. Trudno stawiać mu jakiekolwiek zarzuty – społeczność open source nie wypracowała skutecznego i bezpiecznego modelu przejmowania odpowiedzialności za porzucone elementy kodu, z których korzystają miliony użytkowników na całym świecie. Dobrym zwyczajem jest udział w rozwijaniu kodu, którego się używa, ale o ileż prościej jest po prostu zaimportować bibliotekę wobec konieczności rozwiązania zgłoszonych do niej ticketów. Problem jest i nigdzie się nie wybiera – opisany powyżej incydent jest tylko jednym z przykładów skutków tej sytuacji. Bez wątpienia będzie tego więcej.

Piszę w Node.js, co mam zrobić?

Po pierwsze sprawdź, czy Twoja aplikacja zawiera złośliwy moduł:

$ npm ls event-stream flatmap-stream
...
[email protected]
...

Jeśli widzisz taką odpowiedź, to musisz zaktualizować do [email protected]. To powinno usunąć problem – na dzisiaj. Po drugie… nie ma dobrej rekomendacji. Bo kto sprawdzi wszystkie moduły?