PhantomSync: npm крипто пакети сакривају крађу новчаника

PhantomSync: осам npm пакета за крипто-програмере крије одложени, самостални дроппер

ТЛ; ДР

Један нпм издавач је испоручио осам малих пакета чија имена гласе као свакодневни градивни блокови за развој блокчејна и новчаника, base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, i crypto-validate-libСваки од њих садржи функционалан услужни програм. Међутим, након тог услужног програма додаје се самопозивајући блок кода који се покреће чим се модул увезе.

Отприлике 37 секунди након увоза, тај блок декодира корисни терет који се испоручује унутар пакета прерушен у тестну опрему, записује га у скривену датотеку у кућном директоријуму корисника, региструје се за поновно покретање сваких login на Windows-у, macOS-у и Linux-у, и покреће декодирани скрипт као одвојени процес. Ништа од овога се не покреће током npm инсталације; чека се да се код увезе и покрене, што је мирнији тренутак од инсталације.

Корисни терет није непрозиран. Испоручује се као обичан base64, тако да декодирање „тестног уређаја“ у потпуности враћа другу фазу: a крипто-новчаник и крађа тајни који чека да машина мирује, прикупља приватне кључеве и почетне фразе, шифрује сваки налаз чврсто кодираним RSA-4096 кључем и извлачи га тако што га закачи на јавну IPFS меморију, враћајући га назад сваких 12 сати.

Пратимо кластер као Фантомска синхронизацијаСвих осам пакета је било активно у npm регистру у време анализе, објављено под једним налогом.

Екосистемнпм
Пакетиbase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
Циљане платформеВиндовс, мацОС, Линук
Основно понашањеОдложени, дропер за време увоза скривен као тестна исправка; инсталира перзистентност на више платформи
Користан теретКрађа крипто новчаника и тајни, RSA-4096 енкрипција, крађа путем јавног IPFS пиновања

Анатомија напада

Сваки пакет на први поглед изгледа неупадљиво. base58-utils, на пример, је неколико килобајта помоћног кода Base58 / Bitcoin-WIF без зависности — управо оно што име обећава. Релевантни код се налази после модула модул.извоз, где је мало вероватно да ће читалац који прелистава врх датотеке погледати: самопозивајућа функција која се сама заказује помоћу тајмера.

Ланац операција, реконструисан из изворног кода пакета, функционише овако:

1. Package is required() by the host project 2. A self-invoking function schedules a callback ~37,000 ms later (setTimeout) 3. On fire, the callback reads test/fixtures/keypairs.dat (a base64 blob) 4. It base64-decodes that blob into a Node.js script 5. It writes the script to ~/.cache-db/.node-sync/syncd.js (mode 0o700) 6. It installs login-persistence for that script (see below) 7. It spawns "node syncd.js" as a detached process

Два дизајнерска избора се истичу.

Терет путује као тестно причвршћивање. Друга фаза није написана као очигледан код. Она се налази у тест/фикстуре/парови кључева.дат, base64 датотеку чије се име уклапа у пакет који тврди да обрађује парове кључева. Човеку који прегледа tarball, изгледа као пример података; за додатни код, то је скрипта коју треба декодирати и покренути. Сам дропер не садржи мрежну адресу — оне се налазе у другој фази — али нема додатног замагљивања: фикстер је један слој base64, тако да његово декодирање (base64 -d) опоравља пуну вредност syncd.js и његово понашање на мрежи. Следећи одељак ће објаснити шта та опорављена фаза ради.

Детонација је одложена и везана за увоз, а не за инсталацију. Јер је окидач захтевати () плус тајмер од ~37 секунди уместо инсталационе закачке, понашање заобилази провере које само прате нпм инсталл корак, а кашњење траје дуже од многих краткотрајних sandbox и CI покретања. Док се било шта изврши, инсталација која је преузела пакет је одавно завршена.

Када се декодирани скрипт нађе на диску на ~/.cache-db/.node-sync/syncd.js — путања изабрана да се чита као рутински директоријум кеша — дропер омогућава да преживи поновна покретања система на све три главне платформе:

  • Линук: cron унос који поново покреће скрипту. Унос се инсталира филтрирањем постојећег crontab-а кроз grep -v syncd, што има споредни ефекат изостављања новог уноса из обичног списка који грепује за исто име.
  • Виндовс: заказани задатак под називом WinNodeSync, подешено да се реприза изводи у интервалу од 12 минута.
  • мацОС: launchd задатак означен com.apple.syncd, присутна у неколико пакета — ознака која имитира легитимну системску услугу компаније Apple.

