Системные вызовы Unix

Основные системные вызовы для обнаружения атак

Системные вызовы (syscalls) — это интерфейс между пользовательскими программами и ядром операционной системы. Они позволяют программам запрашивать услуги ядра, такие как работа с файлами, управление процессами, взаимодействие с сетью и т.д. Анализ системных вызовов является важным инструментом для обнаружения подозрительной активности, так как многие атаки на уровне ОС используют их для выполнения вредоносных действий.


execve/execveat

Системный вызов execve отвечает за выполнение новой программы. Он загружает в процесс другую программу и передает ей безвозвратное управление.

execveat аналогично execve, но с дополнительной возможностью указывать файловый дескриптор (dirfd) для относительных путей. Это позволяет выполнять программы относительно каталога, на который ссылается dirfd, а не относительно текущего рабочего каталога вызывающего процесса.

Что обнаруживает:

  • Выполнение любых команд из RedTeam Cheat Sheets, включая команды разведки, скачивания и запуска подозриетльных файлов.

  • Использование GTFObins.

  • Запуск процессов из нестандартных директорий (например, /tmp/)

  • Подозрительная последовательность запуска процессов. По умолчанию execve пишет только PID родительского процесса, поэтому надо коррелировать два события запуска процессов, чтобы обнаружить подозрительные последовательности:

    • Запуск процессов через GTFObins

    • Потенциальная эксплуатация RCE

fork / clone

Создает новый процесс (потомок) как копию текущего процесса.


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) - разведка.

Часто есть соблазн написать правило на чтение файла /etc/passwd - кажется, это первое, что делают атакующие.

Но каждый раз, когда вы пытаетесь открыть любой файл в системе, запускаемая программа обращается к /etc/passwd, чтобы проверить ваш uid и группу и убедиться, что у вас есть права это действие. То есть правило на вызов open для /etc/passwd будет срабатывать при обращении к любому файлу.

Поэтому тут лучше использовать вызов execve и явно указание /etc/passwd в строке запуска.

  • Запись данных в системные файлы: cronjob, timers, daemons, ключей SSH и всего, что может использоваться дял закрепления в системе.

  • Изменение конфигураций служб логирования или безопасности (apparmor)


socket/connect/accept

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

Системный вызов connect устанавливает соединение между сокетом и удаленным адресом.

Системный вызов accept используется на стороне сервера для принятия входящих соединений от клиентов.

Что обнаруживает:

  • Сетевые соединения из подозрительный каталогов (/tmp/, пользовательские домашние директории).

  • Bind и Reverse соединений на управляющие сервера.

  • Потенциальные RCE (принятие сететвого соединения веб-демоном и последующий запуск дочернего процесса).

  • Сканирование портов.


Создает символическую ссылку (symlink).

Auditd может отслеживать вызовы symlink и записывать, кто и когда создал символическую ссылку. Auditd может отслеживать вызовы open, openat и другие, но он не различает, был ли доступ к файлу напрямую или через symlink. Если программа использует symlink для доступа к файлу, auditd зафиксирует это как обычный доступ к файлу, но не укажет, что доступ был через symlink. Что позволяет избежать обнаружения.

Что обнаруживает:

  • Создание symlink для обхода проверок безопасности.

  • Перенаправление доступа к файлам - подозрительные имена ссылок (например, указывающие на /etc/passwd).


chmod / chown

Изменяет права доступа или владельца файла.

Что обнаруживает:

  • Повышение привилегий через изменение прав на системные файлы.

  • Скрытие вредоносных файлов (например, установка атрибута "скрытый").

  • Частые вызовы chmod с подозрительными параметрами (например, 777).


kill

Отправляет сигнал процессу (например, для завершения процесса).

Что обнаруживает::

  • Завершение процессов безопасности (например, антивирусов или IDS).

  • Скрытие активности через завершение процессов-логгеров.


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 — это классический метод, используемый злоумышленниками для получения более высоких прав в системе, чем те, которые у них есть изначально.

  1. Злоумышленник ищет файлы с установленными битами setuid/setgid:

    find / -perm -4000 -o -perm -2000 2>/dev/null
  2. Злоумышленник анализирует найденные файлы на наличие уязвимостей, таких как небезопасное использование системных вызовов (например, system, exec).

  3. Если уязвимость найдена, злоумышленник использует её для выполнения произвольного кода с правами владельца файла (например, root).

Что обнаруживает::

  • Повышение привилегий через выполнение программ с правами root.

  • Использование уязвимостей в SUID/SGID-файлах.


capset

Устанавливает capabilities (возможности) для процесса. Хорошей практикой считается вместо setuid использовать Linux capabilities, чтобы предоставить процессам только необходимые привилегии.=

