Финуниверситет — Информационная безопасность

Защита Linux-процессов в ВКР: перекрываем запуск через аргументы и переменные окружения

В разборе на «Хакере» от 27 марта 2026 года показан приём, ломающий запуск программы в Linux без правки бинарника и без возни с правами доступа. Атака бьёт по данным, которые процесс получает на старте: по аргументам командной строки и переменным окружения. Механика проста — ядро при вызове execve копирует argv и envp в свежую область стека, и как только одна строка вида «ИМЯ=значение» переваливает за MAX_ARG_STRLEN (32 страницы, то есть 128 КиБ на архитектуре x86_64), вызов падает с E2BIG. Ветка, унаследовавшая такое окружение, больше не запускает ничего.

Для выпускника ИТ это не страшилка, а готовый каркас дипломной работы: понятная модель угроз, воспроизводимый стенд, измеримые метрики и очевидная практическая новизна. Тема ложится и в безопасность, и в DevOps, и в системный анализ — были бы руки и умение считать цифры, а не только пересказывать мануалы.

Быстрые ответы: что чаще всего спрашивают на консультации

Законно ли вообще ставить такие эксперименты в рамках диплома?

Законно и нормально, если вы работаете в изолированном контуре: собственные виртуальные машины, локальный Docker или изолированный стенд в лаборатории кафедры. Никакого прода, никаких чужих хостов, никакой эксплуатации в сети вуза. В тексте работы обязательно зафиксируйте: среда эксперимента — изолированный полигон, сгенерированный заново после каждой итерации. Это снимает 90% вопросов комиссии и снимает риски по ст. 272 УК РФ.

Обязательно писать эксплойт на C или хватит Python и shell?

Отдельный код на C нужен только в одном сценарии: когда вы хотите показать поведение execve на уровне системного вызова и точно поймать E2BIG. Во всех остальных случаях хватит Python и shell — они отлично воспроизводят «отравление» окружения и наследование переменных. Зато модуль защиты на eBPF/LSM без C не напишете, это стоит заложить в смету задач с самого начала.

Нужна ли тут ML-модель? Вуз требует «интеллектуальности»

Не нужно втягивать нейросеть ради галочки. Гораздо убедительнее звучит гибрид: детерминированные правила по длине и структуре строк плюс статистический профиль нормального окружения (средняя длина переменной, число переменных, доля небуквенных символов). Если кафедра настаивает на ML — берите изолирующий лес или простую логистическую регрессию на 8–10 признаках и честно покажите, что выигрыш по F1 не перекрывает рост сложности сопровождения. Такой вывод комиссия любит больше, чем «мы прикрутили LSTM к системному вызову».

Какие метрики считать, чтобы защита выглядела доказанной?

Минимум четыре: доля ложных срабатываний (FPR), доля пропущенных атак (FNR), накладные расходы на один execve в микросекундах и коэффициент снижения успешных попыток блокировки запуска. Плюс одна интегральная — снижение риска недоступности сервиса, привязанное к характеристике Security из ISO/IEC 25010. Замеры делайте не на одном прогоне, а на серии из 30–50 повторов, иначе любой дотошный рецензент разобьёт ваши выводы одним вопросом про дисперсию.

Темы ВКР, которые вырастают из этого кейса

Раскладка материала статьи по главам диплома

Глава 1: превращаем новостной кейс в аналитическую часть

Здесь кейс из «Хакера» работает как источник актуальности, но пересказом ограничиваться нельзя. Раскрутите цепочку до уровня ядра: do_execveat_common() считает суммарный размер argv+envp и ограничивает его через bprm_stack_limits(). Суммарный ARG_MAX на типовой конфигурации измеряется в мегабайтах, а вот на отдельную строку действует жёсткий предел в 32 страницы. Это и есть ключевая точка: одна переменная окружения длиной 140 КБ гарантированно валит execve с E2BIG, причём она спокойно переживает наследование через shell, sudo и менеджер сервисов.

Обязательно вставьте проверяемые команды: getconf ARG_MAX, xargs --show-limits, ulimit -s. Зафиксируйте результаты в таблице «Конфигурация стенда — измеренный предел». Это превратит главу из реферата в исследование. Модель угроз постройте по STRIDE и привяжите к MITRE ATT&CK (техника T1499, Endpoint Denial of Service) и к CWE-400/CWE-770.

Глава 2: проектирование и реализация

Архитектуру описывайте в нотации C4: контекст (администратор, хост, система мониторинга), контейнеры (перехватчик, хранилище политик, сборщик событий), компоненты (валидатор строк окружения, реестр whitelist, эмиттер метрик). Ниже — уровень потока данных DFD первого уровня, по ГОСТ 19.701-90 рисуете блок-схему алгоритма проверки перед разрешением запуска. Не смешивайте нотации в одном рисунке — это первая ошибка, на которой спотыкается нормоконтроль.

Глава 3: эксперимент, стенд и метрики

