Вы нашли или получили .js-файл, который вызывает сомнения. Может, это скрипт с сомнительного сайта, может, его прислали вам, может, он лежит в проекте и вы не помните, откуда он взялся. В любом случае запускать его напрямую — плохая идея. Разберёмся, как безопасно понять, что именно делает этот скрипт, не рискуя системой или данными.
- Зачем вообще анализировать JS-файлы
- Два подхода: статический и динамический анализ
- Когда какой подход выбирать
- Этап 1: Быстрый статический осмотр
- Что ищем глазами
- Если код обфусцирован
- Этап 2: Настройка безопасной среды
- Три варианта песочницы
- Минимальная безопасная конфигурация
- Этап 3: Динамический анализ с помощью DevTools
- Шаг 1: Вкладка Network — что скрипт отправляет наружу
- Шаг 2: Вкладка Sources — пошаговое выполнение
- Шаг 3: Вкладка Console — что скрипт выводит
- Этап 4: Специализированные инструменты
- Этап 5: Декодирование и деобфускация
- Красные флаги: что сразу выдаёт вредоносный скрипт
- Частые ошибки при анализе
- Как документировать результаты анализа
- Итоговый алгоритм действий
Зачем вообще анализировать JS-файлы
JavaScript — это исполняемый код, который работает прямо в браузере. Теоретически он ограничен песочницей браузера, но на практике вредоносный скрипт может:
- красть сессионные куки и токены авторизации;
- отправлять содержимое форм, включая пароли, на сторонний сервер;
- манипулировать страницей — подменять формы, внедрить фишинговые элементы;
- делать запросы от вашего имени, используя вашу сессию;
- пытаться использовать уязвимости браузера для выхода за пределы песочницы.
Поэтому анализ JS — это не академическое упражнение, а рабочая задача. И главный принцип: никогда не запускайте незнакомый скрипт там, где вам жалко данные.
Два подхода: статический и динамический анализ
Есть два принципиально разных способа разобраться в JS-файле:
- Статический анализ — читаем код без запуска, ищем подозрительные паттерны, структуры, вызовы.
- Динамический анализ — запускаем в изолированной среде и смотрим, что он реально делает во время выполнения.
Статический — быстрее и безопаснее, но хуже работает с обфусцированным (запутанным) кодом. Динамический — показывает реальное поведение, но требует подготовки изолированной среды.
Когда какой подход выбирать
- Код читаемый, не обфусцированный — начинаем со статического анализа.
- Код выглядит как «каша» из символов — скорее всего, обфусцирован, без динамики не обойтись.
- Нужно быстро проверить, не делает ли скрипт запросов на странные домены — достаточно статического поиска по строкам.
- Подозрение на манипуляции с DOM или кражу данных из форм — нужен динамический анализ отслеживания сетевых запросов и обращений к DOM.
Этап 1: Быстрый статический осмотр
Первое, что делаем — открываем файл в любом текстовом редакторе. Не в браузере, не двойным кликом — в редакторе кода. VS Code, Notepad++, даже блокнот подойдут для начала.
Что ищем глазами
- Строки, похожие на URL — ищем что-то вроде
http://,https://,/api/,xmlhttprequest. Если скрипт куда-то отправляет данные — это первое, что бросится в глаза. - Обращение к localStorage и sessionStorage — нормальные скрипты иногда используют хранилище, но если файл претендует на аналитику или виджет, а пишет в storage ключи со странными именами — это красный флаг.
- Доступ к document.cookie — явный признак, что скрипт пытается вытащить куки. Для аналитических скриптов это не обязательно, а для вредоносных — типично.
- eval, Function(), setTimeout/setInterval с текстовым аргументом — всё это способы выполнить код, который хранится в строке. Часто используются, чтобы скрыть реальные действия от визуального осмотра.
- PostMessage — если скрипт что-то передаёт через
window.postMessage, значит он пытается общаться с другими окнами или iframe на странице.
Если код обфусцирован
Когда код выглядит как плотный кусок hex-строк, массивы символов и странные преобразования — не пытайтесь разобрать его вручную. Это займёт часы и не даст гарантий. Сразу переходите к динамическому анализу в песочнице.
Этап 2: Настройка безопасной среды
Это ключевой момент. Если на этом сэкономить — дальнейший анализ теряет смысл, потому что вы будете запускать потенциально вредоносный код в среде, которую жалко.
Три варианта песочницы
| Вариант | Изоляция | Сложность настройки | Когда подходит |
|---|---|---|---|
| Песочница браузера (например, BrowserSandbox, JSDetox) | Средняя — работает в вашей ОС | Низкая — загрузил файл или открыл вкладку | Быстрый просмотр взаимодействия скрипта с DOM без настройки виртуалки |
| Виртуальная машина (VirtualBox, VMware) | Высокая — полная изоляция через гипервизор | Средняя — нужно установить и настроить ОС | Полноценный анализ поведения с возможностью развернуть ВМ заново |
| Песочница ОС (Sandboxie, Windows Sandbox, firejail на Linux) | Средне-высокая | Низкая–средняя | Быстрый запуск браузера в изолированной среде без установки полноценной ВМ |
Минимальная безопасная конфигурация
Что обязательно нужно сделать перед запуском подозрительного JS:
- Отключите сеть или переведите ВМ в изолированный режим (Host-Only или вообще без адаптера). Если скрипт не может отправлять данные наружу — его вредоносность сильно ограничена.
- Никаких ваших данных — заведите отдельный чистый браузер или чистый профиль, без сохранённых паролей, кук, расширений.
- Установите расширения для отслеживания — NoScript, uBlock Origin в режиме полного запрета скриптов, инструменты разработчика (Chrome DevTools / Firefox Developer Tools) с открытой вкладкой Network.
- Подготовьте систему мониторинга — если ВМ позволяет сеть (вы решили включить для наблюдения за запросами), запустите Wireshark или Fiddler для перехвата трафика.
Этап 3: Динамический анализ с помощью DevTools
Это основной рабочий инструмент при анализе JS в браузере. Открываем Developer Tools (F12) и работаем по шагам.
Шаг 1: Вкладка Network — что скрипт отправляет наружу
- Откройте вкладку Network (Сеть).
- Поставьте галочку «Preserve log» — чтобы запросы не терялись при переходе между страницами.
- Отфильтруйте по типу запросов: XHR, Fetch, WebSocket — именно здесь обычно прячется отправка данных.
- Загрузите или выполните подозрительный JS-файл на тестовой странице.
- Наблюдайте за всеми исходящими запросами.
На что смотреть:
- Запросы на незнакомые домены, особенно с подозрительными именами вроде
tracker-xyz123.topилиdata-collector.icu. - Размер отправляемых данных — если скрипт отправляет килобайт данных из пустой формы, значит он собирает что-то с самой страницы.
- WebSocket-соединения — их сложнее заметить, но они позволяют постоянно сливать данные.
Шаг 2: Вкладка Sources — пошаговое выполнение
- Откройте вкладку Sources, найдите загруженный скрипт в дереве файлов.
- Поставьте точки останова (breakpoints) на ключевых строках — обращения к cookie, localStorage, отправка запросов, обработчики событий.
- Используйте пошаговое выполнение (F10 — step over, F11 — step into), чтобы пройти через логику скрипта.
- В панели Watch отслеживайте значения переменных — что скрипт сохраняет, что передаёт.
Шаг 3: Вкладка Console — что скрипт выводит
Многие скрипты оставляют следы в консоли — отладочные сообщения, ошибки, предупреждения. Откройте Console и посмотрите, нет ли там полезной информации. Иногда в ошибках выполнения всплывают имена полей, которые скрипт пытается прочитать, или адреса, на которые он не смог отправить данные.
Этап 4: Специализированные инструменты
Ручной анализ через DevTools — это хорошо, но есть инструменты, которые автоматизируют часть работы и дают дополнительную информацию.
- Browserling — онлайн-песочница, где можно запустить браузер в виртуальной машине через сеть. Удобно для быстрого теста без настройки своей ВМ.
- Any.Run — интерактивная песочница для анализа вредоносного ПО и скриптов. Показывает сетевые запросы, изменения в системе, запущенные процессы. Бесплатная версия позволяет запускать на несколько минут.
- Hybrid Analysis (hybrid-analysis.com) — загружаете файл, получаете отчёт о поведении в песочнице. Показывает, какие домены скрипт пытается достучаться, какие API вызывает.
- Box.js — Node.js песочница, которая перехватывает вызовы API JavaScript-движка. Удобна, когда вы хотите проанализировать сетевую активность скрипта без реального браузера.
- JSDetox — специализированный инструмент для анализа вредоносного JavaScript, позволяет отслеживать взаимодействие скрипта с DOM.
Этап 5: Декодирование и деобфускация
Если код оказался обфусцированным, перед статическим анализом его нужно хотя бы частично расшифровать.
Типичные методы обфускации и что с ними делать:
- Hex/Base64-строки —
\x68\x65\x6C\x6C\x6FилиaGVsbG8=. Просто прогоняйте через консоль:console.log(decodeURIComponent(escape(atob('aGVsbG8='))). - String array rotation — массив строк и функция, которая по индексам собирает нужный текст. Найдите этот массив и функцию, пропишите значения вручную или запустите в безопасной консоли для получения расшифрованных строк.
- eval() и new Function() — скрипт собирает код из строк и запускает. Замените
evalнаconsole.logили присваивайте результат в переменную вместо выполнения — так вы увидите, что он попытался сделать, не запуская это.
Полностью деобфусцировать сложный скрипт вручную — нетривиальная задача. Если код серьёзно запутан, скорее всего, он именно вредоносный. Нормальный разработчик не обфусцирует аналитический или функциональный скрипт до состояния «нечитаемой каши».
Красные флаги: что сразу выдаёт вредоносный скрипт
Вот список признаков, которые при статическом осмотре должны насторожить:
- Scoping-функции с минимумом логики, но максимумом строк — обычно это признак самораспаковывающегося кода.
- Множественные слои eval() один внутри другого.
- Доступ к document.cookie в скрипте, который по описанию не имеет отношения к авторизации.
- Отправка данных через POST с сериализованным содержимым всей формы.
- Код, который перехватывает нажатия клавиш (keylogger) —
document.addEventListener('keydown', ...). - Динамическая загрузка дополнительных скриптов с внешних ресурсов.
- Перехват отправки форм (
form.addEventListener('submit', ...)) с модификацией данных.
Один признак — ещё не приговор. Но если вы видите три и более из списка — скрипт с высокой вероятностью вредоносный.
Частые ошибки при анализе
- Запуск скрипта на рабочей машине. Даже если «просто посмотреть». Скрипт может успеть отправить данные, пока вы думаете, что безопасны.
- Анализ в том же браузере, где вы залогинены. Скрипт может делать запросы с вашими куками. Используйте чистый профиль без авторизаций.
- Пропуск динамической подгрузки. Скрипт может сам не содержать вредоносный код, а только загружать его с внешних ресурсов. Если отключить сеть и скрипт выглядит безобидно — это не значит, что он безопасен.
- Доверие к домену. Даже если скрипт шлёт данные на знакомый домен — убедитесь, что этот домен действительно принадлежит ожидаемому сервису. Подмена домена — простая и эффективная техника.
- Игнорирование контекста. Один и тот же код может быть легитимной аналитикой и вредоним скриптом в зависимости от того, кто его запускает и на какой странице.
Как документировать результаты анализа
Если вы анализируете скрипт не для себя — например, для отчёта или передачи коллегам — зафиксируйте:
- Что именно делает скрипт (какие данные читает, куда отправляет, какие элементы создаёт на странице).
- Подозрительные домены и IP-адреса, на которые скрипт делает запросы.
- Методы обфускации, если они использовались.
- Скриншоты из DevTools — Network с запросами, Console с выводом, критические строки кода.
- Вердикт: вредоносный, подозрительный, легитимный (с обоснованием).
Итоговый алгоритм действий
Когда перед вами встаёт задача проверить подозрительный JS-файл, действуйте так:
- Откройте файл в текстовом редакторе, выполните быстрый визуальный осмотр на наличие красных флагов.
- Если код читаемый — проанализируйте ключевые вызовы (сеть, хранилище, DOM) без запуска.
- Если код обфусцирован — загрузите в онлайн-песочницу (Any.Run, Hybrid Analysis) и проанализируйте поведение в динамике.
- Для глубокого анализа используйте виртуальную машину с чистым браузером и DevTools. Откройте вкладку Network, отслеживайте все запросы, поставьте breakpoints на подозрительных участках.
- Проверьте, не загружает ли скрипт дополнительные ресурсы с внешних источников.
- Задокументируйте результаты и примите решение: блокировать, удалить, пропустить.
Главное правило — никогда не анализируйте незнакомый код в среде, которую не готовы потерять. Потратьте десять минут на настройку изолированной среды — это дешевле, чем разбираться с украденными данными.
