DevTap npm Typosquatting Attack

Напад со DevTap npm Typosquatting: Шест малициозни пакети ги таргетираат работните станици на програмерите

TL; ДР

Помеѓу 1 април и 3 мај 2026 година, еден издавач на npm, user0001, регистриран со непотврдената Gmail адреса tanvisoul9@gmail.com, тивко туркаше шест пакети со намерно благи имиња што звучеа како инфраструктура: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, и node-env-resolve.

Најновите две верзии на node-env-resolve, 1.0.7 и 1.0.8, беа означени од системот за рано предупредување за малициозен софтвер (MEW) на Xygeni на 2 мај и потврдени како малициозни на 3 мај.

Имплантот е необичен за она што не е: нема ботови на Telegram, нема повратни повици на OAST, нема обфускацијаи нема обид за преземање на AWS акредитиви за време на инсталацијата. Наместо тоа, postinstall.js вградува запис за перзистентност на стартување на Windows, користејќи го копчето HKCU Run што го стартува wscript.exe против VBS stub. Потоа создава одвоен Node.js агент кој ги спојува модулите за снимање на микрофон, кражба на историја на прелистувач, снимање на екранот и симулација на глушец/тастатура.

Го нарекуваме овој кластер DevTap, по комплетот, тој почнува да работи на машината на развивачот.

Сите шест пакети беа активни на npm во времето на пишување. Ги доставивме до каналот за злоупотреба на регистарот. Бранителите треба да ги повлечат сите инсталации од издавачот додека чекаат отстранување.

Кластерот: Шест пакети, еден издавач

Сметката на издавачот user0001 е непроверено. Нема SCM верификација, без е-пошта поврзана со домен и без претходна историја. Корисничката адреса на Gmail tanvisoul9 не се појавува во ниту еден друг запис на издавач на npm што можевме да го најдеме.

Сите шест пакети го наведуваат истиот одржувач, се објавени од истата сметка и го делат истото package.json стандардна верзија. Нема repositoryВо homepage, и не description подолго од една линија.

Стратегијата за именување е интересниот дел. За разлика од класичната кампања за конфузија на зависности или typosquat, ниедно од овие имиња не е насочено кон одредена библиотека нагоре. Наместо тоа, тие се калибрирани да исчезнат во вистинска package.json or npm ls излез.

пакетПрво објавеноНајновата верзијаверзииУлога во кластерот
централогер2026-04-01 12:46 UTC1.0.95, од ​​1.0.5 до 1.0.9Насловна страница на кластерот за „алатка за евидентирање“; најрано објавување
dom-utils-lite2026-04-14 07:36 UTC1.0.33Општа DOM-помошничка покривка
node-fetch-lite2026-04-19 10:22 UTC1.0.23Семејство на преземање на имитирачки јазли
конектор-агент2026-04-25 05:12 UTC1.0.01Генеричко име „агент“
јазол-gyp-извршување2026-04-25 05:17 UTC1.0.01Имитира алатки за градење на вградени модули
јазол-енв-решавање2026-04-25 05:21 UTC1.0.910, од ​​1.0.0 до 1.0.9Активен капалка; целосен имплант

Имиња како centralogger, node-fetch-lite, и node-gyp-runtime се дизајнирани да изгледаат неконтроверзни при преглед на кодот. Звучат како работи што веќе би биле во дрвото на зависности на проектот.

Во комбинација со нов, непроверен издавач и недостасувачки врски до складиштето, тие формираат препознатлив образец: актер кој внесува имиња со низок степен на триење во регистарот, а потоа брзо се повторува на она што е важно. Во овој случај, node-env-resolve доби десет верзии за осум дена.

Што се појавува на Windows Dev Box

Малициозниот синџир на node-env-resolve:1.0.8 е краток, директен и невообичаено богат со функции за npm RAT.

Постинсталација: Перзистентност и Одделен агент

package.json декларира една кука за инсталација:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js прави три работи по ред.

Прво, поставува инсталациски директориум надвор од npm дрвото. Патеката се пресметува за време на извршување во скриптата како INSTALL_DIRПотоа извршува внатрешен execSync('npm install --production --silent ...') внатре во него за да ги извлече зависностите за време на извршување на имплантот. Ова го става агентот на диск некаде во упатство node_modules ревизијата нема да најде.

Второ, запишува VBS фрлач и го регистрира за перзистентност при стартување:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \     /v ${AGENT_NAME} \     /t REG_SZ \     /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe е Windows Script Host, потпишан бинарен фајл на Microsoft кој работи .vbs датотеки без конзолен прозорец. Тоа е преcisзатоа е фаворизиран за стабови за автоматско стартување.

