Shai-Hulud: як заражений npm-пакет валить тисячі застосунків
Хробак у бібліотеці Keyv самовідтворюється через ланцюг залежностей і токени розробників, тож захист вимагає lock-файлів та автоматичного аудиту.
Хробак Shai-Hulud проліз у npm-пакети Keyv та кілька пов'язаних із ним бібліотек — це популярний інструмент кешування, який тягнуть за собою тисячі інших проєктів. Зараза не краде дані з одного застосунку і зупиняється. Вона розмножується: потрапивши на машину розробника, шукає його токени доступу до npm і публікує заражені версії вже його власних пакетів. Кожна жертва стає новим джерелом.
Назва не випадкова — Shai-Hulud це піщані черв'яки з «Дюни», які прориваються під поверхнею й ковтають усе згори. Тут механіка та сама. Ви ставите один пакет, а разом із ним у ваш node_modules заповзає дерево із сотень залежностей, які ви ніколи не читали й не читатимете.
Чому одна бібліотека валить тисячі застосунків
Сучасний JavaScript-проєкт — це не ваш код. Це на 90% чужий код, зшитий докупи. Типовий застосунок має десятки прямих залежностей, а через них — тисячі транзитивних, тобто залежностей ваших залежностей. Ви довіряєте Keyv, Keyv довіряє ще п'ятьом пакетам, ті — ще двадцятьом. Ланцюг довіри тягнеться так далеко, що ніхто не бачить його кінця.
Атака на ланцюг постачання б'є саме сюди. Зловмиснику не треба зламувати ваш сервер. Досить отруїти одну ланку нижче за течією — і зараза сама доїде до вас під час звичайного npm install. Для української команди, яка розгортає держсервіс чи фінтех на відкритому коді, це означає просту річ: ваш периметр безпеки — це не ваша фаєрвол, а найгірше захищений ноутбук найменш обережного мейнтейнера пакета, про існування якого ви не підозрюєте.
Що робити прямо зараз
Перше й головне — фіксувати версії. Lock-файл (package-lock.json, yarn.lock, pnpm-lock.yaml) записує точну версію кожного пакета аж до останньої транзитивної залежності разом із хешем. Якщо файл закомічений у репозиторій і CI ставить залежності командою npm ci, а не npm install, зловмисник не підсуне вам свіжу отруєну версію мовчки. Проєкт без закоміченого lock-файлу — це двері без замка.
Далі — регулярний аудит. npm audit і pip-audit для Python звіряють ваші залежності з базами відомих уразливостей і показують, де діра та як її закрити. Це не разова дія, а частина конвеєра: аудит має падати автоматично на кожному білді й ламати збірку, якщо знайшлася критична вада.
Найнебезпечніша залежність — та, про яку ви забули, що вона у вас є.
Чек-лист для стартапів і держсервісів на відкритому коді:
- Lock-файл у git і встановлення тільки через
npm ciв CI. - Автоматичний аудит залежностей на кожному білді, з блокуванням критичних CVE.
- Затримка оновлень. Не ставте мажорні версії пакетів у день релізу — заражені версії живуть години-дні, доки їх не викриють. Тиждень паузи рятує.
- Двофакторна автентифікація на npm-акаунтах вашої команди — саме крадіжка токенів годує хробака.
- Мінімум залежностей. Кожен зайвий пакет — це чужий ноутбук у вашому периметрі. Пакет на п'ять рядків коду краще написати самому.
- Ізоляція збірки. CI без доступу до продакшн-секретів, щоб скрипт із залежності не виніс ключі за межу.
Shai-Hulud не остання така історія, бо модель відкритого коду тримається на довірі до людей, яких ви ніколи не бачили. Довіру не скасувати — але її можна замкнути на lock-файл, аудит і затримку в кілька днів. Команда, яка ставить чужий код у продакшн того ж дня, коли він вийшов, сама відчиняє двері черв'якові.
- Hacker News: In Memory of My Wife, Elise Cawley, with Thanks for 36 Wonderful Years
- Hacker News: AI-Generated Images Discourage Me from Reading Your Blog
- Hacker News: Xbox goes down. You can't play games you own on disc
- Hacker News: Show HN: Simple algorithm and color space to generate diverse skin tones
- Hacker News: Mistral's Shieldstral: 3B open-weights model for multimodal moderation
- Hacker News: All of Winona Police Department's Flock cameras cut down and stolen
Щодня — головне про Україну, спокійна аналітика та наука і техніка простою мовою.
Підписатися в Telegram →