
Бекдор, захований у пропозиції роботи з LinkedIn: як фальшива рекрутерка заманила розробника
Розробника, якого попросили переглянути GitHub-репозиторій у межах вакансії, знайшов прихований бекдор, що запускається під час npm install. Коміти репозиторію та профіль «рекрутерки» належали двом реальним людям, які ніколи не працювали над проєктом.
На початку червня 2026 року фулстек-розробник Роман Іманкулов отримав у LinkedIn повідомлення від «рекрутерки» невеликого криптостартапу. Після кількох днів листування вона описала зламаний прототип, для якого шукали провідного інженера, і надіслала публічний репозиторій на GitHub — з проханням «подивитися проблему застарілих Node-модулів». Перегляд чужого коду — справа звична, але щось викликало підозру, тож він вирішив бути обережнішим.
Замість того щоб клонувати репозиторій і встановлювати залежності на власній машині, він розгорнув тимчасовий VPS у Hetzner, скопіював код туди й під'єднав до нього AI-агента Pi в режимі лише читання, з увімкненими інструментами перегляду файлів: read, grep, find, ls.
Пастка всередині тестового файлу
Агент зупинився майже одразу на файлі app/test/index.js. Репозиторій мав вигляд React-фронтенду з Node-бекендом, а пастка — близько 250 рядків, замаскованих під набір тестів. Усередині URL збирався з фрагментів: протокол «https», домен «store», субдомен «rest-icon-handler», шлях «/icons/» і токен «77».
У рядку 225, між закоментованими тестами, ховався код, який виконував будь-яку відповідь сервера. Файл не чекав запуску тестів: app/index.js виконує require('./test'), а package.json підключає app/index.js до старту через скрипт prepare. npm запускає prepare автоматично після npm install, тож саме встановлення залежностей і активувало бекдор. Підказка про «застарілі модулі» була приманкою.
Позичена особа — двічі
Усі 39 комітів репозиторію були оформлені на ім'я та пошту реального розробника — фулстек-інженера зі звичайним профілем у LinkedIn, особистим сайтом і довгою історією на GitHub. Іманкулов написав йому й дізнався, що той ніколи не працював у цій компанії та не має стосунку до репозиторію; його вже видавали за іншого на GitHub, і тоді репозиторій зняли.
Профіль «рекрутерки» теж був позичений: він належав відомій журналістці з культури, у біографії якої не було нічого технічного. Коли Іманкулов сказав, що проєкт не встановлюється, «журналістка» миттєво перетворилася на експертку з npm і версій Node, наполягаючи на запуску npm install.
Що з цього випливає
Автор зізнається, що чув про такі атаки раніше, але коли одна прийшла по нього, це все одно заскочило зненацька; у втомлений або поспішний день він цілком міг би запустити npm install, не подумавши. Він поскаржився на репозиторій у GitHub, а на «рекрутерку» — у LinkedIn. Поки що нічого не змінилося, і код досі доступний.
Другий висновок — технічний: перегляд коду агентом у режимі лише читання виявився продуктивнішим за ручне читання. Бекдор був замаскований під неохайний код початківця, але агент помітив його за секунди. Практичне правило просте: відкривайте невідомі репозиторії в ізольованому середовищі й нічого не встановлюйте, доки не прочитали код.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.