Репозиторий как ловушка: от настроек VS Code к запуску кода

Разбираем автозадачи редактора, границы доверия и признаки исполнения. Учебная задача с объяснением ответа.

Разработчику присылают проект как часть тестового задания. Нужно посмотреть код, установить зависимости и показать, что приложение работает. Всё выглядит привычно — до тех пор, пока в настройках редактора не обнаруживается команда, запускающая файл из каталога шрифтов.

С такой истории начался этот цикл. В январе 2026 года мы обсуждали три архива репозиториев Bitbucket. По сообщению участника разбора, один проект успели запустить на MacBook; два других изучали без запуска. Рабочие записи описывали автозадачи редактора, JavaScript под видом шрифта или словаря и получение исполняемого кода из сети. Само сообщение о запуске ещё не устанавливает, какая часть цепочки сработала и что произошло дальше.

Далее мы будем разбирать эти механизмы на сокращённых учебных примерах. Это позволит повторить рассуждение без обращения к подозрительным серверам. Примеры не являются дословными листингами исходных архивов, а сообщения о находках не заменяют исследование конкретного компьютера.

С чего начинается проверка

В CTF полезно сначала спросить: какие данные нам дали и что именно требуется доказать? Здесь исходные данные — файлы проекта. Вопрос — может ли какой-либо из них привести к исполнению команд до обычного запуска приложения?

Начнём с .vscode/tasks.json. Это конфигурация задач VS Code. Задачи могут вызывать внешние инструменты, а значение runOptions.runOn: "folderOpen" задаёт запуск при открытии содержащей их папки. Однако автоматическое выполнение зависит от разрешений: в недоверенной рабочей области такие задачи не запускаются; в доверенной отдельно учитывается разрешение автоматических задач. [1]

Поэтому формула «открыл папку — заразился» пропускает существенную часть условий. Нужно установить, была ли папка доверенной, были ли разрешены автозадачи и смогла ли команда выполниться. Workspace Trust мог быть задан раньше, в том числе для родительского каталога. [2]

В нынешнем VS Code автоматическими задачами управляет task.allowAutomaticTasks. Явно заданное значение off запрещает их запуск; on разрешает запуск в доверенной рабочей области без нового вопроса. Если выбор для неё ещё не сделан, редактор предлагает разрешить или запретить автозадачи. Поэтому отсутствие диалога при конкретном открытии папки само по себе ничего не доказывает. [1]

Читаем задачу как программу

Ниже одна задача из массива tasks, а не полный файл конфигурации. Фрагмент нужно читать, а не сохранять в действующий .vscode/tasks.json:

1
2
3
4
5
6
7
{
  "label": "Prepare preview",
  "type": "process",
  "command": "node",
  "args": ["webfonts/preview.woff2"],
  "runOptions": { "runOn": "folderOpen" }
}

Название Prepare preview ничего не доказывает: это подпись в интерфейсе. Значимые сведения находятся в других полях. Исполняемой программой указан node; аргумент похож на путь к шрифту; повод для запуска — открытие папки.

Из этого пока следует один вывод: конфигурация предлагает передать файл с расширением .woff2 интерпретатору Node.js. У задачи необычное назначение, и целевой файл нужно исследовать. Но утверждение «из компьютера уже украли ключи» здесь не имеет опоры.

В настоящем проекте также проверяют рабочий каталог задачи, зависимости от других задач и отдельные варианты команд для разных операционных систем. Один просмотр строки command может не показать всей последовательности. [1]

Три разных вопроса вместо одного

Разбор становится точнее, когда мы разделяем возможность, событие и последствие.

Что умеет делать проект? Ответ дают конфигурация, вызываемые файлы и доступные ветви кода.

Что действительно выполнялось? Нужны журналы задач, данные о процессах, сообщения пользователя и другие следы. Настроенный автозапуск не равен зарегистрированному запуску.

К чему привело выполнение? Здесь потребуются сведения о полученном ответе сервера, созданных файлах, доступе к данным и действиях в учётных записях. Наличие загрузчика само по себе не описывает содержимое следующей стадии.

Это разделение пригодится во всём цикле. Оно позволяет серьёзно отнестись к риску, не превращая вероятный сценарий в установленный факт.

Как осматривать внешний проект

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

Если используется VS Code, оставьте проект в Restricted Mode и проверьте, не наследует ли каталог доверие. Этот режим ограничивает определённые возможности редактора, но не изолирует команду, которую вы сами затем запустите в терминале. [2]

Для незнакомого проекта важны не только настройки IDE. В следующих статьях мы отдельно посмотрим на содержимое «ассетов», импорты JavaScript и хуки установки. Удаление одной подозрительной задачи не гарантирует, что других путей запуска нет.

Задача: какой вывод выдерживает проверку?

Файлы для самостоятельного разбора доступны в синтетическом практикуме.

Вам дали фрагмент выше и три сообщения:

1
2
3
А. Архив скачан. Папка в редакторе не открывалась.
Б. Папка открывалась в Restricted Mode. Задачи не разрешали.
В. Сохранилась запись запуска: node webfonts/preview.woff2.

Что можно утверждать в каждом случае?

Показать разбор

Разбор. В случае А известен только факт получения архива. В случае Б описанный механизм автозадачи должен быть заблокирован режимом доверия; это не универсальное заключение о любых возможных действиях на машине. В случае В есть свидетельство запуска интерпретатора с конкретным аргументом. Для вывода об успешном выполнении файла нужны результат запуска и последующие события.

Следующий шаг для всех трёх случаев одинаков: проверить содержимое preview.woff2. Следующий шаг для расследования компьютера — разный: в случае В потребуется восстановить ход выполнения.

Что стоит запомнить

Опасность находится не в названии каталога .vscode, а в переходе от полученных файлов к исполнению команд. Хороший разбор показывает этот переход и его условия. Именно такой навык нужен и в CTF, и при проверке чужого проекта.

Источники

[1] VS Code: Tasks — настройка задач и управление автоматическим запуском.

[2] VS Code: Workspace Trust — Restricted Mode и наследование доверия.

История происхождения цикла основана на сообщениях участников и рабочих записях разбора от 12 января 2026 года. Повторная проверка исходных архивов не входит в эту редакцию. Поведение редактора сверено с документацией при редакции 13 ноября 2026 года; для расследования старого запуска нужна версия редактора того времени.

Создано при помощи Hugo
Тема Stack, дизайн Jimmy