Исто така, постои и совпаѓање reg delete патека внатре src/index.js, што сугерира дека имплантот е дизајниран да може лесно да се отстрани по команда на операторот.

Трето, создава одвоен детски процес:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {   detached: true,   env: { ...process.env, SERVER_URL } })

Два детаља се важни овде.

SERVER_URL се чита од околината. Како резултат на тоа, крајната точка C2 може да се конфигурира по распоредување и не е вградена во пакетот. Овој мал, но намерен избор ги побива повеќето статички-IOC пребарувања.

Исто така, роденото дете ја наследува целосната родителска средина. Затоа, секое NPM_TOKEN, AWS_*, GITHUB_TOKEN, или SSH-сокетот за агент присутен во школката на развивачот за време на инсталацијата патува во меморијата на долговечниот агент.

Со што испорачува агентот

Пакетот src/ tree вклучува три модули чии имиња сами по себе ја раскажуваат приказната: audioCapture.js, browserHistory.js, и systemInfo.js.

Листата на зависности за време на извршување, решена за време на поставувањето во фази npm install, ги потврдува.

Овој пристап го претвора хаотичниот инцидент во контролиран одговор.

Наместо слепо да реагираат, тимовите работат со јасна приоритизација и брза санација.

зависностЗа што служи во овој контекст
снимка од екранот-на-десктопПериодично снимање на екранот
@виљушка-од-орев/js-од-оревАвтоматизација / симулација на внесување на глушец и тастатура
подобар-sqlite3Директно читање на базите на податоци SQLite од Chrome, Edge и Firefox History
adm-zipЗдружување на собраните артефакти пред ексфилтрација
остриПромена на големината/компресирање на снимки од екранот и артефакти од слики
socket.io-клиентПерзистентен двонасочен C2 канал
јазол-идентификатор-на-машинаСтабилен отпечаток од прст по домаќин за следење на жртвата

systemInfo.js повици os.networkInterfaces() за дополнително земање отпечатоци од прсти пред првиот светилник.

Зошто снимањето на звук е извонреден сигнал

Повеќето npm RAT што ги тријажираме во MEW запираат при кражба на тајни за време на инсталацијата. Тие читаат ~/.npmrcпрочитај ~/.aws/credentials, стругање process.env, ПОСТАВИ на webhook и излез. Тоа одговара на економски модел „скрши и зграби“. Акредитивите имаат краток полуживот, а напаѓачот треба брзо да монетизира.

node-env-resolve е различен по форма.

Перзистентноста е поставена да преживее рестартирање. Агентот работи одвоено и долговечно под wscript.exeКомплетот што го носи е наменет за поставување на машината на развивачот, а не за земање и оставање: снимач на микрофон, драјвер за тастатура/глушец, целосно внесување на историјата на прелистувачот, снимање на екранот и интерактивен Socket.IO канал назад до конфигурабилен C2.

Особено снимањето на микрофон е границата што оваа кампања ја преминува, а поголемиот дел од npm малициозниот софтвер не ја преминува.

Работната станица за програмери, сè повеќе, е и работна станица каде што програмерите одржуваат стендап средби, повици од клиенти, дискусии за дизајн и мостови за разговор на повик. Имплантот што го снима микрофонот всушност не го бара npm токенот на развивачот. Тој го бара она што развивачот го кажува пред лаптопот.

Тој сет на можности, плус недостатокот на замаглување и отсуството на какво било впечатливо отстранување за време на инсталацијата, се чита како претходно позиционирање за насочен пристап, а не како опортунистичка кражба на акредитиви.

Не тврдиме дека се работи за причина само од ова. Го забележуваме оперативниот профил.

npm typosquatting напад - DevTab

Осумдневниот итерациски каденца на node-env-resolve е најоперативно карактеристичниот детаљ во временската линија.

Ова не е пуштање од типот „пали и заборави“. Издавачот активно го одржува пуштањето, што обично значи едно од двете нешта. Или го прилагодуваат според тест средини пред пошироко распоредување, или веќе имаат инсталирана телеметрија и реагираат на неа.

Останатите пет пакети практично не забележаа никакво „одлежување“ по нивното првично објавување. Тоа се вклопува во шемата „еднаш фаза, остави име“ за поддржувачкиот кластер, додека инженерските напори се фокусираат на пакетот што ја извршува работата.

Атрибуција: Мали индиции, без цврста пресуда

Јавниот OSINT сигналите се слаби и нема да ги растегнеме. Што е забележливо:

Рачката на Gmail tanvisoul9 делумно наликува на јужноазиско име, „Танви“. Ова е слаб сигнал. Корисничките имиња на Gmail не се идентитет, а задната soul9 е генеричко. Не е безбедно да се заклучи географијата само од локалниот дел на е-поштата.

