TL, д-р
Дваццаць npm-пакетаў, апублікаваных на працягу двух дзён у канцы ліпеня і пачатку жніўня 2026 года, прадстаўляюць сябе як унутраныя бібліятэкі кампанентаў карыстальніцкага інтэрфейсу і агульныя ўтыліты бэкенда. Ні адзін з іх не рэалізуе функцыянальнасць, якую рэкламуе. Кожны з іх пастаўляецца з класам-заглушкай, файлам README, які апісвае пакет як унутраны, і файлам пад назвай _polyfill.js.
Цікава тое, адкуль выклікаецца гэты файл. Гэта не ўсталёўны перахопнік — у маніфестах не аб'яўлена ніякая папярэдняя ўстаноўка, устаноўка або пасляўстаноўка. Замест гэтага апошні радок index.js абвяшчае: try { require("./_polyfill"); } catch (_) {}Карысная нагрузка запускаецца пры першым імпарце пакета кодам праграмы. Усталёўка з дапамогай --ignore-scripts, standard парады па змяншэнні ўздзеяння ланцужка паставак падчас усталёўкі, не перашкаджае гэтаму.
Што _polyfill.js атрымлівае спецыфічны для платформы выканальны файл з аднаго з трох хостаў Cloudflare Workers, запісвае яго ў часовы каталог пад выпадковым імем, пазначае яго як выканальны файл і запускае асобна ад бацькоўскага працэсу. Гэты выканальны файл сам па сабе з'яўляецца загрузнікам: ён пералічвае прадукты бяспекі канчатковых кропак па назве працэсу, правярае бягучае імя карыстальніка з вядомымі ўліковымі запісамі асяроддзя аналізу, выпраўляе тэлеметрычныя інтэрфейсы AMSI і ETW у памяці, усталёўвае persistence пад імем аўдыёкампанента Windows і атрымлівае трэці двайковы файл памерам у некалькі мегабайт. Трэці этап пастаўляецца зашыфраваным і... расшыфраваны і выкананы ў памяці, а не запісаны на дыск.
1 жніўня, прыкладна праз чатыры гадзіны пасля таго, як пакеты былі пацверджаны як шкоднасныя пры ручной праверцы, дзевятнаццаць з дваццаці імёнаў былі выдалены з npm іх уласным выдаўцом на працягу дваццаці пяці секунд. 2 жніўня адно з гэтых імёнаў было зарэгістравана зноў — іншым акаўнтам з тым жа кодам. На момант напісання гэтага тэксту інфраструктура дастаўкі абслугоўвала ўсе тры этапы.
| Пакеты | 20 імёнаў npm, ~74 апублікаваныя версіі |
| Тэмы наймення | beaver-ui-* (13) accounts-* (3), плюс afisha-storybook-default, bcore-bravo-eslint-config, arbocrate-sla-prober-arbocrate-sla-prober-core, a.poltoradnev-package-c |
| Трыгер | Імпарт модуля (require), а не сцэнар жыццёвага цыклу npm |
| этап 1 | _polyfill.js — пошук і запуск |
| этап 2 | Статычна звязаны загрузнік, UPX-спакаваны на Linux; пералік бяспекі канчатковых кропак, патчы AMSI/ETW, захаванасць |
| этап 3 | beacon_linux.bin / beacon_mac.bin / update_win.exe, 4–13 МБ; дастаўляецца зашыфраваным спосабам, выконваецца ў памяці |
| Платформы | Linux x64 і arm64, універсальны macOS, Windows x64 |
| Выдаўцы | Два акаўнты, адна база кода |
| Стан | 19 з 20 імёнаў не апублікаваныя аператарам; 1 перавыдадзена і даступная; інфраструктура дастаўкі даступная |
Анатомія атакі
Этап 1 — пакет
Кожны ўдзельнік адпраўляе адну і тую ж трохфайлавую форму. index.js экспартуе клас з ініцыяцыя() які ўстанаўлівае булева значэнне, версія()І наладзіць() які аб'ядноўвае аб'ект опцый. Больш нічога. README.md дае радок усталёўкі, a патрабаваць радок і сказ «Унутраны пакет. Глядзіце рэкамендацыі на CONTRIBUTING.md» — CONTRIBUTING.md няма ў тарболе.
_polyfill.js мае крыху менш за 5 КБ і чытаецца як звычайны код інфраструктуры. Ён адкрываецца з трыма праверкамі асяроддзя:
if (process.env.DISABLE_TELEMETRY ||
process.env.ANALYTICS_OPT_OUT ||
process.env.DO_NOT_TRACK)
return;Гэтыя зменныя — звычайныя элементы кіравання прыватнасцю. Тут яны кантралююць, ці спампоўваецца і выконваецца двайковы файл. Машына, якая ўстанаўлівае НЕ_АДСОЧВАЦЬ цалкам прапускаецца.
Далей ідзе штамп аднаразовага выканання: файл па адрасе /tmp/.analytics_stateабо стан_аналітыкі пры %TEMP% у Windows, час мадыфікацыі якога параўноўваецца з акном працягласцю 20 357 секунд. У гэтым акне модуль вяртае дадзеныя неадкладна, таму паўторныя імпарты падчас зборкі прыводзяць да адной спробы атрымання дадзеных, а не да дзясяткаў.
Прызначаныя хосты не прадстаўлены ў выглядзе літаралаў. Яны збіраюцца падчас выканання з фрагментаў:
["oob-worker.cf102-","baf.workers.d","ev"].join("")
Такім чынам ствараюцца тры хосты, якія перад выкарыстаннем перамешваюцца, таму парадак змяняецца ў залежнасці ад выканання. Атрыманне дадзеных ажыццяўляецца аператарам HTTPS GET, замацаваным на IPv4 з дапамогай Карыстальнік of node-fetch/2.6 — праўдападобнае значэнне, якое павінен выдаць працэс Node. Адказ памерам менш за 1,000 байт адкідаецца, і спрабуецца звязацца з наступным хостам.
Калі ўсе тры спробы не атрымаецца, модуль вяртаецца да DNS. Ён адпраўляе TXT-запыт для в. каб атрымаць колькасць фрагментаў, затым запытвае 0. праз н. пакетамі па дзесяць аб'ядноўвае адказы і дэкадуе вынік з дапамогай base64. Гэты шлях пераносіць той жа выканальны файл праз TXT-запісы DNS, які вытрымлівае асяроддзі, дзе выходны HTTP фільтруецца, але дазвол DNS не фільтруецца.
Атрыманыя байты запісваюцца ў /var/tmp/.cache_<8-hex> у Unix, або %TEMP%\dotnet_diag_<8-hex>.exe у Windows — імя файла, якое чытаецца як артэфакт дыягностыкі .NET. У Unix файлу прысвойваецца рэжым 0755. Запуск — нераст з асобны: праўда, stdio: «ігнараваць», і без спасылкі(), таму даччыны працэс перажыве працэс Node, які яго запусціў; у Windows выклік дадае windowsHide: true.
Дзве дэталі дапаўняюць карціну. Памочнік, якога вызначаюць як const _l = (…a) => process.stderr.write(“”) выклікаецца на кожным этапе пошуку — запісвае пусты радок і адкідае яго аргументы, займаючы пазіцыю, дзе знаходзілася б рэгістрацыя. І кожны пакет адпраўляе файл памерам 81 КБ па адрасе lib/telemetry.js у каментарыі да загалоўка якога апісваецца «Analytics SDK» з «HTTPS-транспартам з ратацыяй канчатковых кропак і паўторнай спробай» і «DNS-базавым выяўленнем службаў для пераключэння на іншы рэсурс». У бягучай зборцы гэтага не патрабуецца.
Этап 2 — пагрузчык
Бінарны файл Linux x64 — гэта статычна звязаны ELF, сціснуты з дапамогай UPX 3.96. Зборка для macOS — гэта ўніверсальны бінарны файл, які ахоплівае x86_64 і arm64; зборка для Windows — гэта ачышчаны выканальны файл кансолі PE32+. Усе чатыры былі атрыманы і правераны статычна; ні адзін не быў выкананы.
Імпарты і табліца радкоў зборкі Windows выразна апісваюць яе паводзіны. Яна вырашае Прысутнічае адладчык, CheckRemoteDebuggerPresent, і NtQueryInformationProcessі чытае СІСТЭМА\CurrentControlSet\Сэрвісы\Дыск\Пералік — шлях да рэестра, значэнні якога ідэнтыфікуюць кантролеры віртуальных дыскаў. Ён выклікае GetDiskFreeSpaceExW і GlobalMemoryStatusEx, што адпавядае праверцы таго, ці адпавядаюць рэсурсы хоста кароткачасоваму экзэмпляру аналізу.
Ён змяшчае спіс імёнаў карыстальнікаў: Бягучы карыстальнік, ІТ-адміністратар, Хонг Лі, ТЭСТАВАЯ КАРОБКА, hapubws, мілоз, таймі, адмін, шкоднаснага, ўзор, вірус, навакольнае асяроддзеНекалькі з іх з'яўляюцца артэфактамі публічна задакументаваных аналітычных асяроддзяў.
Ён таксама змяшчае спіс прадуктаў бяспекі канчатковых кропак і назвы іх працэсаў, пералічаных па CreateToolhelp32Snapshot і Process32FirstW/Process32NextW:
- CrowdStrike Falcon (
csfalconservice,CSFalconContainer) - Сажа (
cb.exe) - Cylance (
cylancesvc.exe) - Bitdefender (
bdagent.exe) - Kaspersky (
avp.exe,kavfs.exe) - Trend Micro і Deep Security (
coreServiceShell,ds_agent.exe) - FireEye/Trellix (
xagt.exe) - Таніум (
taniumclient.exe) - HitmanPro (
hmpalert.exe) - Эластычны (
elastic-agent.exe,elastic-endpoint,filebeat.exe,winlogbeat.exe) - Вазух і OSSEC (
wazuh-agent.exe,ossec-agent.exe) - Пункт кантролю
- Абаронца Windows
Прысутнічаюць яшчэ два сімвалы: AmsiScanBuffer, кропка ўваходу, якую Windows адкрывае для сканавання змесціва ў памяці, і EtwEventWrite, функцыя, з дапамогай якой Event Tracing for Windows запісвае падзеі. Абедзве з'яўляюцца распаўсюджанымі мэтамі для мадыфікацыі ўнутры працэсу, што падаўляе тэлеметрыю, якую ў адваротным выпадку стваралі б гэтыя інтэрфейсы.
У Windows слова «Persistence» з'яўляецца двойчы. Бінарны файл капіюецца ў %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exe, і на яго спасылаюцца два механізмы: значэнне пад ПРАГРАМНАЕ ЗАБЕСПЯЧЭННЕ\Microsoft\Windows\Бягучая версія\Выканацьі запланаваная задача, зарэгістраваная як
schtasks /Create /F /SC ONLOGON
/TN "\Microsoft\Windows\Multimedia\SystemSoundsService"
/TR "\"%s\""
/RL HIGHESTШлях да задачы, назва задачы і назва выканальнага файла адлюстроўваюць сапраўдны аўдыёкампанент Windows. /RL НАЙВЫШЭЙШЫ запытвае найвышэйшы даступны ўзровень прывілеяў.
Зборка macOS прытрымліваецца той жа схемы з адпаведнымі платформай назвамі: яна запісвае спіс уласцівасцей у ~/Бібліятэка/LaunchAgents/com.apple.windowserver.helper.plist і размяшчае выканальны файл па адрасе ~/.local/share/runtime/com.apple.runtimeЁн правярае /Прыкладанні/VMware Fusion.app і /Бібліятэка/Падтрымка праграм/Інструменты VMware.
Сеткавыя магчымасці ахопліваюць тры транспартныя сродкі: Файл WININET.dll для HTTPS з https://%s:%d%s радок фарматавання, WS2_32.dll разеткі, і DNSAPI.dll з DnsQuery_A разам з с.%s.%s фарматны радок — тая ж форма запыту на падлік блокаў, што і на першым этапе.
Прыведзенае вышэй апісанне паказвае, як паказваюць імпарт, радкі і шляхі рэестра двайковага файла пры праверцы. Публічны шматмодульны аналіз таго ж узору Windows дадае падрабязнасці, якія статычнае чытанне табліцы імпарту не можа вызначыць самастойна, і гэта прыпісваецца тут, а не перафармулявана як назіранне з першых рук. Гэты аналіз паказвае, што спасылкі на AMSI і ETW не проста вырашаны, але і выпраўлены — AmsiScanBuffer in amsi.dll і EtwEventWrite in ntdll.dll — які падаўляе сканаванне змесціва ў памяці і трасіроўку падзей для працэсу. Ён паведамляе пра праверкі антыаналізу як праверкі, заснаваныя на часе, у дадатак да CheckRemoteDebuggerPresentі вызначае GetThreadContext выклік як праверка апаратнага прыпынку, якая зчытвае рэгістры адладкі. Ён таксама паведамляе пра аднаэкземплярны м'ютэкс, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}і імёны Служба гукаў сістэмы як значэнне Run-key. Гэтага значэння мьютекса не было сярод адноўленых тут радкоў — фільтр экстракцыі выключыў токены ў вялікіх рэгістрах з фігурнымі дужкамі — і яно запісана ў табліцу індыкатараў на падставе гэтага публічнага аналізу, а не непасрэднага назірання.
этап 3
Загрузнік спасылаецца на дадатковы набор шляхоў на тых жа хостах. Усе яны былі даступныя падчас аналізу: beacon_linux.bin пры памеры 5.3 МБ, beacon_mac.bin пры памеры 13.3 МБ, update_win.exe пры 10.3 МБ і arm.bin пры памеры 4.3 МБ. Яны не былі атрыманы, і іх паводзіны невядомае.
Для шляху Windows публічны аналіз загрузніка апісвае, як апрацоўваецца трэці этап: ён атрымліваецца праз WinINet, паступае зашыфраваным, расшыфроўваецца ў памяці і выконваецца рэфлексіўна — выдзяляецца памяць, вырашаецца імпарт, апрацоўваюцца перамяшчэнні, і кіраванне перадаецца новаму патоку праз CreateThreadЗ гэтай прычыны дадзеныя трэцяга этапу ніколі не запісваюцца ў файлавую сістэму, таму выяўленне на аснове файлаў і экспертыза дыска пасля інцыдэнту не могуць з іх аднавіць. Гэта таксама азначае, што атрыманне байтаў з хоста дастаўкі прывядзе да атрымання зашыфраванага тэксту, а не да выканальнага файла, які можна прааналізаваць.
Timeline
Усе часавыя меткі паказаны па UTC і паходзяць з метададзеных рэестра npm, якія запісваюць стварэнне і адмену публікацыі пакетаў незалежна ад любога назіральніка.
| Калі | Што |
|---|---|
| 2026-07-31 09:25:05 → 09:29:56 | Дзесяць імёнаў створана, кожнае з якіх пачынаецца з версіі 0.0.1з розніцай прыкладна ў трынаццаць секунд. |
| 2026-08-01 09:38 → 11:29 | Існуючыя назвы падымаюцца праз завышаныя нумары версій, 6.1.9 праз 6.1.12, 9.9.9 праз 9.9.12, 8.9.3 праз 8.9.6, 5.4.6 праз 5.4.9. |
| 2026-08-01 13:04:14 → 13:04:18 | Яшчэ дзевяць beaver-ui-* імёны, створаныя чатырохсекундным імпульсам, кожнае з якіх апублікавана непасрэдна ў версіі 12.x без папярэдняй гісторыі. |
| 2026-08-01 ~13:00–14:30 | Версіі класіфікаваны як шкоднасныя пасля ручной праверкі. |
| 2026-08-01 17:39:49 → 17:40:14 | Дзевятнаццаць з дваццаці імёнаў былі апублікаваныя за дваццаць пяць секунд, паслядоўна, з інтэрвалам прыкладна ў 1.2 секунды. |
| 2026-08-02 18:58:41 | a.poltoradnev-package-c створаны зноў пад іншым уліковым запісам адміністратара, версія 0.0.2. |
| 2026-08-02 19:20:28 | версія 33.9.5 апублікавана пад тым жа імем. |
| 2026-08-02 20:14 | Усе тры хосты дастаўкі абслугоўваюць другі і трэці этапы; рэзервовы DNS адказвае з падлікам блокаў. |
Варта спыніцца на двух з гэтых запісаў.
Выбух 13:04 за чатыры секунды дадаў у рэестр дзевяць пакетаў, кожны з якіх меў па адной версіі ў дванаццаці і ніводнай 0.0.1 пад ім. Нумары версій у такім маштабе, з назвамі аднаго дня таму, не апісваюць гісторыю выпускаў.
Паслядоўнасць адмены публікацыі гэтак жа механічная: дзевятнаццаць імёнаў, дваццаць пяць секунд, роўныя прамежкі. npm фіксуе іх як звычайныя падзеі адмены публікацыі, а не як запаўняльнік, які пакідае выдаленне, ініцыяванае рэестрам, што размяшчае дзеянне на ўліковым запісе публікацыі, а не ў рэестры.
Паказчыкі кампрамісу
Хасты і шляхі выдаляюцца. Не вырашайце і не атрымлівайце іх з працоўнай сістэмы.
| тып | значэнне |
|---|---|
| Хост дастаўкі | oob-worker[.]cf99-9b3[.]workers[.]dev |
| Хост дастаўкі | oob-worker[.]cf102-baf[.]workers[.]dev |
| Хост дастаўкі | oob-worker[.]cf103-070[.]workers[.]dev |
| DNS-транспарт | tin[.]dl[.]well1[.]site (Linux x64), tina[.] (arm64), ldr[.] (macOS), win[.] (Windows) — падлік блокаў у c.<domain>, дадзеныя па адрасе <n>.<domain> |
| Шляхі этапу 2 | /pkg/package, /pkg/package-arm64, /pkg/loader_mac, /pkg/package.exe |
| Шляхі этапу 3 | /pkg/beacon_linux.bin, /pkg/beacon_mac.bin, /pkg/update_win.exe, /pkg/arm.bin |
| Шлях скідання (Unix) | /var/tmp/.cache_<8-hex> |
| Шлях падзення (Windows) | %TEMP%\dotnet_diag_<8-hex>.exe |
| Захаванне (Windows) | %APPDATA%\Microsoft\Windows\Themes\SystemSoundsService.exeзадача \Microsoft\Windows\Multimedia\SystemSoundsServiceЗначэнне ключа запуску SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SystemSoundsService |
| М'ютэкс (Windows) | Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9} |
| Устойлівасць (macOS) | ~/Library/LaunchAgents/com.apple.windowserver.helper.plistдвайковы код па адрасе ~/.local/share/runtime/com.apple.runtime |
| Штамп «Аднаразовы запуск» | /tmp/.analytics_state, %TEMP%\analytics_state (Акно 20 357 с) |
| Запыт на подпіс | HTTPS GET, замацаваны на IPv4, карыстальніцкі агент: node-fetch/2.6 |
| Файл этапу 1 | _polyfill.js, SHA-256 392dc9ec85042ce1796bfa9b8c7bf6e05c7710579aab8b7b1eb73788683883af |
| Неспасылачны файл | lib/telemetry.js, SHA-256 2266c9b8e199daebe31a9afcb61d9b0d76706b63c92312fc8223d22de42e63c7 |
| Этап 2 (Linux x64) | SHA-256 7e486657f30594afda379b97030252a09a19fe8055e25c9e371544f59bd8e9e3 |
| Этап 2 (Linux arm64) | SHA-256 aafc37589c0d21fb729761a1579ca3b278b95bce152aacfa29243ffd27f5eeb7 |
| Этап 2 (macOS) | SHA-256 c214746c74cae8ece8bdaf69aa05da4db6ce013f9e77452d1eed1a002fd9ba00 |
| Этап 2 (Windows) | SHA-256 d632c2c0c7801c3da57cf849fe4b4ca8351d9a7fe73c31050bf5dbcc96a16791 |
Назвы пакетаў
Атрыбуцыя і назіраная паводзіны
У справу ўцягнуты два акаўнты npm. Дзевятнаццаць неапублікаваных імёнаў былі апублікаваныя адным акаўнтам; a.poltoradnev-package-c быў перарэгістраваны 2 жніўня пад іншым імем уліковага запісу і іншым даменам электроннай пошты. Код мае тую ж лінію паходжання ў абодвух выпадках, а другая рэгістрацыя мае тыя ж хосты дастаўкі, тыя ж рэзервовыя дамены DNS, тую ж канструкцыю шляху перазагрузкі і тую ж метку аднаразовага выканання.
Перавыдадзеная пара таксама паказвае, як яна была сабрана. Версіі 0.0.2 і 33.9.5 ідэнтычныя па байтах, акрамя радка версіі ў package.json, А index.js пастаўляецца як 0.0.2 заяўляе канстантная ВЕРСІЯ = “33.9.5”Абодва артэфакты былі выразаны з аднаго дрэва-крыніцы і пасля пранумараваны. Няма 0.0.2 гісторыя развіцця для 0.0.2 вызваліць для прадстаўлення.
Нумарацыя версій ва ўсім наборы адпавядае той жа логіцы. Назвы пакетаў у гэтай кампаніі чытаюцца як рэчы, якія існавалі б унутры арганізацыі, а не ў публічным рэестры: набор кампанентаў карыстальніцкага інтэрфейсу, канфігурацыя ESLint, зонд SLA, пакет, названы ў гонар чалавека. Калі зборка вырашае залежнасць па назве і звяртаецца да публічнага рэестра разам з прыватным, перамагае версія з больш высокім нумарам. Назва, створаная ў 0.0.1 у панядзелак і нясучы 12.9.6 у аўторак ёсць магчымасць такога параўнання.
Дзве хвалі публікацый таксама адрозніваюцца тым, што наводзіць на думку пра ітэрацыю. Папярэдні код называў свой файл карыснай нагрузкі setup.js і пералічыў пяць хостаў дастаўкі; бягучы файл мае назву _polyfill.js і пералічвае тры. Папярэдняя версія выдаляла выдалены файл праз пяць секунд пасля запуску, пакідаючы працэс запушчаным з выдаленага inode; бягучая версія гэтага не робіць. Неспасылка на які не спасылаецца lib/telemetry.js застаецца ў архіве для абодвух, усё яшчэ пастаўляецца, больш не падключаны.
Варта загадзя адзначыць адно назіранне адносна выключальнікаўcisэлі, таму што гэта супярэчыць распаўсюджанаму разуменню. DISABLE_TELEMETRY, АНАЛІТЫКА_АДМОВА_АД_АЎТАРЫЗАЦЫІ, і НЕ_АДСОЧВАЦЬ выконваюцца, і яны правяраюцца перад тым, як што-небудзь яшчэ адбудзецца. Даследчык, чыё асяроддзе аналізу ўстанаўлівае які-небудзь з іх, назірае пакет, які нічога не робіць.
Уплыў і што могуць зрабіць абаронцы
Практычныя наступствы трыгера ў часе імпарту вузкія і вартыя асобнага разгляду. npm install –ignore-scripts прадухіляе выкананне скрыптоў жыццёвага цыклу, і гэта слушная парада. Тут гэта не мае ніякага эфекту, бо гэты код не выкарыстоўвае скрыпт жыццёвага цыклу. Карысная нагрузка запускаецца, калі код прыкладання, тэставы запуск, бэндлер або лінтэр спачатку імпартуюць модуль. У CI-запуску, які ўсталёўвае, а затым адразу збірае, паміж імі ёсць некалькі секунд.
Для палявання трывалыя сігналы маюць структурны, а не літаральны характар. Хасты, імя файла і шляхі пераходу зменяцца; гэтыя формы цяжэй змяніць:
- Кропка ўваходу ў модуль, апошні аператар якой з'яўляецца паспрабуйце { патрабуецца(“./x”); } злавіць (_) {} вакол файла, які не з'яўляецца часткай экспартаванага API. Пакет з сапраўдным поліфілам імпартуе яго зверху і выкарыстоўвае яго вынік. Праглынанне кожнай памылкі з імпарту знізу файла не з'яўляецца апрацоўкай памылак.
- Радкі хаста, сабраныя .join("") з масіва фрагментаў. У легітымнага кода няма падстаў для падзелу імя хаста паміж элементамі масіва.
- Пакет, аб'яўленыя залежнасці якога пустыя, але які шукае HTTPS, dns, і даччыны_працэс падчас імпарту. Атрыманне дадзеных і выкананне ў пакеце, які рэкламуе кампанент карыстальніцкага інтэрфейсу, — вось і ўся знаходка.
- Нумары версій не адпавядаюць узросту пакета. Назва, упершыню апублікаваная некалькі дзён таму з двухзначным тыражом мажорнай версіі, без прамежкавых рэлізаў, апісвае нешта іншае, чым яго развіццё.
- Піша каму / var / tmp or %TEMP% за якім варта CHMOD да 07:55 і асобнага месца нараджэння. Паслядоўнасць кароткая, упарадкаваная і рэдка бывае дабраякаснай разам.
На хостах Windows ёсць дзве недарагія праверкі з высокай дакладнасцю. Артэфакты захоўвання дадзеных — гэта фіксаваныя радкі, і ні адзін з іх не павінен знаходзіцца ў чыстай сістэме: запланаваная задача ў \Microsoft\Windows\Multimedia\SystemSoundsService, значэнне ключа запуску з імем Служба гукаў сістэмыі выканальны файл з такой назвай пад %APPDATA%\Microsoft\Windows\Тэмы\Сапраўдная аўдыёслужба Windows не знаходзіцца ні ў адным з гэтых месцаў. Па-другое, загрузчык выкарыстоўвае фіксаваны аднаэкземплярны м'ютэкс, Global\{7A3B9E1F-C2D4-4F8A-B5E6-D7A1F0C3E2B9}; яго прысутнасць на хасце з'яўляецца індыкатарам, і паколькі загрузчык разглядае існуючы м'ютэкс як «ужо запушчаны», яго папярэдняе стварэнне з'яўляецца жыццяздольнай кароткатэрміновай прышчэпкай, пакуль запланавана выпраўленне.
Выяўленне на трэцім этапе — больш складаная праблема, і варта ўдакладніць, што гэта такое. Згодна з публічным аналізам, дадзеныя расшыфроўваюцца і адлюстроўваюцца ў памяці, а не запісваюцца на дыск, таму сканаванне файлаў і дыскавая экспертыза не змогуць іх выявіць. Заўважным застаецца толькі ўласны след загрузніка — запісы захоўвання, м'ютэкс і выходныя запыты да хастоў дастаўкі або даменаў DNS-TXT.
Для асяроддзяў, якія вырашаюць залежнасці як з прыватнага, так і з публічнага рэестра, змякчэнне наступстваў застаецца нязменным ні з аднаго з гэтых пунктаў: унутраныя назвы абласцей дзеяння, каб публічная назва не магла ім адпавядаць, і замацаванне рашэння ва ўнутраным рэестры для гэтых абласцей дзеяння. Паводзіны, звязаныя з павелічэннем версій, апісаныя вышэй, працуюць толькі там, дзе вышэйшая публічная версія можа атрымаць назву.
Нарэшце, варта ўважліва прачытаць гэты артыкул, а не лічыць яго канцоўкай. Дзевятнаццаць імёнаў пакінулі рэестр за дваццаць пяць секунд, а адно вярнулася праз дзень пад новым уліковым запісам, прычым інфраструктура дастаўкі засталася некранутай на працягу ўсяго працэсу. Выдаленне пакетаў не з'яўляецца выдаленнем аперацыі; пакуль гэта пісалася, хосты працягвалі абслугоўваць кожны этап. Любое дрэва залежнасцей, якое дазволіла выканаць адно з гэтых імёнаў паміж 31 ліпеня і 1 жніўня, павінна разглядацца як такое, што мела магчымасць выканаць першы этап, незалежна ад таго, існуе гэтае імя.
Спасылкі
- Шматрухавіковы аналіз загрузніка Windows — крыніца для патчаў AMSI/ETW, рэфлексіўнага выканання ў памяці і падрабязнасцей м'ютэксаў, згаданых вышэй.
- Дакументацыя па npm-скрыптах — падзеі жыццёвага цыклу, якія гэтая кампанія не выкарыстоўвае.
- дакументацыя па ўсталёўцы npm — вокладкі –ігнараваць-скрыпты і яго сфера прымянення.







