TL; DR
Пакетите се изтриват сами. В рамките на петнадесет дни през август, един npm оператор публикува девет пакета под девет имена от седем акаунта и лично изтегли осем от тях. Времето за инсталиране на всеки от тях спадна от тринадесет часа на седемнадесет минути. Техниката не е само тяхна: седем други пакета от несвързани оператори, носещи напълно различни полезни товари, бяха изтеглени от собствените им издатели средно за 37.8 минути. Артефактът изчезва преди да се изпълнят повечето защитни процеси и инсталирането вече се е случило.
Всичко, което системният регистър показва, се върти; полезният товар не. И деветте изпратиха идентичен по байт bin/ директория, един и същ SHA-256 дайджест за три имена на пакети и два акаунта, през петнадесет дни разлика. Идентичността на съдържанието е единственият сигнал за проследяване, който този оператор не е разбил, а единственият пакет, който никога не е изтеглил, е причината, поради която нещо от него изобщо може да бъде изследвано.
Хората, които го инсталират, не са жертви и така или иначе са силно изложени на риск. Този инструмент не е насочен към разработчици: той предотвратява дистанционното наблюдение на изпити чрез скрито заснемане на екрана, извличане на текст на екрана и връщане на отговорите като наслагване, така че който и да бяга npm install е целевият бенефициент, а не целта. Те също така изпълняват неподписан двоичен файл, който декриптира хранилището им за „бисквитки“ на браузъра, от акаунт, който се самоизтрива в рамките на един час. Те не могат да получат поправка, не могат да проверят по-късно какво са изпълнили и не могат да съобщят за вреда, без да разкрият защо са го инсталирали.
Екосистема: npm, същият модел се наблюдава и при PyPI. Период: Юни–август 2026 г.
Измерването
Времето на престой е интервалът между появата и изчезването на пакет, изчислен от метаданните на регистъра. Това са измервания, а не приблизителни стойности.
| Пакет | Публикувано (UTC) | Лявостоящ |
|---|---|---|
moidev | 2026-08-16 16:31 | 5ч 58м |
moidevx | 2026-08-17 03:24 | 13ч 23м |
moidevz | 2026-08-26 03:38 | 12ч 56м |
moideva | 2026-08-26 18:58 | 1ч 33м |
amicat | 2026-08-28 20:48 | 17m |
bmcat | 2026-08-28 21:17 | 47m |
eyevox | 2026-08-28 21:44 | 21m |
moidevh | 2026-08-31 03:22 | 47m |
Прочетен по реда на публикуване, прозорецът се свива с повече от четиридесет пъти - от 13 часа и 23 минути в най-широкия до 17 минути в най-тясния. Първите четири пакета са средно с продължителност осем часа и половина; последните четири са средно с продължителност тридесет и три минути. На 28 август три пакета бяха публикувани и изтеглени в рамките на един 77-минутен период.
Свиването не е постепенно отклонение. То е концентрирано между 26 и 28 август и това, което се промени, е оценката на оператора за това колко дълго един пакет може безопасно да престои.
Всяко оттегляне тук е инициирано от издателя. Документът в регистъра за всеки показва празен списък с поддържащи до време.непубликувано запис — подпис за премахване на публикацията, а не за премахване. Девети пакет, очи, никога не е била оттеглена; това е причината всичко това да може да бъде разгледано.
Съществува втори режим на оттегляне и не бива да се бърка с този. Когато само версия на полезния товар е изтеглен и пакетът оцелее, средното време е приблизително 73 часа за 31 пакета. Тези заместители пристигат на предварително зададени партиди и оставят празна обвивка - a package.json обявяване на основен който не изпраща файл — чиято единствена функция е да запази името. Този режим е поддържане на график. Този е настроен прозорец за експозиция.
Какво оцелява след изтриването
Девет от тези пакети са от един оператор: мойдев, moidevx, мойдевз, мойдева, мойдев, приятел, bmcat, eyevox намлява очиИмената не са общоприети — всеки, който следи мойдев stem би пропуснал повече от половината от тях – и те бяха публикувани от седем отделни акаунта, почти всички регистрирани в домейни за еднократна употреба.
Това, което споделят, е манифестен запис без причина за съществуване:
"кошче": { "": "bin/kalamasha-tool.js" } } Запазихме копия на пет от тях преди премахването им. Във всичките пет, целият кошче/ директорията е байтово идентична:
| досие | SHA-256 |
|---|---|
bin/kalamasha-tool.js | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
bin/uia_extract.exe | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
bin/chrome_cookies.ps1 | 21b61ec810331850d72423c40c5448e6cd310c4cfad6aed54f92cd7e7cac5f3a |
bin/stealth_capture.ps1 | c9baf5897c03b941c54f736df5af9243ad28794a9e69746d41d4f4a34065589c |
bin/uia_extract.py | c20b38c63efd9221930095c54b42cdd5adffa1972c44c4578226cbe1e4dbac3e |
bin/uia_get_text.ps1 | 4a3f3ada0bdf13aa8e89edb8af817c7816296147dae5be25f169ff960d28a87c |
Два допълнителни сигнала съвпадат. Три от пакетите бяха публикувани в 03:24, 03:38 и 03:22 UTC на 17 август, 26 август и 31 август - шестнадесетминутна лента, обхващаща петнадесет дни и три отделни акаунта. И два от тези акаунти бяха регистрирани на един и същ домейн за еднократна употреба, което ги свързва независимо от кода.
Сметките
Това са акаунтите на издателите на npm, които са изпратили полезния товар, с качения пакет за всеки от тях и колко дълго е бил оставен:
| Профил на издател | Пакет | Имейл домейн | Лявостоящ |
|---|---|---|---|
letol39119 | moidev:1.0.0 | hutdot.com (за еднократна употреба) | 5ч 58м |
so1d1a7i27 | moidevx:1.0.0 | ogzmail.com (за еднократна употреба) | 13ч 23м |
lololololol435678 | eyiouss:3.0.21, 3.0.22, 4.0.1 | ogzmail.com (за еднократна употреба) | все още публикуван |
tagadob568 | moidevz:1.0.0 | ebflyai.com (за еднократна употреба) | 12ч 56м |
tayihim489 | moideva:1.0.0 | prodbits.com (за еднократна употреба) | 1ч 33м |
sahihai123 | amicat:1.0.0, bmcat:2.0.9, eyevox:1.0.0 | потребителска уеб поща | 17m / 47m / 21m |
heytoshan | moidevh:1.0.0 | потребителска уеб поща | 47m |
so1d1a7i27 намлява лолололол435678 споделят ogzmail.com регистрационен домейн — връзката, която свързва акаунта, в който все още се намира активно копие, с акаунта, публикуван под мойдев стъблото две седмици по-рано. сахихай123 публикува и оттегли три отделни имена на пакети в рамките на един 77-минутен прозорец на 28 август. Хейтошан регистриран, публикуван мойдеви го оттегли 47 минути по-късно; това остава единствената публикация на този акаунт.
Всеки един от тези акаунти е без потвърден имейл адрес, няма потвърдена връзка за контрол на изходния код и не е публикувал несвързан проект. Шест от седемте вече не хостват нищо.
Един пакет така и не беше изтеглен. eyious:4.0.1 е публикувана от 16 август и все още можеше да се разреши към момента на писане. Осем артефакта бяха невъзстановими; кампанията беше изцяло реконструирана от този, който остана. Оператор, който изтрива рефлекторно, в крайна сметка все пак ще остави един запазен.
Какво прави инструментът
eyious:4.0.1 описва се в npm като „Високопроизводителна DOM помощна програма и диагностичен мост за съвременни уеб приложения“. Това е инструмент за заснемане на екрана и извличане на отговори, създаден да работи под дистанционно наблюдение на изпити, и източникът го казва със собствените си думи.
Стартовата програма копира средата за изпълнение на Electron под фалшиво име на файл, преди да я стартира, и назовава това, което избягва:
// 🛡️ ИМЕ НА STEALTH BINARY: НЕ трябва да се сблъсква с истинския Testpad! const STEALTH_NAME = 'SearchApp.exe';
Заглавката на същия файл го нарича Пазител на духове против Проктор и внедрява цикъл на респаун, който се връща назад, колкото по-бързо бива унищожен. На други места процесът повишава собствения си приоритет. за борба с дроселирането на процесора от страна на прокторинга, измества приложението за изпит от преден план, когато то е във фокуса, и прекратява дъщерния процес на Safe Exam Browser с taskkill /F /T.
Заснемането се извършва чрез пакетен PowerShell скрипт, извикан с деактивирана политика за изпълнение и потиснат прозорец, като текстът на екрана се събира паралелно чрез Windows UI Automation. Изображенията и текстът в опашката се изпращат към сесия на езиков модел във вграден браузър, а отговорът се рендира в наслагване, което винаги е отгоре. Тази връзка се отлага умишлено и кодът посочва причината за това: за да се избегне трайно излагане на NETSTAT.
Пакетът също се доставя chrome_cookies.ps1, начело ХРОМИРАН ЕКСТРАКТОР ЗА БИСКВИТКИ, който декриптира „бисквитките“ на Chrome и Edge чрез DPAPI и чете базата данни с „бисквитките“ от до четири профила на браузъра. Заявено предварителноcisely: не открихме този скрипт да е извикан по име от нито един изпратен JavaScript файл. Това, което е налично и достъпно, е консумиращата половина, която инжектира съхранените бисквитки на сесията във вградения браузър.
Позицията на хората, които го инсталират
Никой не инсталира това случайно. То няма никаква функция извън наблюдаван изпит и резултатът му е наслагване на отговора на екрана на потребителя. Подвеждащото описание на пакета изобщо не е насочено към инсталатора — то е прикритие, насочено към системния регистър и към всеки, който одитира машината впоследствие. Инсталаторът знае какво получава; описанието съществува, така че рекорд на инсталацията не го отразява.
Пострадалите страни са трети страни, които никога не са се докосвали до npm: институцията, провеждаща изпита, останалите кандидати и всички надолу по веригата, които разчитат на това, че акредитивът означава нещо.
Но инсталаторът не е безопасен и това е частта, която си струва да се обясни, защото самият модел на изчезващия пакет е това, което създава експозицията.
Те използват неподписан двоичен файл от никой. uia_extract.exe Компилира се, без източник и произход на компилацията, от акаунт, който вече не съществува. Същият файл, чрез хеш, е публикуван отново от letol39119, so1d1a7i27, лолололол435678, tagadob568, тайихим489, сахихай123 намлява Хейтошан в продължение на петнадесет дни. Нямаше администратор, когото да попитам, нямаше хранилище, което да прочета, и нямаше история, която да проверя — всяка самоличност, която го е изпратила, се е изтрила сама.
Те са му предоставили точно възможностите, от които зловредният софтуер се нуждае. Скрит процес, изпълняващ се под фалшиво име, който декриптира хранилището за бисквитки на браузъра, чете екрана непрекъснато, прекратява софтуера за сигурност и се рестартира, когато бъде прекъснат. Днес декриптирането на бисквитките е ограничено до домейните на един доставчик и обслужва собствената сесия на потребителя. Този обхват е промяна на един ред и нищо в модела на доставка не би го разкрило, ако се промени - ново име, нов акаунт, ново качване.
Те не могат да получат поправка. Пакетът е премахнат от публикацията в рамките на един час. Няма път за актуализация, няма предупреждение и няма начин по-късно да се разбере, че инсталираната от тях версия се различава от тази, инсталирана от техния приятел. Каквото и да е на машината, си остава там.
Те не могат да одитират какво са управлявали. Техният заключващ файл сега препраща към пакет, който вече не се разрешава. Ако по-късно поискат да установят какво е било на машината им - след инцидент или спор - регистърът няма запис, който да им предостави.
И те не могат да докладват за щети. Потребител, компрометиран от този инструмент, не може да подаде сигнал за злоупотреба, без да разкрие защо го е инсталирал. Това не е случайно. Докладите за злоупотреба с регистъра са основен канал, чрез който се засичат краткотрайни пакети, а потребителската база на този оператор е структурно неспособна да го използва. Единственият останал противник е автоматизираното сканиране, спрямо което е калибриран седемнадесетминутен прозорец.
Структурата на жертвата и времето на престой са един и същ факт, наблюдаван два пъти. Това обяснява и аномалията във времевата линия: ако оттеглянето беше провокирано от страх от оплаквания, дългогодишният популярен пакет щеше да изчезне пръв. Това не се случи, защото оплакванията никога не идват.
Същият модел, различен оператор
Операторът на прокторинга не е сам в това и най-ясният паралел се изпълнява върху несвързан полезен товар.
Между 24 и 27 август се появиха четири npm пакета под имена, заимствани от инструментите за двуфакторно удостоверяване — оторизиран парола за удостоверяване, secretkey-2fa, секретен ключ2фа намлява 2fa-секретен ключ — носещи шестнадесет версии помежду си. Всяка от тях е публикувана от собствения си новорегистриран акаунт (бейилол, jeanpaul686g, zzzalipay, длуууу), всички без потвърден имейл, нито една с потвърдена връзка за контрол на изходния код, нито една не публикува нищо друго. Всяка една е била оттеглена от собствения си издател.
Полезният товар няма нищо общо със софтуера за изпити. Той чете хранилищата за идентификационни данни на браузъра и Discord токените, след което преминава през стълба за удостоверяване на Xbox Live към стартера на Minecraft, за да заснеме токен за обновяване. Тук инсталаторът is жертвата в обичайния смисъл — което прави сравнението полезно, защото поведението при доставка е идентично, независимо от това.
Четирите цикъла се проведоха в реда на публикуване с времетраене 274.9, 37.8, 37.6 и 35.7 минути: един дълъг първи опит, след което достигане на желаната стойност. Три други пакета отново принадлежат на други оператори и показват същото поведение при теглене.
| Пакет | Оператор | Лявостоящ |
|---|---|---|
octopus-action | разузнавателен маяк | 2.5 мин. |
mt-ts-serverless-starter | разузнавателен маяк | 9.6 мин. |
2fa-secretkey | Имена на корици за 2FA | 35.7 мин. |
secretkey2fa | Имена на корици за 2FA | 37.6 мин. |
secretkey-2fa | Имена на корици за 2FA | 37.8 мин. |
auth-otp | Имена на корици за 2FA | 274.9 мин. |
hex-encode-utils | друг | 724.2 мин. |
Седем пакета, средно 37.8 минути, нито един от тях не е свързан със софтуер за изпити.
Три несвързани полезни товара, три несвързани набора от акаунти, една споделена техника.
Защо прозорецът се затваря
Нещо се промени в средата на системния регистър през 2026 г. и очевидният кандидат е, че сканирането стана по-бързо.
Доскоро злонамерените пакети се откриваха главно след факта, че са се случили: от потребител, който е забелязал нещо, чрез доклад надолу по веригата или чрез периодично сканиране. Латентността на откриване се измерваше в дни. Това вече не е единственият режим. Анализ на новопубликувани пакети в почти реално време — Ранно предупреждение за зловреден софтуер на Xygeni сред нарастващия набор от такива системи в индустрията — скъсява разликата между публикуването и проверката до нещо много по-кратко.
Оператор, пред който е изправен, има две възможности. Да направи полезния товар по-труден за разпознаване или да съкрати времето, през което е достъпен за преглед. Вторият вариант е по-евтин, не изисква инженеринг и регистърът предоставя механизма безплатно: в рамките на 72-часовия прозорец за отмяна на публикацията на npm, издателят може да премахне пакет едностранно и името може да бъде използвано повторно впоследствие. Оттеглянето не струва нищо на оператора.
Времето е подходящо. И двата оператора по-горе се сближават около дадена цифра и я задържат, вместо да се отклоняват, което е по-скоро начинът, по който изглежда настроеният параметър, отколкото въпрос на удобство. А параметърът, около който са се сближили – десетки минути – е предварително зададен.cisточно къде би трябвало да се намира, за да премине автоматизирана проверка, като същевременно пакетът остане инсталируем достатъчно дълго, за да достигне до своята аудитория.
Това остава хипотеза. Данните за времето не могат да отделят отговора на сканирането от отговора на прилагането на регистъра или от обикновеното оперативно съзряване, тъй като тези оператори се учат един от друг. Това, което може да се каже без изводи, е по-тясно и все пак полезно: Прозорецът за експозиция вече е достатъчно кратък, така че всеки контрол, зависещ от проверката на пакет след публикуването, се състезава с времето, зададено от оператора. Контролите, които не зависят от проверката – карантина по възраст, деактивирани инсталационни скриптове – не се влияят от тази раса, което е практическата причина да се предпочитат.
Какво да правим с това
Карантина по възраст. Нищо в таблицата за време на задържане не е оцеляло тринадесет часа. Политика, според която никоя версия на зависимости не може да бъде инсталирана, докато не е съществувала 72 часа, би изключила всяка една от тях, без да открие нищо.
Деактивирайте инсталиращите скриптове по подразбиране. –Игнориране на скриптове премахва механизма за доставка, от който зависят пакетите за кражба на идентификационни данни в този корпус. Не помага срещу инструмент, който потребителят изпълнява умишлено, което е предварителноcisразликата, която си струва да се разбере.
Третирайте изчезването като събитие, свързано със сигурността. Предупреждение, когато инсталирана зависимост спре да се разрешава. Вашият заключващ файл, а не системният регистър, е мястото, където все още се съхраняват доказателствата.
Следете съдържанието, а не имената. Шестте дайджеста по-горе съвпадат, независимо от името на пакета, акаунта на издателя или низа на версията - всяко поле, за което този оператор демонстрира, че ще се промени. Правило от страна на системния регистър, че новорегистриран акаунт, който изтегля единствения си пакет в рамките на един час, е модел за докладване, би се задействало за всеки пакет тук, само въз основа на метаданни.
И ако обмисляте да инсталирате нещо от тази категория: Свойствата, които затрудняват улавянето от системния регистър, са същите свойства, които ви оставят без право на защита. Няма издател, който да бъде държан отговорен, няма път за актуализация и няма запис на това, което сте изпълнили.
Индикатори
| Тип | Стойност |
|---|---|
| досие | bin/kalamasha-tool.js — не-standard входна точка на контейнера |
| SHA-256 | 0c293be90c10c8a7618d25f4c4811fa63612b7bc5199b86e10bb31eb36c716dd |
| SHA-256 | e2fda5aa8397799669f29258f69e803cf05d322c1d93269eef6754ca024c3865 |
| Процес | SearchApp.exe написано до легитимна среда за изпълнение на Electron |
| Поведение | powershell -ExecutionPolicy Bypass -File с windowsHide: true |
| Поведение | taskkill /F /T насоченост към процес на безопасен браузър за изпити |
| Metadata | Празен списък с поддържащи до time.unpublished рекорд |
| Сметки | letol39119, so1d1a7i27, lololololol435678, tagadob568, tayihim489, sahihai123, heytoshan |
| Регистрация | ogzmail.com, hutdot.com, ebflyai.com, prodbits.com — домейни за еднократна поща |
Източници
- политика за отмяна на публикуването в NPM — 72-часовият прозорец, в рамките на който издателят може да премахне пакет без намеса.