Скрипта се затим одмах покреће као одвојени процес, тако да наставља да се извршава након што се програм за увоз заврши.

Шта ради друга фаза

Пошто је уређај један base64 слој, друга фаза се декодира чисто и може се прочитати у целости. Свих осам пакета садржи једну од три варијанте истог скрипта, који се идентификује у коментару заглавља као пхантом синцд в3 — топо дурмиенте („успавана кртица“). Његов задатак је да украде материјал за криптовалутни новчаник и тајне програмера и да их пошаље са машине. Ради на следећи начин:

  • 1. Сачекајте док машина не престане да ради. Пре него што било шта уради, syncd.js проверава колико дуго је корисник био неактиван и наставља тек након одређеног прага (око 15 минута) — xprintidle на Линуксу, иорег HIDIdleTime на macOS-у и PowerShell упит за време неактивности на Windows-у. Прикупљање података се стога обично дешава када нико није за тастатуром.
  • 2. Набавите прекидач за активацију са даљинским управљањемСкрипта повлачи малу конфигурацију из мртве базе података пре него што почне да делује. Примарни извор је сирови URL са GitHub-а (gist.githubusercontent.com/juang55/…/cfg.txt); скрипта се активира само ако та конфигурација гласи активно=1Ако суштина није доступна, враћа се на три чврсто кодирана IPFS идентификатора садржаја, преузета преко јавних пролаза. gateway.pinata.cloud, ипфс.ио, i cloudflare-ipfs.comОво даје оператеру накнадну контролу активирања/разоружавања и могућност повратка отпорну на уклањање. (Најмања варијанта, испоручује се у crypto-validate-lib, помоћници за eth-новчаник, i solana-key-utils, уклања gist слој и ослања се само на IPFS идентификаторе.)
  • 3. Прикупите материјал за новчаник и тајне. Скрипта обилази кућни директоријум корисника — ~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.хардшат, ~ / .ссх, i Десктоп/Документи/преузимања (укључујући имена фасцикли на шпанском језику), плус ~/.env и rc датотеке shell-а, и еквивалент АппДата локације на Windows-у. Циља приватне кључеве Ethereum-а, Bitcoin WIF кључеве, BIP-39 семенске фразе, Solana парове кључева, Ethereum складиште кључева JSON, SSH кључеве и променљиве окружења које носе тајне податке. Већа варијанта (у abi-encode, base58-utils, eth-dev) садржи комплетан BIP-39 речник од 2048 речи и користи регуларне изразе за извод појединачни кључеви и валидиране почетне фразе из било ког текста који чита; две мање варијанте уместо тога подударају датотеке по кључној речи (семе, мнемонски, новчаник, метамаск, фантом, главна књига, кутија, ...) и отпремајте целе датотеке.
  • 4. Шифрујте и ексфилтрирајте путем јавне услуге за качење. Сваки налаз је повезан са отиском прста домаћина (корисничко име@имедомаћина, платформа, временска ознака) и шифровано помоћу чврсто кодираног јавног кључа RSA-4096 уграђеног у скрипту. Шифровани запис се затим отпрема закачињем на IPFS путем api.pinata.cloud/pinning/pinJSONToIPFS, аутентификован помоћу чврсто кодираних Pinata API акредитива. Не постоји посебан C2 сервер за преузимање: украдени подаци су паркирани у јавном децентрализованом складишту, које оператер може да преузме користећи резултујуће хешеве садржаја. Отпремања су размакнута са неколико секунди насумичног подрхтавања, а локални лог временска ознака | тип-кључа | враћени-хеш се чува на ~/.cache-db/.node-sync/.sl.
  • 5. Истрајте и користите светионик у циклусу од 12 сати. Друга фаза поново успоставља сопствену перзистентност — cron унос на Линуксу, com.apple.syncd launchd задатак на macOS-у и заказани задатак под називом WindowsNodeSync на Windows-у — подешено да се поново покреће сваких 12 сати. Имајте на уму да је ово различит Назив Windows задатка из оног који инсталира дропер (WinNodeSync); оба вреди тражити.

Тимелине