setcap cap_net_bind_service=+ep /usr/bin/myprogram

Что обнаруживает:

  • Повышение привилегий через манипуляцию с capabilities.

Про Linux Capabilities

Linux Capabilities — это механизм в Linux, который позволяет разделить привилегии суперпользователя (root) на отдельные, более мелкие права. Это обеспечивает более гибкое управление доступом и снижает риски, связанные с использованием полных прав root. Вместо того чтобы давать процессу все привилегии root, можно предоставить только те, которые ему действительно необходимы.


1. Зачем нужны capabilities?

Раньше в Linux было только два уровня привилегий:

  • Обычный пользователь: ограниченные права.

  • root: полный доступ ко всей системе.

Это создавало проблемы:

  • Если процессу нужно было выполнить только одну привилегированную операцию (например, открыть сокет на привилегированном порту), ему приходилось запускаться с правами root, что увеличивало риски безопасности.

  • Любая уязвимость в таком процессе могла привести к полному компрометированию системы.

Capabilities решают эту проблему, позволяя назначать процессам только необходимые привилегии.


2. Основные понятия

  • Capability (возможность) — это отдельное право, которое может быть предоставлено процессу. Например:

    • CAP_NET_BIND_SERVICE: Позволяет привязывать сокеты к привилегированным портам (например, порты ниже 1024).

    • CAP_SYS_ADMIN: Позволяет выполнять административные операции (например, монтирование файловых систем).

    • CAP_KILL: Позволяет завершать процессы других пользователей.

  • Набор capabilities — это список прав, которые есть у процесса или файла.


3. Типы capabilities

Capabilities делятся на три категории:

  1. Effective (эффективные):

    • Это те capabilities, которые фактически используются процессом в данный момент.

    • Например, если процессу нужно открыть сокет на привилегированном порту, он использует CAP_NET_BIND_SERVICE.

  2. Permitted (разрешенные):

    • Это все capabilities, которые процесс может использовать.

    • Если capability есть в этом наборе, процесс может включить её в Effective.

  3. Inheritable (наследуемые):

    • Это capabilities, которые могут быть унаследованы дочерними процессами.


4. Примеры capabilities

Вот несколько примеров capabilities и их назначение:

Capability

Описание

CAP_CHOWN

Позволяет изменять владельца файла.

CAP_DAC_OVERRIDE

Позволяет обходить проверки прав доступа к файлам.

CAP_KILL

Позволяет завершать процессы других пользователей.

CAP_NET_BIND_SERVICE

Позволяет привязывать сокеты к привилегированным портам (ниже 1024).

CAP_SYS_ADMIN

Позволяет выполнять административные операции (например, монтирование ФС).

CAP_SYS_PTRACE

Позволяет отлаживать процессы других пользователей (например, через ptrace).

CAP_SETUID

Позволяет изменять UID процесса.

CAP_SETGID

Позволяет изменять GID процесса.

Полный список capabilities можно найти в документации (man capabilities).


5. Как работают capabilities?

Для процессов

  • Каждый процесс в Linux имеет набор capabilities, которые определяют, какие привилегированные операции он может выполнять.

  • Например, если процессу нужно открыть сокет на порту 80 (привилегированный порт), ему достаточно иметь CAP_NET_BIND_SERVICE, а не полные права root.

Для файлов

  • Исполняемые файлы могут иметь набор capabilities, которые наследуются процессами при запуске.

  • Это позволяет запускать программы с ограниченными привилегиями без необходимости использования setuid.

Команда setcap

  • Устанавливает capabilities для файла:

    setcap cap_net_bind_service=+ep /usr/bin/myprogram

    Здесь:

    • cap_net_bind_service — capability.

    • +ep — добавить в Effective и Permitted наборы.

Команда getcap

  • Показывает capabilities файла:

    getcap /usr/bin/myprogram

    Вывод:

    /usr/bin/myprogram = cap_net_bind_service+ep

setxattr

Устанавливает расширенные атрибуты файла (например, метаданные).

Что обнаруживает:

  • Сокрытие данных в расширенных атрибутах.

  • Установка подозрительных атрибутов.


Удаляет файл или директорию из файловой системы.

Что обнаруживает:

  • Удаление логов или других файлов для сокрытия следов.

  • Удаление системных файлов для нарушения работы ОС.


Заключение

Анализ системных вызовов позволяет обнаруживать аномальное поведение процессов, которое может указывать на атаки. Для этого используются инструменты вроде auditd, strace, sysdig или eBPF. Важно настраивать мониторинг вызовов, которые связаны с критическими операциями (например, выполнение кода, работа с файлами и сетью), и анализировать их контекст.

Last updated

Was this helpful?