SecureExec
Главная
Решения
ЦеныБлогО нас
ВойтиРегистрация
← Назад к блогу

Техническое описание: как работает SecureExec

11 марта 2026 г.

SecureExec — self-hosted платформа обнаружения и реагирования (EDR) для Linux. Эта статья — техническое описание: полный путь данных от хука в ядре до алерта, архитектура агента, серверный движок детекции и механизмы реагирования.

Архитектура

┌─────────────────────────────────────────┐
│              Linux-хост                 │
│                                         │
│  eBPF-программы (ядро)                  │
│    ├── tracepoints (хуки syscall'ов)    │
│    └── kprobes (хуки функций ядра)      │
│            │                            │
│    Ring buffers (4 канала)              │
│            │                            │
│  Агент (userspace, один бинарник Rust)  │
│    ├── eBPF consumer (парсинг + обогащ.)│
│    ├── Таблица процессов (pid→guid)     │
│    ├── Цепочка фильтров (дедупл. + конф)│
│    ├── SQLite spool (устойчивость)      │
│    └── gRPC transport                   │
└────────────┬────────────────────────────┘
             │ TLS / gRPC stream
             ▼
┌─────────────────────────────────────────┐
│           Сервер SecureExec             │
│  ├── Приём событий (gRPC)               │
│  ├── Alert engine (60+ встроенных правил)│
│  ├── Кастомные Starlark-правила         │
│  ├── Таблица процессов (lineage/агент)  │
│  ├── Индексация в Elasticsearch         │
│  └── Диспетчер реагирования             │
│           │                             │
│    Веб-консоль (Next.js)                │
│    ├── Дашборд алертов + поиск          │
│    ├── Визуализация дерева процессов     │
│    ├── Таймлайн инцидентов              │
│    └── UI действий реагирования         │
└─────────────────────────────────────────┘

Сбор событий через eBPF

Агент использует eBPF-программы, подключённые к tracepoints и kprobes ядра, для перехвата событий, значимых для безопасности, с минимальными накладными расходами. Kernel module не требуется — eBPF-программы загружаются при старте агента и корректно удаляются при остановке.

События проходят через четыре выделенных ring buffer'а, каждый с размером, подобранным под ожидаемую нагрузку:

Ring BufferРазмерТипы событий
PROCESS_EVENTS2 МБprocess_exec, process_fork, process_exit, exec_argv (покрывает execve и execveat)
FILE_EVENTS8 МБfile_create, file_modify, file_delete, file_rename, file_link, file_perm_change, sensitive_file_read
NETWORK_EVENTS1 МБnetwork_connect, network_listen, dns_query, raw_socket (AF_PACKET / SOCK_RAW / PACKET_MR_PROMISC)
SECURITY_EVENTS4 МБprivilege_change, process_vm_access, memfd_create, kernel_module_load, namespace_change, capability_change, bpf_program, process_signal, keyctl, interactive_shell_setup (dup2/dup3 stdio, setsid, ioctl TIOCSCTTY), process_masquerade (prctl PR_SET_NAME), container_escape (pivot_root, chroot), kernel_tamper (delete_module, kexec_load, kexec_file_load), file_capability_change (security.capability xattr), sysctl_change

Каждая запись в ring buffer'е начинается с байта event_tag: u8, определяющего тип события. Userspace-consumer читает тег, приводит оставшиеся байты к соответствующей #[repr(C)] структуре и конвертирует в типизированный вариант enum'а BpfEvent.

Что мы перехватываем

Агент сейчас инструментирует 40+ tracepoints и kprobes. Репрезентативная выборка, сгруппированная по стадиям атаки:

Выполнение и lineage процессов

  • sched_process_exec — каждый exec, включая полный argv через связанное событие EXEC_ARGV для длинных командных строк
  • sys_enter_execve / sys_enter_execveat — захват argv/envp как для классического exec, так и для memfd-варианта execveat(fd, "", AT_EMPTY_PATH)
  • sched_process_fork / sched_process_exit — обслуживание таблицы процессов

Файловый доступ (чтение и запись)

  • sys_enter_openat / security_file_open — файловые операции, фильтруются в ядре для исключения высокочастотного шума
  • sensitive-read sub-detector — open() на /etc/shadow, SSH host/identity keys, а также substring-матчинг против ~/.aws/credentials, ~/.kube/config, ~/.docker/config.json, GnuPG и password manager хранилищ
  • sys_enter_setxattr / sys_enter_lsetxattr / sys_enter_fsetxattr — запись расширенного атрибута security.capability (file capabilities persistence)

Сеть

  • sys_enter_connect / sys_enter_bind — соединения и прослушивающие сокеты с полным парсингом sockaddr
  • udp_sendmsg — извлечение DNS-запросов (UDP порт 53)
  • sys_enter_socket — флагируется при domain == AF_PACKET или type & SOCK_RAW
  • sys_enter_setsockopt — флагируется при PACKET_MR_PROMISC (включение promiscuous-режима)

Привилегии, инъекции и fileless-выполнение

  • sys_enter_setuid / sys_enter_setreuid — изменения привилегий
  • sys_enter_process_vm_writev — кросс-процессная запись в память (process injection)
  • sys_enter_memfd_create — in-memory файловые дескрипторы (с последующей корреляцией на exec-time, чтобы поймать пути /proc/self/fd/N и /memfd:)

Подготовка reverse-shell (сигналы до connect)

  • sys_enter_dup2 / sys_enter_dup3 — эмитятся, когда исходный FD — это сокет, а целевой — stdin/stdout/stderr (классическая обвязка dup2(s,0); dup2(s,1); dup2(s,2))
  • sys_enter_setsid — в связке с…
  • sys_enter_ioctl — эмитится на TIOCSCTTY (захват controlling terminal с pty/сокета)

Kernel tampering и побег из контейнера

  • sys_enter_init_module / sys_enter_finit_module — загрузка модулей
  • sys_enter_delete_module — выгрузка модулей (cleanup rootkit, анти-форензика)
  • sys_enter_kexec_load / sys_enter_kexec_file_load — live-замена ядра
  • sys_enter_unshare / sys_enter_setns — изменения namespace
  • sys_enter_pivot_root / sys_enter_chroot — подмена корня файловой системы (примитивы побега из контейнера)
  • sys_enter_prctl — эмитится на PR_SET_NAME и PR_SET_MM_ARG_START/END для детекции маскарада имени процесса (kernel-side фильтр отбрасывает no-op переименования, где новое имя совпадает с текущим comm)

Все eBPF-программы написаны на Rust с использованием фреймворка Aya.

Архитектура агента

Агент — это один статически скомпонованный бинарник на Rust с нулевыми зависимостями. Работает как systemd-сервис (secureexec-agent.service) и обычно потребляет менее 1% CPU и < 50 МБ RAM на production-сервере, генерирующем 50 000+ событий в минуту.

Пайплайн событий

eBPF ring buffers
  → parse_*_event()          (тег → BpfEvent вариант)
  → convert_bpf_events()     (BpfEvent → EventKind)
  → ProcessTable.resolve()   (pid → process_guid, username, container_id)
  → FilterChain              (дедупликация по content_hash, настраиваемые фильтры по типам)
  → SQLite spool             (устойчивая очередь на диске, переживает рестарт агента)
  → gRPC transport           (streaming или batch режим)
  → Сервер

Таблица процессов

Агент ведёт in-memory таблицу процессов, индексированную по PID. При старте выполняется перечисление /proc для построения базового снимка. По мере поступления событий process_exec, process_fork и process_exit таблица обновляется в реальном времени.

Каждая запись хранит:

  • PID и PPID (parent PID из procfs, не из tracepoint — tracepoint ненадёжен для PPID)
  • start_time (из /proc/{pid}/stat)
  • process_guid — стабильный SHA-256 хеш от (agent_id, pid, start_time), уникально идентифицирующий процесс даже при повторном использовании PID
  • username — разрешённый из карты UID→name, спарсенной из /etc/passwd при старте
  • container_id — извлечённый из /proc/{pid}/cgroup, если процесс работает внутри контейнера

process_guid — ключ, связывающий события с визуализацией дерева процессов в консоли. Благодаря включению start_time он различает два разных процесса, повторно использующих один PID.

Spool и повторная отправка

При потере gRPC-соединения с сервером события сохраняются в локальную базу SQLite (spool). При восстановлении соединения накопленные события переотправляются в порядке sequence number'ов. Heartbeat агента (AgentHeartbeat) сообщает значение spool_pending, чтобы операторы могли отслеживать backlog через веб-консоль.

Дедупликация по содержимому

Тело каждого события хешируется SHA-1 (трейт ContentHash). Агент поддерживает LRU-фильтр дедупликации на 65 536 записей. Если одинаковое содержимое события встречается дважды в пределах окна фильтра, дубликат отбрасывается до попадания в spool. Это устраняет избыточный шум от inotify-штормов и частых перезапусков процессов.

Схема событий (Protobuf)

Все события используют общий конверт:

message AgentEvent {
  string id          = 1;   // UUIDv4
  uint64 seqno       = 2;   // монотонный, per-agent
  string timestamp   = 3;   // ISO-8601
  string agent_id    = 4;
  string hostname    = 5;
  string os          = 6;
  string content_hash = 7;  // SHA-1 тела события
  string process_guid = 8;  // стабильный ID процесса
  string process_name = 9;
  uint32 process_pid  = 38;
  string username     = 40;
  string container_id = 41;

  oneof kind {
    ProcessEvent        process_create    = 10;
    ProcessEvent        process_fork      = 25;
    ProcessEvent        process_exit      = 11;
    FileEvent           file_create       = 12;
    FileEvent           file_modify       = 13;
    FileEvent           file_delete       = 14;
    FileRenameEvent     file_rename       = 15;
    NetworkEvent        network_connect   = 16;
    NetworkEvent        network_listen    = 17;
    DnsEvent            dns_query         = 18;
    UserLogonEvent      user_logon        = 20;
    PrivilegeChangeEvent  privilege_change  = 26;
    ProcessVmEvent      process_vm_access  = 31;
    MemfdCreateEvent    memfd_create       = 32;
    KernelModuleEvent   kernel_module_load = 30;
    NamespaceChangeEvent namespace_change  = 36;
    CapabilityChangeEvent capability_change = 34;
    SensitiveFileReadEvent     sensitive_file_read     = 55;
    InteractiveShellSetupEvent interactive_shell_setup = 56;
    RawSocketEvent             raw_socket              = 57;
    SysctlChangeEvent          sysctl_change           = 58;
    ProcessMasqueradeEvent     process_masquerade      = 59;
    ContainerEscapeEvent       container_escape        = 60;
    KernelTamperEvent          kernel_tamper           = 61;
    FileCapabilityChangeEvent  file_capability_change  = 62;
    // ... и другие
  }
}

Поле seqno — монотонно возрастающий счётчик per-agent. Обеспечивает полную упорядоченность событий внутри хоста и служит вторичным ключом сортировки (после @timestamp) в запросах Elasticsearch, что даёт корректный порядок событий с субмиллисекундной точностью.

Серверный движок детекции

Сервер оценивает каждое входящее событие по набору правил алертов. Правила бывают двух типов:

Встроенные правила (60+ правил)

Нативные Rust-правила, скомпилированные в бинарник сервера. Каждое правило реализует трейт AlertRule:

pub trait AlertRule: Send + Sync {
    fn name(&self) -> &str;
    fn description(&self) -> &str;
    fn severity(&self) -> &str;        // "low" | "medium" | "high" | "critical"
    fn evaluate(&self, ctx: &AlertContext, events: &[AgentEvent]) -> Vec<AlertEvent>;
}

Правила получают батчи событий и AlertContext, включающий серверную таблицу процессов для разрешения lineage. Примеры:

  • Reverse Shell — матчит shell-процессы (bash, sh, zsh, dash, ksh), устанавливающие исходящие соединения к не-приватным IP, плюс более сильный stateful-путь: событие InteractiveShellSetup(dup2_stdio), за которым в течение 30 с от того же процесса следует NetworkConnect на публичный IP, срабатывает даже для нормально разрешённых shell'ов
  • SSH Brute-Force — stateful-правило со sliding window счётчиком per (source_ip, agent_id) и cooldown-таймером для предотвращения флуда алертов
  • Ransomware — multi-signal правило: создание ransom note, переименование файлов в encrypted-расширения, детекция скорости массового переименования (20+ за 60с) и паттерны команд уничтожения бэкапов
  • Криптомайнер — cross-event-type правило, матчащее имена процессов, stratum-паттерны в командных строках, порты майнинг-пулов и DNS-запросы к известным доменам пулов

Каждое правило включает allowlist для известных легитимных процессов. Например, правило Privilege Escalation исключает sshd (privilege separation), su, sudo, cron и systemd-executor.

Новые правила — кража учётных данных, kernel tamper, маскарад

Вторая волна правил усиливает покрытие credential access, подготовки reverse shell, сниферов, kernel tampering, побега из контейнера и техник маскарада:

  • Credential File Read (credential_file_read) — чтение /etc/shadow, SSH host keys, ~/.aws/credentials, ~/.kube/config, ~/.docker/config.json, GnuPG и password manager хранилищ процессами вне allowlist. Отфильтровывает sshd, sudo, login, пакетные менеджеры и других легитимных читателей.
  • Kernel Memory Read (kernel_memory_read) — открытие /proc/kcore, /proc/kallsyms, /proc/<pid>/mem, /dev/mem, /dev/kmem не-root или неожиданными процессами — типичный путь KASLR-bypass и live-dump символов ядра.
  • Interactive Shell over Socket (interactive_shell_over_socket) — срабатывает до любого исходящего connect: dup2(socket, 0|1|2) от shell-подобного процесса или setsid + ioctl(TIOCSCTTY) от bash/sh/socat/ncat. Ловит reverse shell, которые сетевое правило пропустит (приватные адресаты, TLS-обёрнутый C2 и т.д.).
  • Raw Socket / Sniffer (raw_socket_sniffer) — socket(AF_PACKET, SOCK_RAW, …) или setsockopt(PACKET_MR_PROMISC) процессами, кроме tcpdump, dhclient, NetworkManager, wpa_supplicant, chronyd.
  • Kernel Hardening Downgrade (kernel_hardening_downgrade) — запись в kernel.yama.ptrace_scope, kernel.kptr_restrict, kernel.modules_disabled, kernel.unprivileged_bpf_disabled, net.ipv4.ip_forward — атакующие ослабляют их перед инъекциями, загрузкой rootkit или pivoting.
  • Process Name Masquerade (process_name_masquerade) — prctl(PR_SET_NAME) переименование процесса под kernel threads ([kworker], [ksoftirqd], [migration]) или системные демоны (systemd-*, dbus-daemon, sshd), когда исполняемый файл лежит в /tmp, /var/tmp, /dev/shm, /home или другом user-writable пути.
  • Pivot Root Escape (pivot_root_escape) — pivot_root вне известных container-runtime (runc, containerd, crun, docker-init, kubelet). В сочетании с существующим правилом namespace-escape, которое теперь также срабатывает на chroot от non-runtime процессов.
  • Kernel Tampering (kernel_tamper) — delete_module, kexec_load, kexec_file_load из неожиданных родителей — выгрузка rootkit, live-замена ядра, Diamorphine-style анти-форензика.
  • File Capability Persistence (file_capability_persistence) — setxattr/fsetxattr пишет security.capability на файл под /tmp, /var/tmp, /dev/shm или /home. Даёт root-эквивалентные права (CAP_SYS_ADMIN, CAP_DAC_READ_SEARCH) пользовательскому бинарнику без setuid.
  • Sudo Brute-Force (sudo_bruteforce) — 5+ событий sudo_failure от одного пользователя за 60 секунд. Ловит локальный privilege escalation и украденные низкопривилегированные креды.

Два существующих правила также усилены:

  • Fileless Execution — был одиночный сигнал memfd_create; теперь коррелирует MemfdCreate с последующим ProcessCreate, где путь к исполняемому файлу начинается с /proc/self/fd/ или /memfd:, от того же процесса в течение 120 с.
  • Namespace Escape — теперь также срабатывает на ContainerEscape(chroot) от non-runtime процессов, в дополнение к существующим путям unshare/setns.
  • Systemd Service Persistence — теперь покрывает unit-типы .timer, .path, .socket, .mount и .automount в дополнение к .service.

Третья волна — pure-server правила по тактикам ATT&CK (май 2026)

Третья волна добавила 30 pure-server правил (без новых eBPF-событий), сгруппированных по тактикам MITRE ATT&CK и настроенных с allowlist процессов:

Persistence (TA0003): shell-init persistence, tampering PAM, sshd_config, NSS/DNS, tampering репозиториев пакетного менеджера, boot/EFI/initramfs config, at-job persistence. Правило systemd теперь также покрывает timer/path/socket/mount unit.

Defense Evasion (TA0005): очистка shell history, tampering login-логов, tampering syslog, tampering правил auditd, сброс/отключение firewall, злоупотребление chattr +i, self-defense агента.

Privilege Escalation (TA0004): PwnKit / CVE-2021-4034, SUID в user-writable каталогах, GTFOBins SUID abuse.

Discovery / Lateral Movement (TA0007/TA0008): web shell execution, доступ к cloud IMDS, reverse SSH tunnel, исходящий port scan.

Exfiltration / Impact (TA0010/TA0040): DNS tunneling, bulk archive-then-egress, disk wipe/format, mass log destruction.

Несколько шумных правил (gtfobins_suid_abuse, web_shell_execution, history_clear, dns_tunneling, port_scan_outbound) рекомендуется изначально ставить на паузу через per-org таблицу paused_builtin_rules, пока не изучена локальная форма трафика.

Кастомные Starlark-правила

Пользователи могут писать правила детекции на Starlark (Python-подобный конфигурационный язык). Кастомные правила хранятся в PostgreSQL и перезагружаются без перезапуска сервера. Они имеют доступ к тому же AlertContext и данным событий, что и встроенные правила.

Правила подавления

Starlark-based правила подавления позволяют отфильтровать известные ложные срабатывания. Они оцениваются после правил алертов и могут подавить конкретные алерты по имени правила, severity, имени процесса или любому полю события.

Хранение в Elasticsearch

События и алерты индексируются в Elasticsearch с отдельными шаблонами индексов:

  • События: secureexec-events-{org_id}-* — ежедневная ротация, 7-дневное хранение (настраивается)
  • Алерты: secureexec-alerts-{org_id}-* — ежедневная ротация, 90-дневное хранение

Сервер использует _bulk API для высокопроизводительной индексации. Каждое событие индексируется со всеми полями конверта и типо-специфичным payload'ом, что позволяет выполнять полнотекстовый поиск по командным строкам, путям файлов, IP-адресам и DNS-запросам.

Возможности реагирования

При обнаружении угрозы операторы могут действовать прямо из веб-консоли:

  • Сетевая изоляция — агент настраивает правила iptables для блокировки всего трафика, кроме gRPC-канала агент↔сервер. Хост эффективно изолирован, но остаётся управляемым.
  • Уничтожение дерева процессов — отправляет SIGKILL всей группе процессов от PID-предка, завершая полную цепочку атаки.
  • Блокировка по хешу или пути — использует fanotify для запрета exec-разрешений для конкретных хешей файлов или путей. Правила мгновенно применяются ко всем агентам организации.
  • Глобальный блок-лист — централизованно управляемые правила блокировки, распространяемые на все конечные точки.

Команды реагирования доставляются агентам через gRPC control channel (CommandStream). Агент опрашивает наличие ожидающих команд на каждом heartbeat-интервале.

Таймлайн инцидентов

Таймлайн инцидентов восстанавливает хронологическую историю атаки из любой точки входа — алерта, процесса или временного окна на конкретном хосте.

Сервер запрашивает Elasticsearch на события, соответствующие scope (agent_id + process_guid + временной диапазон), опционально разрешает lightweight lineage процессов (one-hop lookup родителя из process_create/fork событий) и объединяет события с соответствующими алертами. Каждая запись размечается фазой атаки (Initial Access, Execution, Persistence, C2) на основе эвристик — например, исходящие соединения к внешним IP размечаются как C2, а записи в cron-директории — как Persistence.

Развёртывание

Агент поставляется как .deb или .rpm пакет и устанавливается менее чем за 60 секунд:

dpkg -i secureexec-agent.deb
systemctl start secureexec-agent

Поддерживаемые дистрибутивы: Ubuntu 20.04+, Debian 11+, RHEL 8+, Amazon Linux 2. Единственное требование к ядру — поддержка eBPF (kernel 5.4+). Для более старых ядер доступен опциональный kernel module fallback.

Серверные компоненты (API-сервер, Elasticsearch, PostgreSQL) разворачиваются через Docker Compose для single-node установок или Kubernetes для production-кластеров.

Открытые вопросы и roadmap

Активные направления разработки:

  • File integrity monitoring со сравнением с baseline
  • Интеграция YARA-сканирования для анализа файлов на хосте
  • Библиотека Starlark-правил с community-контрибуциями
  • Поддержка агентов для macOS и Windows (Endpoint Security framework и ETW соответственно)

По вопросам или для guided walkthrough на вашей инфраструктуре — запросите демо. Демо проходит на реальном Linux-хосте, без слайдов.

SecureExec

SecureExec — Linux-first EDR для детекции, расследования и реагирования на инциденты на серверах. Cloud или self-hosted.

Продукт
  • Цены
Компания
  • О нас
  • Блог
  • Связаться с отделом продаж
  • Поддержка
Аккаунт
  • Войти
  • Регистрация
Правовая информация
  • Политика конфиденциальности
  • Условия использования

© 2026 SecureExec. Все права защищены.

Built with Rust & Next.js