Стенд разворачивается скриптом, иначе воспроизводимость не докажете. Берёте базовый образ, фиксируете ядро, страницы по 4 КиБ, одинаковый лимит стека. Прогоняете сценарии: нормальное окружение, «раздутая» одна переменная, «раздутые» множество переменных в пределах суммарного лимита, легитимные длинные строки (например, вложенные JWT в переменной окружения — да, так тоже бывает). Считаете FPR и FNR именно на последнем сценарии, иначе защита окажется бесполезной в реальной эксплуатации.

Приложение: код и конфигурации

/* demo_e2big.c — воспроизводим отказ запуска через окружение */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(void) {
    const size_t len = 140 * 1024;          /* > MAX_ARG_STRLEN = 128 КиБ */
    char *blob = malloc(len + 16);
    if (!blob) return 2;

    memset(blob, 'A', len);
    memcpy(blob + len, "=x", 3);            /* формат ИМЯ=значение */

    char *envp[] = { blob, NULL };
    char *argv[] = { "/bin/true", NULL };

    execve(argv[0], argv, envp);
    perror("execve");                        /* ожидаем E2BIG (errno 7) */
    return 1;
}
# /etc/systemd/system/myservice.service.d/harden.conf
[Service]
# передаём только явно разрешённые переменные, остальное отсекаем
PassEnvironment=
EnvironmentFile=/etc/myservice/env.allow
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
TasksMax=256
LimitNOFILE=4096
#!/bin/sh
# audit-len.sh — ищем подозрительно длинные переменные окружения в /proc
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  [ -r "/proc/$pid/environ" ] || continue
  tr '\0' '\n' < "/proc/$pid/environ" 2>/dev/null | awk -v p="$pid" '
    { n = length($0); if (n > 8192) printf "PID %s: строка %d байт\n", p, n }'
done

Метрики: чем доказать, что защита работает

МетрикаЧто показываетКак считатьОриентир для защиты ВКР
FPR (ложные срабатывания)Сколько легитимных запусков блокируется зряДоля блокировок на наборе «нормальных» сценариевНиже 1%, иначе сервис будет падать от защиты
FNR (пропуски)Сколько атак прошло мимоДоля успешных попыток из тестового набораНиже 5% при детерминированных правилах
Задержка на execveЦена контроля запускаРазница медиан времени запуска с фильтром и безДесятки микросекунд, не миллисекунды
Коэффициент блокировокЭффект по существу1 − (успешные попытки после / до внедрения)Не ниже 0,9 на целевом сценарии
MTTR инцидентаУправляемость реакцииСреднее время от события до снятия блокировкиСокращение в разы, а не на проценты
Накладные расходыРесурсоёмкостьCPU и RSS перехватчика под нагрузкойДо 2–3% CPU на хосте средней загрузки

Чему вы научитесь

Что проверить перед сдачей

  • Задачи из введения дословно совпадают с задачами в главах и с выводами в заключении — расхождений нет ни в одном пункте.
  • Все рисунки пронумерованы, подписаны и упомянуты в тексте; нотации (DFD, UML, C4) не смешаны в одном рисунке.
  • Метрики приведены с числом прогонов, единицами измерения и описанием методики замера.
  • Код в приложении собирается на чистой машине по инструкции из двух-трёх команд.
  • Ссылки на стандарты оформлены по ГОСТ 7.32-2017, а исходная статья указана в списке источников.
  • Проверка на заимствования пройдена, цитаты из исходной статьи оформлены как цитаты, а не выданы за свои.
  • Оглавление, нумерация страниц и подписи в приложениях соответствуют требованиям методички кафедры.

Типичные ошибки студентов

1. Путают суммарный лимит и лимит на строку. В отчёте появляется «ARG_MAX равен 128 КиБ» — и выводы разваливаются на первом же вопросе. В статье речь именно о пределе на отдельную строку ИМЯ=значение. Разведите два ограничения в тексте и в таблице замеров, покажите оба числа.

2. Ломают собственную рабочую машину. Эксперимент с «раздутыми» переменными в .bashrc или .profile приводит к тому, что перестают запускаться даже базовые утилиты. Все опыты — только в одноразовой виртуалке или контейнере, с обязательной точкой отката.

3. Делают защиту без метрик ложных срабатываний. Комиссия задаст один вопрос: «А сколько нормальных процессов вы заблокировали?» Если ответа нет, работа скатывается из инженерной в описательную. Заложите в план эксперимента отдельный сценарий с легитимно длинными переменными — там же прячутся токены и сериализованные конфиги.

Если тема кажется перспективной, но непонятно, с чего начать расчёты, — приходите на бесплатную консультацию. Разберём ваш случай, поможем спланировать эксперимент и оценить, укладывается ли объём в стандартные 120 часов работы над текстом. Возьмёмся за любую тему: от безопасности Linux до облачных архитектур. Помощь с дипломом — это не про «написать за вас», а про то, чтобы вы понимали каждый свой вывод.

Материал подготовлен экспертами компании «[Название сайта]». Мы помогаем студентам с 2010 года: консультируем по структуре, методикам, нормоконтролю и защите. Если вам нужна помощь в разработке темы или оформлении работы, наши специалисты готовы подсказать, где у вас слабое место и как его закрыть до защиты.

Последнее обновление: 2026-10-07

Источник: Мощные аргументы. Блокируем запуск процессов в Linux через переменные окружения (опубликовано 2026-03-27)