Проверка целостности исполняемых файлов во время выполнения - PullRequest
3 голосов
/ 07 апреля 2011

Я только что закончил писать модуль безопасности linux, который проверяет целостность исполняемых файлов в начале их выполнения (используя цифровые подписи).Теперь я хочу копнуть немного глубже и хочу проверить целостность файлов во время выполнения (то есть периодически проверять их - так как я в основном имею дело с процессами, которые запускаются и работают вечно ...), чтобы злоумышленник невозможность изменить файл в основной памяти без идентификации (по крайней мере, через некоторое время).

Проблема здесь в том, что я абсолютно не знаю, как я могу проверить текущий образ памяти файла.Мой метод аутентификации, упомянутый выше, использует mmap-ловушку, которая вызывается всякий раз, когда файл mmapped перед его выполнением, но, насколько я знаю, среда LSM не предоставляет инструментов для периодических проверок.

Так что мой вопросЕсть какие-нибудь намеки, как я должен начать это?Как я могу прочитать образ памяти и проверить ее целостность?

Спасибо

1 Ответ

2 голосов
/ 09 апреля 2011

Я понимаю, что вы пытаетесь сделать, но я действительно беспокоюсь, что это может быть функция безопасности, которая дает вам теплое нечеткое чувство без веской причины;и это самые опасные виды защиты.(Другим примером этого может быть LSM, сидящий рядом с вашим, SElinux. Хотя я думаю, что я в меньшинстве по этому мнению ...)

Программные данные процесса - не единственноеэто влияет на его поведение.Переполнение стека, когда вредоносный код записывается в стек и попадает в него, проверяет целостность исходного текста программы.Не говоря уже о том, что злоумышленник может использовать исходный неизмененный текст программы в своих интересах .

Также, вероятно, есть некоторые проблемы с производительностью, с которыми вы можете столкнуться, если вы постоянно вычисляете DSAвнутри ядра.И вы добавляете намного больше к длинному списку кода привилегированного ядра, который может быть использован позже.

В любом случае, чтобы решить вопрос: вы можете написать модуль ядра, который создает ядроПоток, который по таймеру проходит через каждый процесс и проверяет его целостность.Это можно сделать, используя таблицы страниц для каждого процесса, сопоставляя страницы, доступные только для чтения, и проверяя их целостность.Однако это может не сработать, поскольку каждая страница памяти, вероятно, должна иметь свою собственную подпись, если только вы каким-то образом не объедините их все вместе.

Следует отметить, что общие библиотеки необходимо проверять целостность только один раз заразвертка, так как они повторно отображаются во всех процессах, которые их используют.Однако для его реализации требуется изощренность, поэтому, возможно, имейте это в разделе «хорошо иметь» вашего дизайна.

Если вы не согласны с моим обоснованием того, что это может быть не очень хорошей идеей, я быбыть очень заинтересованным в ваших мыслях.Я столкнулся с этой идеей на работе некоторое время назад, и было бы неплохо привнести свежие идеи в наше обсуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...