- На 4 август 2026 г. саморазпространяващ се червей на име ChainDrop компрометира над 400 npm пакета, включително keyv и flat-cache, в рамките на четири часа.
- Атаката използва откраднати идентификационни данни от GitHub, за да публикува злонамерени версии с валиден произход, което ги прави неразличими от легитимните издания.
- Полезният товар краде идентификационни данни, извлича данни чрез базиран на Ethereum C2 и публикува отново заразените пакети, използвайки откраднати npm токени.
- Организациите трябва да проверяват заключващите файлове, да ротират идентификационните данни и да премахват механизмите за постоянство, за да смекчат въздействието.

Екосистемата на npm се възстановява от една от най-агресивните атаки срещу веригата за доставки, виждани някога. На 4 август 2026 г. червей, наречен ChainDrop , проникна през системния регистър, отравяйки стотици пакети за по-малко от четири часа. Атаката използва компрометиран акаунт в GitHub, за да публикува злонамерени версии на широко използвани библиотеки като keyv и flat-cache, които заедно представляват стотици милиони седмични изтегляния. Това, което прави този инцидент особено тревожен, е, че злонамерените издания са имали валиден SLSA произход, което ги е направило да изглеждат напълно легитимни за автоматизираните проверки за сигурност.
Изследователи по сигурността от StepSecurity, Unit 42, Sonatype и Aikido се надпреварват да анализират червея и да ограничат разпространението му. Първоначалната вълна засегна екосистемата на jaredwray, но червеят бързо се разшири и към други поддържащи компании и организации, включително ServiceTitan, Qlik и Deliveroo. Към последната актуализация броят на компрометираните пакети продължава да нараства, като нови инфекции се появяват на всеки няколко минути. Това не е просто поредната кампания за печатни грешки; това е сложен, саморазпространяващ се червей, който краде идентификационни данни и ги използва, за да се публикува отново в регистъра на npm.
Атаката с един поглед

Атаката започна, когато GitHub акаунтът на Джаред Рей, поддържащ keyv и свързани пакети, беше компрометиран. Нападателят е публикувал злонамерени commit-и директно в главния клон и е изрязвал нови версии, които след това са били публикувани в npm чрез собствения надежден работен процес за публикуване на проекта. Това означаваше, че заразените версии са имали валидни SLSA сертификати за произход , функция, на която много екипи разчитат като сигнал за сигурност. Произходът обаче доказва само кой commit е бил създаден, а не дали е бил оторизиран. Нападателят е поставил и фалшиви тестови файлове и модифицирани скриптове за версии, за да гарантира, че злонамерените версии ще станат най-новият dist-tag.
Злонамерените пакети съдържаха предварителен скрипт, който изпълняваше дропер, наречен setup.mjs. Този дропер изтегли легитимния Bun JavaScript runtime от GitHub и го използва, за да стартира обфусциран полезен товар с размер 727 KB, наречен Math_Symbol.js. Полезният товар беше пълнофункционален червей, който събираше идентификационни данни от системата на жертвата, включително npm токени, GitHub токени, облачни идентификационни данни, SSH ключове и дори конфигурации на инструменти за изкуствен интелект. След това той извличаше данните към сървър за командни и контролни данни, което беше разрешено чрез интелигентен договор на Ethereum – техника, известна като EtherHiding.
Засегнати пакети и обхват

