personal blog

Articles · security

Nyx: что на самом деле делает «чистильщик следов» и как от него защищаться

Ситуация знакомая: кто-то советует скрипт с GitHub как «удобную чистку системы», а читать исходник некогда. Nyx — как раз такой случай. Это открытый скрипт (shell для Linux/macOS, PowerShell для Windows), проект набрал популярность, и его часто рекомендуют именно как чистильщик. Сам он позиционируется иначе: «self-contained cleaner of forensic traces». По назначению это anti-forensics-инструмент, а не уборка временных файлов.

Я прочитал оба скрипта целиком и не запускал их: всё ниже — разбор по исходному коду. Вопросов три. Есть ли в нём вредоносное поведение? Что пропадёт с машины, кроме журналов? Можно ли доверять режиму --dry-run, который многие считают страховкой? Короткие ответы: нет, больше, чем кажется, и нельзя. В конце — как защитнику замечать работу таких инструментов.

Происхождение и наличие вредоносного поведения

Автор — Simone Margaritelli (evilsocket), известный по bettercap. Лицензия GPLv3, репозиторий небольшой: два основных скрипта, cmd-обёртка, тесты в Docker и один CI-воркфлоу.

Дальше — то, что обычно выдаёт малварь:

Это мне нравится: автор ничего не прячет. Как малварь по поведению скрипт не выглядит. Опасность — в его прямой функции.

Что он затрагивает

Для владельца системы важны не «логи», а побочные потери. Помимо журналов и истории команд, модули затрагивают:

То есть «почистить» свою рабочую машину — значит рискнуть доступом к облаку, кошельку или VPN. При этом автор сам называет проект alpha.

Естественное возражение: есть же пробный режим. С ним и связана главная находка.

Режим --dry-run: где он не защищает

В Linux/macOS-версии --dry-run реализован через три обёртки: safe_remove, safe_remove_tree и truncate_file. При dry-run они только печатают сообщение. Задумано правильно. Но в коде есть 28 мест, где деструктивные команды вызываются напрямую, мимо обёрток. Пять из них не защищены проверкой DRY_RUN, у остальных 23 проверка находится в нескольких строках выше по коду. Картина такая:

Место Что происходит при --dry-run
Модуль temp, поиск файлов core*, *.crash, *crash* в /tmp и /var/crash Удаляет реально. Защиты DRY_RUN нет, и счётчик «очищено» растёт. Это дефект без оговорок: проверки в этой ветке кода нет
macOS: пустая корзина, unified logs, FSEvents, Notification Center Защиты DRY_RUN нет, но пути передаются в кавычках с * ("$dir/*"), поэтому шаблон не раскрывается и команда ничего не делает. Побочный эффект — модуль рапортует об очистке, которой не было
Остальные 23 прямых вызова Проверка DRY_RUN есть рядом

Вторая строка таблицы меня позабавила: вызовы на macOS безвредны не благодаря проверке, а из-за кавычек вокруг звёздочки. Одна ошибка закрыла другую, и полагаться на такое я бы не стал.

Отдельно: счётчики count в этих местах увеличиваются внутри конвейера find | while read — это подпроцесс, и итоговая статистика в отчёте занижена/некорректна.

PowerShell-версия. Здесь я осторожнее в выводах. Примерно в 5 из ~74 деструктивных вызовов рядом нет проверки DryRun: очистка журналов событий двумя способами, файлы Prefetch и один вызов удаления по вычисляемому пути. Тестами это не подтверждено, и проверка может стоять выше по тексту скрипта. Перед любым запуском эти места нужно проверить отдельно.

Практический вывод: --dry-run нельзя считать гарантией неизменности системы. В Linux-версии он по коду пропускает реальное удаление.

Что делать, если очень хочется попробовать

Условия, при которых я считаю такой эксперимент допустимым:

Защита: как заметить, что такой инструмент отработал

Теперь с другой стороны. Nyx и подобные скрипты уничтожают локальные следы. Значит, защита строится на том, чтобы важные события покидали хост раньше, чем их успеют стереть.

  1. Централизованный сбор журналов. Пересылайте syslog/journald и журналы событий Windows на отдельный коллектор или в SIEM в реальном времени. Локальное усечение уже ничего не докажет и не спрячет.
  2. Алерты на сам факт очистки.
    • Windows: события об очистке журналов (Security 1102, System 104), об изменении политики аудита (4719), запуск утилит удаления теневых копий и работы с USN-журналом — по командной строке (Sysmon / Process Creation).
    • Linux: остановка auditd, сброс правил аудита, резкое обнуление размера файлов в /var/log при неизменном inode, массовое обнуление файлов *_history.
  3. Неизменяемость. На критичных хостах включайте неизменяемый режим правил auditd, задавайте append-only для журналов, используйте WORM/удалённое хранилище.
  4. Контроль целостности конфигураций (AIDE, Wazuh, osquery): массовое исчезновение файлов конфигурации VPN/облака — сигнал.
  5. Принцип минимальных прав. Инструмент бесполезен без root/Administrator; ограничивайте sudo, следите за повышением привилегий, разделяйте доступ к журналам и к работе на хосте.
  6. Резервные копии секретов. Кошельки и облачные ключи должны иметь резервные копии вне хоста — на случай, если «чистка» затронет их.

Итог

Что хорошо. Nyx — не вредоносная программа по поведению: сети нет, обфускации нет, код небольшой и читается линейно.

Что плохо. По назначению это разрушительный anti-forensics-инструмент, и затрагивает он секреты, VPN-конфиги, ключи кошельков и защитные механизмы, а не только «мусор». --dry-run в Linux-версии неполон: одно реальное удаление при пробном запуске, несколько мест-«пустышек» из-за кавычек, некорректная статистика.

Кому это нужно. Тем, кто изучает anti-forensics в одноразовой виртуальной машине, и защитникам — как перечень того, что именно будут стирать. Кому не нужно: всем, кто ищет «чистку системы» для рабочей машины. Это не она.

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

Oleg Bukatchuk
Oleg Bukatchuk
DevOps and SRE engineer. Built fault-tolerant infrastructure for classifieds, e-commerce and the public sector: cian.ru, aliexpress.ru, mos.ru.