634 пароля за 56 секунд
Разработчик прошёл два этапа собеседования в фейковой компании. Настоящий сайт, настоящие лица, настоящие технические разговоры. Затем они предложили выполнить тестовое задание. Меньше чем за минуту были украдены все пароли из Chrome, данные macOS Keychain и криптокошелька. <<<CLV-SUBTITLE>>>
Разработчик — с сознанием безопасности, опытный, человек, который сам ищет мошенничество — прошёл многоэтапный процесс собеседования в фейковой компании. Звонок из HR. Техническое собеседование с двумя инженерами. Настоящий сайт с фотографиями команды. Настоящие профили в LinkedIn. Недели выстраивания отношений.
Затем его попросили выполнить небольшое тестовое задание во время демонстрации экрана.
Через 56 секунд у злоумышленников были 634 сохранённых пароля Chrome, файл macOS Keychain (который содержит ключ для их расшифровки) и данные кошелька MetaMask.
Как устроена атака
Репозиторий на GitHub выглядел чисто. Несколько backend-файлов, ничего подозрительного. Но одна зависимость — winston-middleware, пакет для логирования с вполне обычным названием — имела собственную зависимость: next-runtimejs.
Именно там и было оружие.
В момент запуска npm install молча выполнился shell-скрипт. Без запросов, без предупреждений. Он загрузил бэкдор на основе Go и прописал его в автозапуск при каждой загрузке.
Это был не инструмент script kiddie. Собственный C2-протокол с шифрованием RC4. Команды на выполнение shell-команд, кражу файлов, извлечение паролей Chrome, эксфильтрацию Keychain и работу с криптокошельками. Сделано профессионально.
Бэкдор запустился в 16:16:37. К паролям Chrome обратились в 16:17:33. Разработчик заметил уведомление macOS о исходящем соединении и отключил WiFi в течение минуты — но ущерб был уже нанесён.
Почему важно именно собеседование
Эта атака не сработала бы как холодное письмо. «Выполните этот репозиторий» от незнакомца будет проигнорировано.
Но после двух этапов собеседования? После того, как вместе смеялись над тем, сколько фейковых вакансий нацелено на разработчиков? После того, как один из интервьюеров со улыбкой сказал: «Можете поискать бэкдоры»?
В этот момент бдительность снижается. Доверие — это эксплойт. Вредоносное ПО — лишь полезная нагрузка.
Разработчик сказал лучше всего: «Если это случилось со мной, это может случиться с кем угодно в вашей команде».
Что на самом деле означают пароли Chrome
Chrome шифрует сохранённые пароли с помощью AES. Ключ расшифровки хранится в macOS Keychain. Злоумышленники похитили оба файла меньше чем за минуту.
Каждый сохранённый пароль — банкинг, почта, GitHub, облачные консоли — стал читаемым на их стороне. Файл Keychain можно взломать офлайн без ограничений скорости. Разработчику пришлось сменить всё.
В этом скрытая проблема паролей, сохранённых в браузере: они зашифрованы ключом, который находится на той же машине. Скомпрометируйте машину — и «шифрование» становится декорацией.
Схема ДНКР
Разработчик упомянул, что его предыдущая компания также была взломана Северной Кореёй тремя месяцами ранее. Это кампания «Contagious Interview» — поддерживаемые государством ДНКР злоумышленники проводят фейковые собеседования, чтобы установить вредоносное ПО на машины разработчиков.
Это не случайность. Они выбирают разработчиков именно из-за того, к чему у разработчиков есть доступ: производственные учётные данные, ключи подписи, облачная инфраструктура и — всё чаще — токены ИИ-агентов, которые дают доступ к ещё большему.
Масштаб промышленный. Фейковые компании с генерированными лицами. Отполированные сайты. Многонедельные процессы собеседований. Они инвестируют, потому что ROI существует.
«Менеджеры паролей не помогают»
В обсуждении разработчик сделал интересное утверждение: «Менеджеры паролей не помогают, если у злоумышленников есть доступ к вашему компьютеру через такой бэкдор, потому что они могут позже передать любой файл, создать специальный эксплойт именно под вас, использовать кейлоггеры, скриншоты».
Это отчасти верно и отчасти неверно.
Менеджер паролей, который хранит хранилище на локальном диске и разблокируется мастер-паролем, который Вы вводите, — да, бэкдор с кейлоггингом и доступом к файлам может его скомпрометировать.
Но менеджер паролей с ключами, привязанными к оборудованию, — где ключ расшифровки выводится из физического аутентификатора и никогда не существует в виде файла на диске, — устроен принципиально иначе. Бэкдор может красть файлы, записывать нажатия клавиш, делать скриншоты. Но он не может извлечь ключ, который существует только внутри аппаратного модуля безопасности и доступен лишь при физическом подключении.
634 пароля Chrome были украдены потому, что и зашифрованные данные, и ключ расшифровки были файлами в файловой системе. Если для расшифровки требуется физическое владение устройством, кража файлов даёт вам лишь зашифрованные блобы и ничего больше.
Что делать
- Никогда не выполняйте код из собеседования на своей основной машине. Используйте виртуальную машину или отдельное устройство.
- Запускайте
npm install --ignore-scriptsна любом незнакомом репозитории перед выполнением - Используйте межсетевой экран для исходящего трафика (Little Snitch, LuLu), который оповещает о новых соединениях
- Прекратите сохранять пароли в Chrome. Без исключений.
- Храните криптовалюту на аппаратных кошельках, а не в расширениях браузера
- Расценивайте любое тестовое задание от рекрутера как потенциально враждебное, сколько бы разговоров у Вас ни было
Разработчик выжил, потому что уведомление macOS вовремя показало исходящее соединение. Большинство людей нажали бы «Разрешить» не задумываясь.
56 секунд. Именно столько требуется.