Stosowanie bibliotek autorstwa kogoś innego jest dosyć powszechne wśród programistów — wielu z nich udostępnia światu swoje zasoby, a wykorzystywanie istniejących modułów do swoich celów to sprytne podejście. Jednak korzystanie z czyjegoś kodu wiąże się z dużą dozą zaufania. Niedawno BitPay, firma tworząca kryptoporfetl Copay, postanowiła załatać lukę i wykorzystać pracę kogoś innego, która charakteryzowała się otwartym kodem.
Copay to wieloplatformowy portfel kryptowalut Bitcoin/Bitcoin Cash, który umożliwia użytkownikom tworzenie portfeli współdzielonych. Copay jest tworzony w oparciu o język JavaScript i wykorzystuje wiele bibliotek innych firm, które mają kod otwarty.
Jedną z nich jest posiadający otwarty kod źródłowy moduł Node.js o nazwie event-stream. Jego repozytorium znajdowało się w serwisie GitHub u umożliwiającym sprawdzenie wersji, a jego programista kilka lat temu porzucił projekt. Pewnego dnia jakiś inny programista, który nie udzielał się zbytnio w serwisie GitHub, zapytał go, czy mógłby dostać uprawnienia administratora, aby zajmować się tym repozytorium. Oryginalny programista się zgodził.
Nowy programista przystąpił więc do pracy. Najpierw sprawił, aby biblioteka event stream korzystała z modułu o nazwie flatmap-stream z repozytorium GitHub należącego do tego samego programisty. Następnie osoba ta zmodyfikowała wspomniany moduł, dodając do niego szkodliwy kod. Trzy dni po aktualizacji nowy programista umieścił kolejną wersję flatmap-stream, bez szkodliwego kodu — prawdopodobnie w celu ukrycia szkodliwych działań.
W ten sposób biblioteka event-stream została zhakowana. Jest ona powszechnie wykorzystywania nie tylko przez firmę BitPay, ale również przez wiele innych podmiotów. Co ciekawe, w postaci zhakowanej była dostępna zaledwie trzy dni, ale to wystarczyło, aby programiści z firmy Copay, którzy nie mieli świadomości, że została ona zmodyfikowana, pobrali szkodliwą aktualizację. Zaktualizowane oprogramowanie kryptoportfela zostało udostępnione w sklepach z aplikacjami, a pobrało je wielu użytkowników.
Być może programiści z firmy Copay nie chcieli inwestować swojego czasu w poszukiwanie zmian w tych bibliotekach. Dziś aktualizowanie bibliotek, które są wykorzystywane w jakimś projekcie, obywa się w sposób zautomatyzowany dzięki usługom zarządzania pakietami, takim jak npm. Dzięki nim programista może w prosty sposób uruchomić polecenie aktualizacji modułów firm zewnętrznych, których użyli w swoich projektach.
Nawet jeśli programiści spojrzeliby na zaktualizowane biblioteki, mogliby mieć trudności w identyfikacji szkodliwego kodu. Użyte w projekcie biblioteki mogą opierać się na innych (tak jak biblioteka event-stream zależała od modułu flatmap-stream), a sprawdzenie wszystkich zależności może być zajęciem bardzo czasochłonnym. W tym przypadku proces dodatkowo komplikował fakt, że moduł flatmap-stream był w postaci zaszyfrowanej.
Jak twierdzi portal CCN, biblioteka flatmap-stream została zmodyfikowana tak, aby umożliwić wyciek kluczy prywatnych (czyli tak naprawdę haseł do kryptoportfeli) z aplikacji wykorzystujących zarówno bibliotekę event-stream, jak i copay-dash. Obecność tej ostatniej sugeruje, że był to atak ukierunkowany na firmę BitPay, czyli twórców portfela Copay i copay-dash. W tym przypadku klucze te mogły wyciec tylko w sytuacji, gdy w użyciu były obie biblioteki, a było to możliwe tylko w produktach opartych na kodzie Copay.
Według portalu ArsTechnica szkodliwy ładunek umożliwił atakującemu uzyskanie nieautoryzowanego dostępu do portfeli użytkowników i znajdujących się w nich pieniędzy. Lukę odkrył i zgłosił użytkownik serwisu GitHub. Jednak do tego czasu kilka wersji portfeli Copay zawierających szkodliwy kod zdążyło się już rozprzestrzenić. BitPay ostatecznie potwierdził włamanie i poradził klientom używającym wersje portfela Copay od 5.0.2 do 5.1.0 zaktualizowanie ich do najnowszej wersji, czyli 5.2.0. Na tę chwilę nie ma informacji o liczbie poszkodowanych użytkowników oraz wysokości poniesionych przez nich strat finansowych.
To klasyczny atak na łańcuch dostaw, w którym ktoś hakuje bibliotekę innej firmy, której używają programiści aplikacji. W tym miejscu problem wynika z faktu, że używane jest oprogramowanie posiadające kod otwarty, za które odpowiada nie wiadomo kto. Nie ma gwarancji, że oprogramowanie to działa tak, jak działało kilka wersji temu. Nie można za to winić programistów oprogramowania z otwartym kodem źródłowym — oni dostarczają swoje produkty i nie dają na nie żadnych gwarancji.
Cały trik polegał na tym, że Copay również ma otwarty kod źródłowy — i jest powszechnie wykorzystywany przez programistów innych kryptoportfeli. Wobec tego problem może być jeszcze większy.
Firmy zarabiające na dostarczaniu oprogramowania (a zwłaszcza tego, które bierze udział w przesyłaniu dużych kwot pieniędzy) powinny przed udostępnieniem wersji poddawać oprogramowanie kontroli bezpieczeństwa obejmującej bardzo dokładna analizę. Powinna ona być również wykonywana za każdym razem, gdy pojawia się nowa wersja biblioteki innej firmy, którą wykorzystują w swoim projekcie.
Najlepszą praktyką jest spojrzenie na status repozytorium, wziąć pod uwagę opinie innych programistów, sprawdzić, jak często projekt był aktualizowany oraz kiedy ostatnio, jak również przejrzeć dziennik błędów. Wszelkie udziwnienia powinny wzbudzać czujność i skłaniać do głębszej analizy — albo skorzystania z innego modułu.
Jeśli wystąpi jakiś problem, klienci obwinią firmę za to, że dostarczyła oprogramowanie, które wykorzystuje daną bibliotekę — nawet jeśli to nie oni zawinili, ale programiści biblioteki. Oczywiście nie zniechęcamy do używania produktów z otwartym kodem źródłowym, ale radzimy, aby zachować czujność i ostrożność podczas ich wykorzystywania.