Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Doszło do naruszenia bezpieczeństwa w kodzie Ledger Connect Kit
Ledger – producent fizycznych portfeli kryptowalutowych opublikował oświadczenie, w którym potwierdza, że doszło do naruszenia bezpieczeństwa w kodzie Ledger Connect Kit oraz informuje, że użytkownicy powinni wstrzymać się od wykonywania transakcji przez najbliższe 24h. Co się stało?
Kilka dni temu użytkownicy zauważyli, że Ledger Connect Kit ładuje podejrzany kod, który dokonuje tzw. drainowania portfela. Polega to na przedstawieniu użytkownikowi fałszywego popup-u płatności, by po potwierdzeniu, przelać środki skojarzone z jego kontem do innego portfela.
Ledger opublikował dokładną oś czasu zdarzeń:
Przestępcy przejęli konto dewelopera, aby następnie podmienić paczkę w repozytorium npm.
Atakujący nie zachowali jednak wysokiego poziomu OPSEC-u, więc podmianę można było szybko dostrzec po nazwie zmiennej.
Connect Kit Loader wykonuje poniższy kod, który wykorzystuje jsdelivr.net do pobrania odpowiedniej biblioteki. Listing prezentujący fragment kodu wykorzystujący jsdelivr.net do pobrania connect-kit (źródło: https://github.com/LedgerHQ/connect-kit/blob/main/packages/connect-kit-loader/src/index.ts):
export async function loadConnectKit(): Promise {
const src = "https://cdn.jsdelivr.net/npm/@ledgerhq/connect-kit@1.1.8";
const globalName = "ledgerConnectKit";
return new Promise((resolve, reject) => {
const scriptId = ledger-ck-script-${globalName};
Okazuje się, że connect-kit-loader nie weryfikuje i wykonuje kod z dynamicznie ładowanego zasobu. Ledger tak wyjaśnia wybrane podejście dynamicznego ładowania kodu z sieci CDN:
The @ledgerhq/connect-kit-loader allows dApps to load Connect Kit at runtime from a CDN so that we can improve the logic and UI without users having to wait for wallet libraries and dApps updating package versions and releasing new builds.
Nie napiszemy, że odważne podejście :) Jeśli jeden z ładowanych skryptów będzie zawierał złośliwy kod, to automatycznie będzie oznaczać, że infekcja będzie dotyczyła wszystkich projektów korzystających z tego loadera.
Złośliwa paczka została już usunięta: https://www.npmjs.com/package/@ledgerhq/connect-kit/v/1.1.7?activeTab=code a historia wydań lekko zmodyfikowana:
To, co jest zastanawiające to, że w pierwszym punkcie dostęp do npm został uzyskany przez atakujących przy pomocy skutecznego ataku phishingowego, który był skierowany w byłego dewelopera Ledgera. Więcej szczegółów nie podano, a sam npm pozwala na skonfigurowanie MFA.
Ledger Connect Kit pozwala na łączenie DApps z fizycznymi portfelami. Określenie DApps (potocznie Web3) odnosi się do aplikacji, w których backendem jest blockchain. A same hardwarowe portfele, to po prostu urządzenia przechowujące klucze kryptograficzne, będące metodą uwierzytelnienia w zdecentralizowanej sieci. Przy ich pomocy można korzystać z DApps oraz potwierdzać transakcje na skojarzonym adresie. Jest wykorzystywany przez wiele platform, więc złośliwa poprawka dotyczyła ich wszystkich.
Atak prezentował się następująco:
Warto podkreślić, że atak opiera się na na wstrzyknięciu fejkowego okna płatności a nie na kompromitacji kluczy kryptograficznych.
Pozostaje zatem kilka pytań:
- Czemu były pracownik wciąż mógł aktualizować paczki Ledgera? (a to pociąga za sobą pytanie jak Ledger zarządza poświadczeniami)
- Dlaczego nie wykorzystano zamrożonych (freezed) wersji zależności?
- Czemu nie było MFA?
- Jak został zaktualizowany CDN?
- Dlaczego nie wdrożono żadnych mechanizmów weryfikacji kodu?
Dzisiejszy dzień zapadnie na długo w pamięci deweloperom Web3. Miejmy nadzieję, że odpowiednie wnioski o stanie bezpieczeństwa aplikacji zostaną wyciągnięte.
> This was an unfortunate isolated incident.
CEO Ledgera Pascal Gauthiera opublikował oświadczenie, w którym wyjaśnia, że proces publikacji zmian w kodzie ma wiele etapów, a polityka firmy nie pozwala na utrzymywanie aktywnych dostępów dla byłych pracowników.
Monitor statusu Ledgera nie informuje o tym incydencie.
~fc