Стилот на кодот е незабележителен Node.js: standard библиотечни повици како што се os, child_process, spawn, и reg addНема замаглување, нема ротација на низи и нема логика против дебагирање. Авторот е задоволен со примитивите на регистарот на Windows и оркестрацијата на одделни процесни процеси, но се чини дека не посегнува по поприкриени техники што веројатно би можеле да ги користат.

Зависностите се сосема непредвидливи и добро познати: screenshot-desktop, nut-js, better-sqlite3, и socket.io-clientНема прилагоден протокол, нема C2 стек од почеток, ниту пак нов трик за перзистенција освен учебник. HKCU Run клучОва е компетентен интегратор, а не автор на алатки.

Не пронајдовме низи што не се на англиски јазик, вградени коментари, податоци за локацијата или отпечатоци од временските зони на излезот од компајлерот во објавените артефакти.

Проверивме дали кодот се преклопува со претходни кампањи што веќе ги следиме, вклучувајќи Шаи Хулуд, Овливион, Билдкајт и неодамнешниот хеибаи / claude-code-best Семејство на клонови од антропично-CLI. Не најдовме ништо: нема споделени C2 шеми, нема споделени распореди на датотеки и нема споделени идиоми.

Она што не би го кажале: дека станува збор за државен актер, позната група или географски поврзано со која било конкретна земја.

Оперативниот профил е во согласност со мал, средно квалификуван тим кој врши надзор на работната станица од страна на развивачот. Веројатно е финансиски мотивиран преку користење на пристапот низводно, но можеби и преку извидување како услуга за посебен купувач.

Две индиректни точки го поддржуваат тоа: избегнување на механизми за ексфилтрација што привлекуваат внимание и брзо би го „согориле“ кластерот, како што се ботовите на Telegram, oastify.com, или canarytokens, и намерно благите имиња на пакети, кои фаворизираат тивки инсталации со долга опашка во однос на краток скок со голем волумен.

Индикатори за компромитирање и откривање

Пакети и издавач
ПолеVrednost
издавач на npmuser0001
Е-пошта на издавачотtanvisoul9@gmail.com, непотврдено
делот пакетиcentralogger, dom-utils-lite, node-fetch-lite, агент-за-конектори, време-за-вршување-на-node-gyp, решавање-на-node-env
Потврдено злонамернојазол-env-resolve@1.0.7, јазол-env-resolve@1.0.8
Артефакти на домаќинот
типVrednost
Клуч за упорностHKCU\Software\Microsoft\Windows\CurrentVersion\Run
Вредност на перзистенцијаИме на променлива; податоци од формата wscript.exe " \\ .vbs"
Инсталирајте ја кукатаpostinstall: јазол postinstall.js во манифестот на пакетот
Модули за имплантиsrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Директориум за поставувањеINSTALL_DIR е решен надвор од node_modules на проектот; локацијата е поставена од postinstall.js во времето на инсталацијата.
мрежа
типVrednost
C2 транспортsocket.io-клиент, перзистентен двонасочен канал
Крајна точка C2Доставено до агентот преку променливата на околината SERVER_URL; не е цврсто кодирано во објавени артефакти

Белешки за откривање

Две правила го опфаќаат ова семејство без потреба од крајната точка C2.

Прво, означете ги постинсталациските скрипти што извршуваат внатрешна npm install во патека надвор од сопствениот директориум на пакетот. Секој легитимен преземач на претходна градба, како на пример node-gyp обновени или претходно изградени бинарни преземачи, запишува во пакетот или во платформата-standard кеш патеки со потврдени хашови. Не запишува во новокреиран INSTALL_DIR на друго место на дискот.

Второ, означете ги скриптите по инсталацијата што имаат проблем reg add HKCU\…\Run со wscript.exe како фрлач. Ова во суштина никогаш не е легитимно од npm пакет. Означете го и ставете го во карантин.

Трета евристика е корисна за откривање на следниот пакет-браќа и сестри пред да биде потврден: нов npm издавач без SCM верификација, е-пошта преку Gmail, не repository поле и повеќекратни кратки, генерички имиња на пакети што звучат како инфраструктура, објавени во рок од неколку дена едно од друго, само по себе е доволно за да се оправда рачен преглед.

Пријавено во регистарот на npm. Ќе ја ажурираме оваа објава кога сметката на издавачот ќе биде отстранета.

алатки-за-анализа-на-композиции-на-sca-алатки
Дајте приоритет, санирајте и обезбедете ги вашите софтверски ризици
Добијте ја вашата бесплатна сметка.
Не е потребна кредитна картичка.

Обезбедете го вашиот развој и испорака на софтвер

со Xygeni Product Suite