У процессов Linux существуют переменные окружения, к которым можно получить доступ через файл /proc/<pid>/environ или обработку структур памяти процесса. При проверке системы на наличие следов компрометации переменные окружения являются ценным источником данных, потому что в них могут быть обнаружены аномалии, указывающие на атаку.

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

Стандартные переменные

Переменные окружения устанавливаются системными вызовами setenv() или putenv() и наследуются дочерними процессами. Некоторые переменные окружения процессов управляются командной оболочкой, для bash этот список указан в документации.

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

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

HISTFILE — путь к файлу, в который будет записываться история команд, обычно это <user_home>/.bash_history.

HISTFILESIZE — максимальное количество команд, записываемое в файл HISTFILE. Файл ротируется при превышении количества команд.

HISTIGNORE — команды, которые следует исключить из логирования.

HISTCONTROL — указание на то, каким образом список команд сохраняется в истории.

Напомним, оболочка sh и некоторые другие, более редкие, не логируют историю.

HOME — абсолютный путь к домашней директории учетной записи, запустившей процесс. Если учетная запись не системная и домашняя директория отличается от /home/<user>, это аномалия.

PATH — при запуске файла только по его имени система будет искать файл в указанных директориях в порядке приоритета. Аномальный PATH может указывать на вредоносный процесс. Например, самописный загрузчик группировки Cloacked Shadow подменяет значение PATH.

MYSQL_HISTORY, PSQL_HISTORY — путь к файлу, в который будет записываться история команд в консоли соответствующей БД.

PWD — текущая директория процесса. Если переменная содержит заведомо подозрительный путь, например(,) /tmp, /var/www или /dev/shm, это аномалия.

OLDPWD — PWD родительского процесса. По этой переменной можно определить источник компрометации, например, директорию ПО, в котором эксплуатировалась уязвимость.

SUDO_USER — пользователь, запустивший процесс через команду sudo. Можно определить скомпрометированную УЗ и предположить вектор заражения.

SHLVL — глубина вложенности текущего процесса оболочки. Большая вложенность может быть следом работы вредоносного ПО.

_ — полный путь первой команды при запуске процесса из оболочки. Если исполняемый файл был запущен непосредственно, в переменной будет находиться полный путь к самому файлу. Если исполняемый файл был запущен через лаунчер, например(,) nohup или screen, в переменной будет путь к лаунчеру.

LD_PRELOAD — путь к файлу, из которого приоритетно подгружаются определения символов для программы. Используется динамическим компоновщиком (более подробно можно прочитать здесь). С помощью этой техники часто запускаются руткиты.

HTTP_PROXY, HTTPS_PROXY, NO_PROXY, ALL_PROXY и другие переменные вида <protocol>_PROXY задают прокси для того или иного протокола. Используются в том числе такими легитимными программами, как curl, wget, docker и пакетные менеджеры.

У процессов, запущенных в рамках SSH-сессии, можно обнаружить следующие переменные окружения:

SSH_CONNECTION — адрес SSH-клиента, порт SSH-клиента, IP-адрес сервера (текущей системы), порт SSH-службы сервера. При этом переменная может содержать завершенное подключение клиента.

SSH_CLIENT — адрес SSH-клиента и порт SSH-клиента из переменной SSH_CONNECTION.

SSH_ORIGINAL_COMMAND — команда, переданная при инициации SSH-соединения.

Кастомные переменные

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

gsocket

Типичная команда запуска gsocket содержит переменные окружения.

Закрепление gsocket с помощью сервиса
Закрепление gsocket с помощью сервиса

В коде утилиты содержится функциональность установки переменных окружения и чтения их значений.

Чтение переменных окружения
Чтение переменных окружения
Установка и очистка переменных окружения
Установка и очистка переменных окружения

Bulldog Backdoor

Бэкдор Bulldog Backdoor (GoRed) группировки Shedding Zmiy (exCobalt | Red Likho | Phoenix Hyena) активно развивается на протяжении более двух лет и в разных версиях использовует разные переменные окружения. В некоторых версиях переменные задавались через параметр Environment в сервисах. Ниже приведен пример закрепления бэкдора v0.7.12 (апрель 2025).

  
[Unit]
Description=A system service that provides an authorization framework, allowing non-privileged processes to communicate with privileged ones.
ConditionFileIsExecutable=/usr/bin/bash

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/bash "-c" "exec -a polkitd /usr/bin/obqxg"
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/system.polkitd
KillMode=process
Environment=BB=1
Environment=BB_SVC_NO_SERVICE=false

[Install]
WantedBy=multi-user.target
  
Закрепление Bulldog Backdoor c помощью сервиса

Vasilek

Бэкдор Vasilek группировки Partizan Zmiy (Киберпартизаны | Guerrilla Hyena) читает конфигурацию в том числе из переменных окружения. Переменная TLS_NON_SEC включает шифрование сетевого трафика бэкдора с использованием встроенного TLS-сертификата. Переменная CLEAR_OLD_UPDATES указывает на необходимость получения обновлений. В переменной PASSED_HTTP_PROXY задаются параметры прокси-сервера.

IDFKA

Бэкдор IDFKA неатрибутированной группировки NGC5081 использовал кастомную переменную TRM64CFG для расшифровки нагрузки, причем значение переменной на всех хостах было одинаковым.

Ниже представлен фрагмент переменных окружения вредоносного процесса, где, помимо кастомной переменной, видны другие подозрительные значения:

  
SHELL=/bin/bash
SUDO_GID=510
HISTSIZE=0
SUDO_COMMAND=/bin/bash -p
SUDO_USER=postgres
TRM64CFG=R:9o,Bgk:1l,Cd:5
PWD=/sbin
LOGNAME=root
HOME=/root
USER=root
SHLVL=2
SUDO_UID=510
OLDPWD=/root
_=/usr/bin/tail
  

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

Обнаружение мимикрии

Красный флаг — не только новые переменные, но и стандартные переменные в тех процессах, где их быть не должно. Наличие переменных оболочки в «системном» процессе может указывать на мимикрию, о чем мы ранее рассказывали в статье о GoblinRAT. Один из семплов GoblinRAT мимикрировал под cron и имел такие же отображаемые параметры запуска, но в environ содержались значения, характерные для bash. Отметим, что значение переменной ‘_’ совпадает с путем к файлу из /proc/<pid>/exe, где файл расположен в in-memory-директории /dev/shm/.

Переменные окружения легитимного и вредоносного cron
Переменные окружения легитимного и вредоносного cron

Использование в мониторинге

Выше мы описали переменные окружения с точки зрения форензики. Что касается мониторинга, auditd, будучи проверенным временем инструментом аудита на уровне ядра, сегодня все чаще воспринимается как устаревшее решение для задач современного мониторинга безопасности. Одна из причин — отсутствие информации о переменных окружения процесса в событиях. В противовес auditd мы можем использовать Falco, который позволяет писать правила для мониторинга аномалий в окружении процессов. О Falco мы рассказывали в одной из предыдущих статей, где в том числе привели правило на LD_PRELOAD.

Выводы

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