Осам пакета је објављено у кратком року 13. и 14. јула 2026. Неколико њих има више од једне верзије; дропер је идентичан у свим верзијама, само се помераји линија мењају како се мења величина бенигног услужног кода изнад њега.

datum догађај
2026-07-13 Први пакети у кластеру се појављују под једним издавачем (solana-key-utils, eth-wallet-helpers, crypto-validate-lib и ране верзије осталих)
2026-07-13 → 07-14 Објављена преостала имена и накнадне верзије; исти додатни бродови за спуштање у сваком
2026-07-14 Свих осам је означено и анализирано; сваки пакет се и даље може инсталирати из регистра

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

Индикатори компромиса

Сви доле наведени индикатори су потврђени као присутни у време анализе — они у табелама „Друге фазе“ декодирањем тест/фикстуре/парови кључева.дат и читање опорављеног syncd.js.

Датотеке и путање

Индикатор Улога
~/.cache-db/.node-sync/syncd.js Декодирана друга фаза, написана са режимом 0o700
~/.cache-db/.node-sync/.sl Локални дневник извлачења података (временска ознака | тип кључа | IPFS хеш)
test/fixtures/keypairs.dat Base64-кодирани корисни терет смештен унутар tarball-а као „тестни уређај“

Мрежна инфраструктура друге фазе (опорављена из syncd.js)

Индикатор Улога
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt Активација без привременог затварања; скрипта се покреће само ако је конфигурација прочитана active=1
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga Резервна конфигурација IPFS-а (CID)
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF Резервна конфигурација IPFS-а (CID)
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp Резервна конфигурација IPFS-а (CID)
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com IPFS gateway-и који се користе за преузимање резервне конфигурације
api.pinata.cloud/pinning/pinJSONToIPFS Крајња тачка ексфилтрације, украдени подаци закачени на јавни IPFS
Пината API кључ 13c766575b9270a9825d, чврсто кодирани акредитив за ексфилтрацију

Циљеви колекције друге фазе (преузети из syncd.js)

Индикатор Улога
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.env, rc датотеке shell-а Директоријуми/датотеке претраживани за кључеве и тајне
AppData\Roaming\Solana, AppData\Local\ethereum\keystore Претраживани Windows еквиваленти
Врсте артефаката сакупљене ETH приватни кључеви, Bitcoin WIF, BIP-39 семенске фразе, Solana парови кључева, Ethereum складиште кључева JSON, SSH кључеви, тајне променљиве окружења

Артефакти перзистенције

Платформа Индикатор
линук покретање cron уноса syncd.js; инсталирано преко crontab-а филтрирано кроз grep -v syncd
виндовс заказани задатак WinNodeSync (капаљка) и WindowsNodeSync (друга фаза)
Мац ОС лансирана ознака com.apple.syncd
Sve Друга фаза се понавља у циклусу од 12 сати.

бехавиорал

  • Самопозивајућа функција додата је после модул.извоз, заказивање а сетТимеоут од ~37,000 мс при увозу.
  • дете_процес спавн(„чвор“, ) са одвојеним скупом опција.
  • Активација у празном ходу у другој фази (xprintidle / иорег Време неактивности HIDIdleTime / PowerShell-а; праг од ~15 минута).
  • RSA-4096 шифровање по проналажењу, затим HTTPS ПОСТ на јавни IPFS API за закачињавање.

Пакети и верзије (npm, издавач solbuilder_io)

пакет верзије
base58-utils КСНУМКС, КСНУМКС, КСНУМКС
abi-encode КСНУМКС, КСНУМКС, КСНУМКС
eth-dev КСНУМКС, КСНУМКС, КСНУМКС
arb-kit КСНУМКС, КСНУМКС
layer2-sdk КСНУМКС, КСНУМКС
solana-key-utils 1.0.0
eth-wallet-helpers 1.0.0
crypto-validate-lib 1.0.0

Издавач

  • солбуилдер_ио - angel_lopez89[@]proton[.]me, имејл адреса није верификована, нема верификованог налога за контролу изворног кода, нема повезаног репозиторијума.

Атрибуција и посматрано понашање

Осам пакета деле један издавачки налог и један корисни терет. Сваки је тривијалан пакет — неколико килобајта правог корисничког кода са истим додатним дропером — објављен без повезаног спремишта и под неверификованом имејл адресом за једнократну употребу. Та униформност, заједничка путања дроповања, заједничке ознаке перзистентности и заједнички keypairs.dat Припремне датотеке су оно што повезује кластер.

