Чужой проект может начать выполнять команды раньше, чем разработчик нажмёт «Запустить приложение». Но наличие подозрительного файла ещё не означает, что компьютер заражён. Между этими наблюдениями лежит работа исследователя: прочитать конфигурацию, проследить вызовы, сопоставить следы и установить границы доказанного.
Этот цикл объединяет чтение кода, проверку форматов, основы форензики и анализ сетевых событий. Он построен как последовательность небольших задач. В каждой статье есть исходные данные, ход проверки и разбор ответа. Можно сначала попробовать решить упражнение самостоятельно, а затем сравнить рассуждение.
Маршрут
- Репозиторий как ловушка: от настроек VS Code к запуску кода
- Шрифт, который оказался скриптом: проверяем формат и назначение файла
- От HTTP-ответа к выполнению кода: читаем опасную цепочку в JavaScript
- Что выполняется при npm install: хуки, зависимости и границы ignore-scripts
- После запуска подозрительного проекта: как собрать факты и ограничить ущерб
- Проверка репозитория до запуска: как устроить безопасный статический контроль
- Тестовое задание на отдельной машине: порядок приёма внешнего кода
- Следы в сети: как связать процесс, запрос и файл — и не додумать лишнего
Откуда взялась история
Поводом стал разбор трёх архивов Bitbucket в январе 2026 года. По сообщению участника, один из проектов, предложенный в контексте тестового задания, успели запустить на MacBook. Другие проекты обсуждали как находки для анализа. Дальнейшие события на компьютере не были установлены только по содержимому переписки.
В статьях сохранены механизмы, описанные в рабочих записях, но упражнения и журналы созданы отдельно. Они не требуют оригинальных вредоносных файлов, запуска загрузчика или обращения к подозрительным серверам. Кодовые фрагменты помечены как учебные. Это позволяет повторить рассуждение, не выдавая реконструкцию за новое исследование образцов.
Материалы заново отредактированы 13 ноября 2026 года. Документация инструментов отражает проверенную на этой стадии информацию; поведение исторического окружения нужно устанавливать по его фактическим версиям.
Как работать с материалами
Начинайте с первого текста, если хотите пройти всю цепочку. Если подозрительный проект уже запускался, сначала прочитайте пятую статью о реагировании, затем вернитесь к техническому разбору.
Не создавайте действующие задачи редактора из фрагментов статьи и не выполняйте исследуемый JavaScript. Для упражнений достаточно чтения текста и обработки синтетических данных доверенными инструментами. Ниже доступны текстовые примеры и синтетический журнал. Настоящих образцов малвари в них нет.
Для общего знакомства с направлениями помогут основы форензики и маршруты чтения и практики.
Результат цикла — умение объяснить, какой переход в программе или журнале подтверждён и каких данных не хватает. Именно это позволяет переносить опыт из учебной задачи в реальную работу.
Практикум
Сначала решите упражнения в статьях, затем откройте разбор. Файлы задач оставлены текстовыми: tasks.json.txt и package.json.txt не нужно переименовывать в действующие конфигурации. Для первой, второй, третьей, четвёртой, шестой и восьмой статей есть отдельные файлы; в пятой и седьмой всё условие дано в тексте.
Скачать синтетический практикум ZIP (4777 байт).
SHA-256 архива:
a5f05cae32f1ad00f20da3566c5ec45e5b9d014584d655e7b4e9e339a8c06888Файлы по отдельности — для чтения до запуска проверки:
- README.txt
- tasks.json.txt
- font-candidate-a.hex.txt
- font-candidate-b.hex.txt
- disguised-source.txt
- flow.js.txt
- package.json.txt
- events.jsonl
- literal-positive.txt
- literal-negative.txt
- check_exercises.py
После самостоятельного решения прочитайте check_exercises.py. Он проверяет структуру локальных синтетических данных и не выполняет JavaScript. Для проверки распакованного учебного набора заранее подготовленным доверенным Python 3:
| |
Десять успешных проверок означают, что данные упражнения согласованы. Они не удостоверяют безопасность какого-либо внешнего репозитория. Для упражнения со статическим поиском используйте заранее установленный доверенный ripgrep; замените /analysis/input в команде статьи на путь к распакованному практикуму.