Создатель библиотеки UAParser.js для Node Package Manager – популярнейшего менеджера пакетов по умолчанию для Node.js и JavaScript, который еженедельно скачивается 7,5 миллиона раз – получил письмо. Это был образец социальной инженерии. Имитация официального уведомления от поддержки NPM была безупречной. В сообщении под угрозой блокировки аккаунта требовалось обновить двухфакторную аутентификацию. Хватило одного клика, чтобы перед хакерами открылся доступ к учетной записи с правами на публикацию апгрейдов.
Не прошло и нескольких часов, как в пакеты был влит троян. А ими пользуются миллиарды клиентов Amazon, Google, Facebook и бесчисленных финтех-стартапов по всему Земному Шару. Это была настоящая микрохирургическая операция, а не какой-то тривиальный вирус.
Механика атаки
- Выследить. Пока пользователь ни зайдет на один из популярных криптосервисов, среди которых такие гиганты, как Coinbase, MetaMask, OpenSea, вредоносный код никак себя не проявляет.
- Атаковать. В тот момент, когда человек подписывает транзакцию, происходит незаметная подмена адреса получателя в данных, которые уходят в блокчейн.
- Создание иллюзии. Жертва видит на экране правильные координаты, которые и должны были отобразиться. Сеть же получает и исполняет команду на отправку платежа на совершенно другой адрес, находящийся под контролем злоумышленников.
Чтобы замаскировать свои преступные намерения, взломщики воспользовались алгоритмом Левенштейна. Он представляет собой математический аппарат, позволяющий вычислять схожести строк. Этот механизм положен в основу поисковых систем и коррекции опечаток. Именно он помог воровской программе подобрать адреса, которые были максимально похожими на исходники.
Например:
- 0x742d35Cc6634C0532925a3b844Bc454e4438f44e – настоящий адрес.
- 0x742d35Cc6634C0532925a3b844Bc454e4438f44f – подмененные реквизиты.
При беглой проверке разницу в один символ человеческому глазу не различить.
И описанная проблема касается не только разработчиков, но и рядовых пользователей. Угроза заключается в ее опосредованности. Приложение может быть совершенно безопасным, но существует цепочка зависимостей, которую можно назвать своеобразным цифровым ДНК, которую могут отравить хакеры.
Последовательность компрометации выглядит следующим образом: пользователь – криптокошелек – инфраструктура для взаимодействия с блокчейном (библиотека) – зависимость от продукта, созданного Джошем Джуноном – скомпрометированная версия.
Кошелек, на самом деле, никто не взламывал. Просто на последней стадии сборки программного обеспечения произошла подмена дорожного указателя, и путь следования ваших денег был перенаправлен в другую точку назначения.
Ирония устаревших систем
Обнаружить атаку удалось не благодаря, а вопреки лучшим технологиям. В ходе создания одного из проектов была применена устаревшая версия Node.js. Когда кто-то попытался вызвать несуществующую функцию fetch, сборка вышла из строя. Разработчики полезли в логи и обнаружили, что система пала из-за того, что троян хотел совершить отправку похищенных данных на хакерский сервер. Но эта функция на устаревшей платформе просто не была внедрена.
Таким образом, случайным щитом стало несвоевременное инфраструктурное обновление. Несовершенство системы предотвратило утечку данных и привлекло внимание к взлому.
Если же вы уже обнаружили, что стали жертвой атаки, вам необходимо срочно:
- Связаться со службой техподдержки биржи, на которую незаконно ушли ваши средства. В ряде случаев оперативное обращение позволяет заморозить счет криптомошенника.
- Обратиться к специализированным сервисам, которые займутся расследованием инцидента.
Описанная выше кибератака нанесла прямой ущерб в размере всего 50 тысяч USD. Столь незначительная сумма потерь объясняется только оперативному обнаружению взлома.