Вопрос или проблема
Я хотел бы знать, есть ли способ запустить приложение до исчерпания всех возможных исходов, которые оно может предоставить.
Что я имею в виду:
Предположим, что у кого-то есть HTTP-сервер (Apache). Я пытаюсь создать профили нормального выполнения этого http-сервера. Эти профили будут затем использоваться в качестве песочницы/обертки для этого конкретного приложения, и если приложение выполняет что-то другое, кроме этого (из-за вредоносной активности приложения, такой как инъекция кода), выполнение должно быть остановлено, и должно быть выдано предупреждение.
Чтобы сделать это более понятным, предположим, что выполнение приложения полностью детерминировано.
Мы знаем с самого начала, что приложение выведет либо число 30, либо число -5, либо число 0. Если приложение, например, выдает любое другое число, кроме указанных, то мне нужно показать ошибку. Или, может быть, если оно выводит строку или символ, тогда снова мне нужно выдать ошибку, потому что мы ожидаем только числа 30, -5 или 0.
Чтобы сделать это более реалистичным:
Я пытаюсь каким-то образом исчерпать все возможные результаты выполнения http-сервера и проверить, какие вызовы он делает в ядре Linux. Таким образом, я мог бы профилировать, как он обычно взаимодействует с ядром, учитывая все нормальные выполнения, а затем сравнить эти профили с реальными выполнениями. Если в какой-то момент реальные выполнения отклоняются от этих профилей, то я должен отобразить сообщение о том, что что-то не так.
Теперь вы можете задаться вопросом, что если, например, сервер получает обновление программного обеспечения, тогда его выполнение может отклоняться, потому что исходный код изменился с предыдущей версии. И вы правы. Но давайте предположим, что мы остаемся на конкретной версии и не сдвигаемся с этого места, независимо от того, есть ли обновления или нет. Так что мы профилируем только одну версию http-сервера.
Что я пытался сделать до сих пор, так это скачать apache и запустить strace, одновременно отправляя http-запросы через postman. Но кажется, что это не очень полезно, так как я не вижу значительных различий в логах strace.
Итак, возможно ли создать такие профили?
Вы могли бы предоставить реальные сценарии с apache-сервером (если возможно) или любым другим http-сервером, который может быть проще.
—ОБНОВЛЕНИЕ—
УТОЧНЕНИЯ:
Я понимаю, что я не очень четко сформулировал проблему. Прошу прощения за любую путаницу, которую создал мой вопрос. Я не был в правильном настроении, когда писал это. Итак, чтобы прояснить ситуацию:
В основном, если у меня есть http-сервер (apache или любой другой), в зависимости от различных возможных выполнений сервера, я хочу наблюдать/аудировать, как он взаимодействует с ядром Linux.
Позвольте мне привести пример:
Предположим, что я запускаю http-сервер на 10.0.0.2 на машине с Ubuntu и делаю GET-запрос таким образом: http://10.0.0.2/log/log.txt.
Я хочу видеть на уровне ядра linux, как http-сервер взаимодействует с ядром для этого запроса. Например, пробовал ли сервер вызвать какую-то версию alloc (malloc, calloc и т. д.). Если да, то какие были параметры? Или, может быть, он вызвал system(). Почему? Каковы были параметры, если таковые имеются?
Теперь в зависимости от того, какие функции он вызывает и какие типы параметров он передает через вызовы, я хочу профилировать сервер.
Я понимаю, что существует множество различных запросов на http-серверах с разными параметрами, и ложноположительные, ложноотрицательные и т. д. – это очень вероятно. Но по крайней мере я хочу попробовать и увидеть, какие данные я мог бы отслеживать.
Еще раз прошу прощения за путаницу, и надеюсь, что это немного прояснит ситуацию.
Было бы замечательно, если бы существовал способ автоматически и надежно различать вредоносное и безвредное поведение. Это сразу решило бы множество проблем в области IT-безопасности. К сожалению, такого не существует.
Проблема становится очевидной, когда вы пытаетесь определить “нормальное” поведение. Сначала вы говорите о том, как вывод программы может отклоняться от ожидаемого вывода. Но в вашем примере с Apache вы внезапно рассматриваете все возможные пути выполнения как “нормальные” – это включает в себя неожиданные, неисправные и даже вредоносные поведение.
Таким образом, очевидно, что не каждый возможный путь выполнения является безвредным. Если у программы есть уязвимости или ошибки в общем, то некоторые входные данные приведут к поведению, которое вы считаете нежелательным. Если вы хотите, чтобы инструмент различал эти два случая, вам нужны очень конкретные критерии. Есть несколько вариантов.
- Вы можете позволить авторам программы или поддерживающим пакет определить, что считается “нормальным”. Например, многие веб-серверы уже имеют политику SELinux, в которой точно указано, что серверу разрешено делать.
- Если у пользователя веб-сервера есть четкое понимание того, что должно и не должно происходить, можно написать политику вручную.
- Вы могли бы запустить веб-сервер в тестовом окружении (которое должно быть как можно ближе к рабочему), выполнить все виды общих задач и записать поведение программы. Обратите внимание, что вам затем придется проверить результаты и решить, что является “нормальным”, а что нет, потому что вы уже могли случайно вызвать нежелательное поведение.
- Вы могли бы попробовать обнаружение аномалий. Например, вы могли бы обучить классификатор с помощью примеров поведения, а затем заставить его предсказать, является ли наблюдаемое поведение “нормальным”.
В любом случае, не ожидайте идеальных результатов. Веб-серверы – это очень сложные приложения, которые нельзя полностью описать несколькими простыми правилами. Всегда существует риск ложных отрицательных и ложных положительных результатов, то есть вы можете пропустить вредоносное поведение, и вы можете неверно классифицировать безвредное поведение как вредоносное.
Ответ или решение
Профилирование выполнения HTTP-сервера: Подход и рекомендации
В вашем запросе содержится важная и интересная задача: профилирование выполнения HTTP-сервера (например, Apache) для детального анализа его поведения в нормальных условиях. Ниже представлены основные шаги и рекомендации по созданию такой системы профилирования.
1. Определение «нормального» поведения
Первоначально важно четко установить, что вы считаете «нормальным» поведением вашего HTTP-сервера. Для этого необходимо:
- Документация: Изучите документацию к вашему веб-серверу. Например, Apache имеет различные модули и настройки, и важно понять, какие из них активны в вашей конфигурации.
- Валидация входных данных: Определите сценарии запросов, которые сервер должен обрабатывать (GET, POST и т.д.), и какие данные должны быть возвращены.
- Ожидаемые системные вызовы: Установите список системных вызовов, которые могут появляться в вашей рабочей среде, например, вызовы памяти (malloc, calloc и др.), файловые операции и сетевые взаимодействия.
2. Использование инструментов для профилирования
Для достижения поставленных целей вы можете использовать различные инструменты, которые помогут отслеживать выполнение и взаимодействие сервера с ядром Linux:
-
strace: Вы уже начали использовать strace, и это хороший шаг. Он позволяет отслеживать системные вызовы, которые ваш сервер выполняет. Рекомендуется запускать strace с флагами для фильтрации интересующих вас системных вызовов (например,
strace -e trace=memory,file,network
). -
Sysdig: Этот инструмент предоставляет возможность глубокого анализа взаимодействия с системой, включая файлы, процессы и сетевые операции. Вы можете записывать сессии и анализировать их позже, чтобы находить отклонения от нормального поведения.
-
Auditd: Установите аудит на уровне ядра для записи любых системных событий. Он может помочь отследить подозрительные действия и позволит вам создавать правила для предупреждения.
3. Создание профиливующих профилей
-
Тестирование сценариев: Проведите множество тестовых сценариев, отправляя запросы к серверу. Запишите все действия, выполняемые сервером, и проанализируйте полученные данные.
-
Сравнение: Используйте полученные данные для создания базового профиля. При проведении будущих тестов сравнивайте результаты с этим профилем. Если появляются неожиданные системные вызовы или параметры, который не соответствуют вашему профилю, это может указывать на проблему.
4. Обработка обновлений и изменений
Как вы правильно отметили, обновления могут влиять на параметры выполнения. Чтобы этот фактор был наиболее нейтрализован:
-
Создание базовых профилей для каждой версии: Каждую новую версию сервера обрабатывайте индивидуально, создавая отдельные профили. Это позволит вам понять, как каждая версия функционирует и избежать конфликтов.
-
Мониторинг изменений конфигурации: Следите за изменениями конфигураций, которые могут повлиять на поведение сервера. Разрабатывайте процесс, который обязует администраторов документировать изменения в конфигурациях.
Заключение
Создание надежных профилей выполнения HTTP-сервера — это комплексный процесс, который требует глубокого понимания как работы самого сервера, так и взаимодействия с ядром операционной системы. Важно помнить, что ни один метод не гарантирует 100% точности, и поэтому рекомендуется комбинировать различные подходы и методы для достижения наилучших результатов.
Для повышения безопасности сервера также рассмотрите возможность использования систем IDS/IPS, которые помогут обнаруживать и блокировать потенциальные угрозы до того, как они повлияют на вашу инфраструктуру.