Първоначалната вълна е насочена към 11 пакета в екосистемата jaredwray, включително keyv@6.0.0, flat-cache@6.1.24 и file-entry-cache@11.1.6. Тези пакети са транзитивни зависимости на безброй проекти, от ESLint до cache-manager. След това червеят е използвал откраднати идентификационни данни, за да публикува отново 433 допълнителни пакета, с което общият брой достига 444 пакета и 2,212 версии в рамките на първите няколко часа. По-късни доклади от Sonatype и Aikido показват, че броят им е нараснал още повече, като до момента, в който прахът се е уталожил, са засегнати над 1,000 пакета.
Втората вълна засегна пакети от организации като @servicetitan, @qlik, @onereach и @deliveroo, което показва, че червеят се е преместил от публични инструменти за разработчици в корпоративни конвейери за изграждане. Атакуващите също така създадоха публични хранилища с имена, наподобяващи Dune, за да поставят изкраднати данни, и внедриха механизми за персистентност в директории .vscode и .claude, за да заразят отново разработчици, които са отворили компрометираните хранилища.
Как работи червеят ChainDrop
Веригата за атаки е майсторски клас в това да се живее от земята. Предварителният скрипт се изпълнява преди инсталирането на каквато и да е зависимост, така че червеят се изпълнява с привилегиите на потребителя. Дропърът проверява дали Bun вече е наличен; ако не, той изтегля легитимен двоичен файл на Bun от GitHub. Това прави мрежовия трафик да изглежда безобиден, тъй като идва от github.com. След това полезният товар от втория етап се отделя като фонов процес и започва своята мръсна работа.
Една от най-отличителните техники е извличането на данни от паметта на runner-а . Полезният товар изпълнява Python помощник, който чете паметта на процеса Runner.Worker на GitHub Actions, търсейки тайни, инжектирани в работния процес. Това му позволява да улавя OIDC токени и други ефимерни идентификационни данни, които иначе биха изчезнали при приключване на задачата. Червеят използва и руски локален авариен ключ, като излиза чисто, ако системният език е руски, често срещана тактика за избягване на насочване към страните от ОНД.
Полезният товар включва пълен npm двигател за публикуване. Той изброява всички пакети, които жертвата може да публикува, изтегля текущия tarball, инжектира злонамерения предварителен скрипт и полезния товар и публикува отново пакета с подобрена версия. Той дори генерира свои собствени Sigstore и SLSA provenance пакети, което прави злонамерените версии да изглеждат легитимно изградени. Този механизъм за саморазпространение е това, което позволи на червея да се разпространи толкова бързо в несвързани организации.
Индикатори за компромис
Ако сте инсталирали някоя от засегнатите версии, приемете, че системата ви е компрометирана. Потърсете тези индикатори:
- Файлове с имена setup.mjs, Math_Symbol.js или math_init.js в директориите node_modules.
- Неочаквани Bun двоични файлове на вашата система, особено ако никога не сте инсталирали Bun.
- Промени в .claude/settings.json или .vscode/tasks.json, които препращат към setup.mjs.
- Изходящи връзки към npm-cache.com или awqhnjewqjkl.icu, или Ethereum RPC повиквания към договор 0xE1f2395ee43e45A1556EC6438a88c31B83493103.
- Нови хранилища в GitHub с описания като „Shai-Hulud: Here We Go Again“ или имена на тема Дюн.
Също така проверете за инсталирания монитор на токени след изтичане: ~/.local/bin/gh-token-monitor.sh, ~/.config/gh-token-monitor/ и услугите systemd или LaunchAgent. Червеят инсталира това, за да накаже ротацията на идентификационните данни, като задейства полезен товар на атакуващия, когато откраднатият токен бъде отменен.
Смекчаване и възстановяване
Ако сте засегнати, действайте бързо. Първо, изолирайте машината и запазете лог файловете. След това завъртете всички идентификационни данни, които са били налични в системата, включително npm токени, GitHub PAT файлове, облачни ключове и SSH ключове. Премахнете монитора на токените преди завъртане, тъй като той ще се задейства, ако отмените токена. След това почистете заключващите файлове и ги закачете към известни добри версии. За keyv, flat-cache и file-entry-cache използвайте презаписвания, за да блокирате злонамерените версии. Накрая, преинсталирайте с –ignore-scripts, за да предотвратите изпълнението на всички останали install hooks.
За CI/CD конвейери, прегледайте лог файловете за всички инсталации, които са разрешили засегнатите версии по време на прозореца на експозиция. Третирайте всеки runner, който е инсталирал отровен пакет, като компрометиран и завъртете всички секретни данни, достъпни за тази задача. Също така, одитирайте вашите GitHub организации за неочаквани работни потоци, наречени „Run Copilot“, или артефакти, наречени „format-results“, които са признаци за тайно пране на данни от червея.
Защитата в дълбочина е от решаващо значение. Използвайте изходящи списъци на CI runners, за да блокирате дропа от извличане на Bun. Приложете политики за охлаждане, които изискват пакетите да са на няколко дни преди приемане. И не разчитайте единствено на произхода - това не е гаранция за безопасност. Най-добрата защита е да се сведе до минимум използването на инсталационни скриптове и да се следи за аномално поведение.
Докато разследването продължава, броят на засегнатите пакети продължава да расте. Способността на червея да ротира своята C2 инфраструктура чрез една единствена транзакция с Ethereum го прави особено устойчив. Екипите по сигурността трябва да следят смарт договора за промени и да се информират за нови индикатори. Регистърът на npm е започнал да премахва злонамерени версии, но почистването продължава.
Този инцидент е сурово напомняне, че екосистемата с отворен код е толкова сигурна, колкото е сигурна най-слабата ѝ връзка. Един-единствен компрометиран акаунт на поддържащ може да се превърне в мащабна атака срещу веригата за доставки. Червеят ChainDrop е зов за събуждане за разработчиците и организациите да приемат по-строги практики за сигурност, включително многофакторно удостоверяване, токени с най-ниски привилегии и непрекъснато наблюдение на зависимостите.