Системные вызовы Unix
Основные системные вызовы для обнаружения атак
Системные вызовы (syscalls) — это интерфейс между пользовательскими программами и ядром операционной системы. Они позволяют программам запрашивать услуги ядра, такие как работа с файлами, управление процессами, взаимодействие с сетью и т.д. Анализ системных вызовов является важным инструментом для обнаружения подозрительной активности, так как многие атаки на уровне ОС используют их для выполнения вредоносных действий.
execve/execveat
execve/execveatСистемный вызов execve отвечает за выполнение новой программы. Он загружает в процесс другую программу и передает ей безвозвратное управление.
execveat аналогично execve, но с дополнительной возможностью указывать файловый дескриптор (dirfd) для относительных путей. Это позволяет выполнять программы относительно каталога, на который ссылается dirfd, а не относительно текущего рабочего каталога вызывающего процесса.
Что обнаруживает:
Выполнение любых команд из RedTeam Cheat Sheets, включая команды разведки, скачивания и запуска подозриетльных файлов.
Использование GTFObins.
Запуск процессов из нестандартных директорий (например,
/tmp/)Подозрительная последовательность запуска процессов. По умолчанию
execveпишет только PID родительского процесса, поэтому надо коррелировать два события запуска процессов, чтобы обнаружить подозрительные последовательности:Запуск процессов через GTFObins
Потенциальная эксплуатация RCE
fork / clone
fork / cloneСоздает новый процесс (потомок) как копию текущего процесса.
open/openat
open/openatОткрывает файл для чтения, записи или выполнения. Системный вызов openat аналогичен open, но он позволяет указывать файловый дескриптор директории (dirfd), относительно которой будет открыт файл.
Значение a1 в логах auditd представляет собой набор флагов, которые были использованы при открытии файла.
Эти флаги определяются константами могут включать:
O_RDONLY(0x0000): Открытие файла только для чтения.O_WRONLY(0x0001): Открытие файла только для записи.O_RDWR(0x0002): Открытие файла для чтения и записи.O_CREAT(0x0040): Создание файла, если он не существует.O_TRUNC(0x0200): Обрезка файла до нулевой длины при открытии для записи.
Чтобы определить режим открытия файла по значению a1, необходимо расшифровать его как битовый флаг. Например, если a1 равно 0x0002, это означает, что файл был открыт для чтения и записи (O_RDWR).
Примеры значений a1:
a1 = 0x0000(0): Файл открыт только для чтения (O_RDONLY).a1 = 0x0001(1): Файл открыт только для записи (O_WRONLY).a1 = 0x0002(2): Файл открыт для чтения и записи (O_RDWR).a1 = 0x0041(65): Файл открыт для записи и создания (O_WRONLY | O_CREAT).
Что обнаруживает:
Чтение конфиденциальных файлов (например,
/etc/shadow) - разведка.
Запись данных в системные файлы: cronjob, timers, daemons, ключей SSH и всего, что может использоваться дял закрепления в системе.
Изменение конфигураций служб логирования или безопасности (
apparmor)
socket/connect/accept
socket/connect/acceptСистемный вызов socket отвечает за создание нового сокета, который является конечной точкой для сетевого соединения. Он позволяет программам общаться друг с другом через сеть.
Системный вызов connect устанавливает соединение между сокетом и удаленным адресом.
Системный вызов accept используется на стороне сервера для принятия входящих соединений от клиентов.
Что обнаруживает:
Сетевые соединения из подозрительный каталогов (
/tmp/, пользовательские домашние директории).Bind и Reverse соединений на управляющие сервера.
Потенциальные RCE (принятие сететвого соединения веб-демоном и последующий запуск дочернего процесса).
Сканирование портов.
symlink
symlinkСоздает символическую ссылку (symlink).
Auditd может отслеживать вызовы symlink и записывать, кто и когда создал символическую ссылку.
Auditd может отслеживать вызовы open, openat и другие, но он не различает, был ли доступ к файлу напрямую или через symlink.
Если программа использует symlink для доступа к файлу, auditd зафиксирует это как обычный доступ к файлу, но не укажет, что доступ был через symlink. Что позволяет избежать обнаружения.
Что обнаруживает:
Создание symlink для обхода проверок безопасности.
Перенаправление доступа к файлам - подозрительные имена ссылок (например, указывающие на
/etc/passwd).
chmod / chown
chmod / chownИзменяет права доступа или владельца файла.
Что обнаруживает:
Повышение привилегий через изменение прав на системные файлы.
Скрытие вредоносных файлов (например, установка атрибута "скрытый").
Частые вызовы
chmodс подозрительными параметрами (например,777).
kill
killОтправляет сигнал процессу (например, для завершения процесса).
Что обнаруживает::
Завершение процессов безопасности (например, антивирусов или IDS).
Скрытие активности через завершение процессов-логгеров.
setuid / setgid
setuid / setgidИзменяет идентификатор пользователя или группы процесса.
Если бит
setuidустановлен на исполняемом файле, то при запуске этого файла процесс выполняется с правами владельца файла, а не пользователя, который его запустил.Пример: Файл
/usr/bin/passwdимеет битsetuid, чтобы обычные пользователи могли изменять свой пароль в/etc/shadow, который доступен только root.Аналогично, если бит
setgidустановлен на исполняемом файле, процесс выполняется с правами группы, владеющей файлом.В файловой системе это выглдяит так:
-rwsr-xr-x 1 root root 63960 Feb 7 2023 /usr/bin/passwd
Повышение привилегий через setuid и setgid — это классический метод, используемый злоумышленниками для получения более высоких прав в системе, чем те, которые у них есть изначально.
Злоумышленник ищет файлы с установленными битами
setuid/setgid:find / -perm -4000 -o -perm -2000 2>/dev/nullЗлоумышленник анализирует найденные файлы на наличие уязвимостей, таких как небезопасное использование системных вызовов (например,
system,exec).Если уязвимость найдена, злоумышленник использует её для выполнения произвольного кода с правами владельца файла (например, root).
Что обнаруживает::
Повышение привилегий через выполнение программ с правами root.
Использование уязвимостей в SUID/SGID-файлах.
capset
capsetУстанавливает capabilities (возможности) для процесса. Хорошей практикой считается вместо setuid использовать Linux capabilities, чтобы предоставить процессам только необходимые привилегии.=
setcap cap_net_bind_service=+ep /usr/bin/myprogramЧто обнаруживает:
Повышение привилегий через манипуляцию с capabilities.
setxattr
setxattrУстанавливает расширенные атрибуты файла (например, метаданные).
Что обнаруживает:
Сокрытие данных в расширенных атрибутах.
Установка подозрительных атрибутов.
unlink/rmdir
unlink/rmdirУдаляет файл или директорию из файловой системы.
Что обнаруживает:
Удаление логов или других файлов для сокрытия следов.
Удаление системных файлов для нарушения работы ОС.
Заключение
Анализ системных вызовов позволяет обнаруживать аномальное поведение процессов, которое может указывать на атаки. Для этого используются инструменты вроде auditd, strace, sysdig или eBPF. Важно настраивать мониторинг вызовов, которые связаны с критическими операциями (например, выполнение кода, работа с файлами и сетью), и анализировать их контекст.
Last updated
Was this helpful?