Пакети су необично искрени у вези са сопственим понашањем. solana-key-utils садржи уграђене коментаре који описују додатни блок једноставним речима — означава се ФАНТОМ: невидљива упорност, други (на шпанском) гласи Избаци топографију у позадину, „покрени кртицу у позадини“. Ово су сопствене напомене кода о томе шта ради; назив кампање у овој објави је извучен из те прве ознаке заједно са лажним чвором „sync daemon“ (синцд) коју машина за истрајност имитира.

Описујемо само оно што код видљиво ради. Именовање пакета — сви термини се односе на криптовалуте, новчанике и блокчејн алате — указује на програмерску публику која ће их највероватније преузети по имену; само по себи не утврђује ко је издавач. Друга фаза је била у потпуности обновљива декодирањем base64 фиксне јединице, а њено понашање је описано горе: она прикупља кључеве новчаника, семенске фразе и тајне и извлачи их, RSA-шифроване, у јавну IPFS меморију путем Пинате. Значајан избор дизајна је одсуство приватног C2 сервера — конфигурација стиже са GitHub gist-а и IPFS-а, а украдени подаци се паркирају у јавној децентрализованој меморији са кључем хеша садржаја, а оба су теже за преузимање него један хост који контролише нападач. У време писања овог текста нису пронађени претходни јавни извештаји који се подударају са овим кластером.

Ко је изложен. Свако ко је додао један од ових пакета у Node пројекат, а затим покренуо код који га увози. Пошто је детонација у време увоза, а не инсталације, само присуство пакета није довољно — али свака нормална употреба која учитава модул достиже корисни терет. Називи мамаца циљају програмере који раде на Ethereum-у, Solana-и, Arbitrum-у, Layer-2 и општим алатима за новчанике/кодирање — популацији која највероватније има управо средства која друга фаза тражи. Свако ко је покренуо један од ових модула на машини која држи кључеве новчаника, сеенд фразе, складишта кључева, SSH кључеве или .енв тајне би требало да третирају те акредитиве као угрожене и да их ротирају.

Два обрасца вредна усвајања. Прво, корисни терет као причвршћивач: испорука друге фазе као base64 унутар датотеке са вероватно именованим именом (тест/фикстуре/парови кључева.дат) одржава видљиви извор пакета чистим и гура злонамерни садржај у датотеку коју алати за преглед и људски прегледи често третирају као инертне податке. Друго, Одложено извршавање при увозу са перзистентношћу на више платформиПомерање окидача са инсталационе удице, додавање тајмера, а затим његово постојање у cron-у, заказаним задацима и launchd-у је намерни корак удаљавања од бучнијих техника инсталационих скрипти које аутоматизовано скенирање регистра најпажљивије прати.

Упутство за браниоце и одржаваоце:

  • Третирај додатни код након модул.извоз као приоритет прегледа — логика дропера се често крије испод „праве“ површине модула.
  • Не претпостављајте да су датотеке са подацима инертне. Base64 blob под тест/припреме/ који се чита током извршавања и декодира је суседан извршној датотеци; означи читања датотека фикстура током извршавања које доводе функција/евал/напиши-па-мријест ланац.
  • Потрага за стазом за спуштање ~/.cache-db/.node-sync/ и за јединице перзистенције WinNodeSync (заказани задатак) и com.apple.syncd (launchd) на машинама програмера које су извукле ова имена.
  • Упозорење о Node процесима који креирају cron уносе, заказане задатке или launchd послове — легитимне библиотеке ретко то раде при увозу.
  • Преферирајте закључане датотеке и закачене верзије и прегледајте разлику било које нове мале „услужне“ зависности, посебно објављени пакети са нултом зависношћу од стране непроверених налога без повезаног репозиторијума.

За заштитнике регистра, закључак је да је праћење инсталационих закачки неопходно, али није довољно: дропер са временским одлагањем током увоза, постављен унутар датотеке са подацима, проћи ће проверу само током инсталације, а корак перзистенције је често најгласнији видљиви сигнал који преостаје за ухватити.

sca-tools-software-composition-analysis-tools
Приоритизујте, отклоните и обезбедите ризике везане за ваш софтвер
Набавите свој бесплатни налог.
Није потребна кредитна картица.

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

са Xygeni пакетом производа