Простой контроль целостности процесса под Linux

В очередной раз решил попробовать написать драйвер (aka модуль ядра), но на этот раз под Linux. Задача, выполняемая модулем, будет аналогична рассмотренной ранее в примере драйвера под Windows.
Я не буду приводить описание методов работы со списками, которые используются в коде, так как они довольно просты, хорошо документированы (например, тут) и не слишком отличаются по логике от тех, которые доступны в Windows. Также за бортом останется детальное описание базового прототипа модуля, который будет использован для тестирования реализации функций контроля целостности. Хорошую развернутую статью про основы разработки модулей ядра под Linux можно почитать тут.

Перейдем непосредственно к коду. Как и раньше, начну с формата, в котором хранятся контрольные суммы областей памяти процесса.

Как видите, на этот раз я оперирую не секциями, а регионами памяти процесса. Это позволяет упростить код и избавить себя от необходимости разбирать что-либо относящееся к формату ELF.
Основные функции контроля целостности процесса стали ещё более простыми (по сравнению с реализацией под Windows), рассмотрим их ниже.

Перейдем к паре оставшихся основых функций, которые оперируют со списком контрольных сумм и осуществляют обход памяти процесса.

Ещё пара скучных функций, которые осуществляют инициализацию двусвязного списка и служал чем-то вроде заготовки, чтобы в дальнейшем можно было легко сделать единообразное кроссплатформенное API.

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

Ещё нам понадобится небольшая тестовая программа, которая будет общаться с нашим модулем. С помощью неё и GDB мы проведем тестирование модуля. Исходный код:

Скомпилируем тестовую программу с помощью GCC:

Модуль соберем с помощью простого мейкфайла:

Установим модуль в систему с помощью modprobe или скажем insmod (в успешной установке модуля можем убедиться с помощью lsmod).

2013-06-25_11-07-45

Выполним команду, которую модуль вывел в системный лог (можно посмотреть с помощью dmesg), чтобы создать "специальный файл" для общения с нашим модулем. Запустим программу под GDB и поставим брейкпоинт в цикле.

2013-06-25_11-59-44

Контрольные суммы посчитаны, всё нормально.

2013-06-25_12-01-23

Теперь поменяем один байт в памяти процесса и продолжим выполнение программы.

2013-06-25_14-48-10
2013-06-25_14-49-30

Контрольная сумма не совпала и модуль ядра сообщил нам об этом.

Исходный код полностью: integrity-module-linux

Простой контроль целостности процесса под Linux: 22 комментария

  1. Во, отлично, молодцы! Давно ждал чего-нить под Линукс. Да и вообще - что-то заглох Ваш блог. Может скрипт сделать кастомизации и сборке своего дистра на основе Gentoo Hardened?

    1. Он не заглох, просто мы были на отдыхе какое-то время. Что-то всегда делается, вот например две статьи появилось сразу почти)

      1. Здорово. DX, планируется ли сделать акцент на информационную безопасность, в частности на криптографию? Какие вообще планы по блогу и статьям - тематика и тд. Если можно конечно. Просто интересно, что сейчас планируется.
        Спасибо.

        1. Конкретно ничего не планируется заранее. Приходит идея, пишем) Из планов только пятый квест, больше ничего. На криптографию упор вряд ли будет делаться, разве что если что-то интересное в этой области попадется.

  2. DX, поясни, а почему ты не видишь интереса в криптографии и ИБ? Может и мне не стоит туда засматриваться.
    Спасибо.

    1. ИБ это слишком широкое понятие. Контроль целостности программы под linux от каими - это тоже ИБ) Защита или взлом веб-страниц - тоже ИБ.
      А вот криптография лично мне не очень интересна потому, что там уже всё и так изобретено до нас. Если хочется придумать какой-то новый алгоритм, то нужно иметь соответствующие знания. Да и даже если придумаешь что-то стоящее, кому это надо будет? Все ведь уже используют RSA, ГОСТы всякие... Не хочу сказать, что это бесполезно, но очень уж узко.

      1. Понял.
        Скажи, а ты сам Linux используешь? Может посвятить статью кастомизации дистрибутива под свои нужды? Выгрузка в память LiveCD из шифрованного криптоконтейнера и тд. Неужели совсем неинтересно?

        1. Линукс использую по рабочим нуждам, и моё сугубо личное мнение: десктопный линукс - полное говно по многим причинам) Не хочу разводить тут холивары, поэтому подчеркиваю, что это только мое мнение.
          В последнее время, когда что-то программирую, обычно пишу так, чтобы получалось сразу кроссплатформенно (т.е. и под linux тоже), если это не конкретно windows-related. Кастомизациями дистрибутивов никогда не занимался и думаю, что и не придется)

  3. А мы вот , с преподавателем из Новосибирска придумали свой алгоритм , теперь ждем патент ;)

    1. Ну так изложи суть алгоритма, интересно да и порадоваться за соотечественников тоже хочется.

  4. DX, я конечно согласен, что линукс для декстопа недопилен, да и самому приходится на виртуалке держать винду для Корелла и прочих редакторов. Только для меня важна безопасность, поэтому и перешел на линь. Да, согласен - красноглазить сам не люблю, но порой приходиться порыться в консоли. А кастомизация - ну это отдельная тема, мне кажется, что никому не помешает свой собранный и настроенный под себя дистрибутив, базирующийся в криптоконтейнере, работающий с флешки и напичканный нужным софтом. Меня на это вдохновил Liberte Linux, который к сожалению канул в небытие. Потом пересобрал дистр на дебиане, поместил образ в криптоконтейнер, прикрутил Grub, напичкал офисом, прозрачной торификацией, i2p, gpg, otr и несколько эрайз-скриптов написал. Собственно не сложно все, но мои знания далеки от твоих и знаний Каими, поэтому и обратился, подумав, что может Вам это тоже интересно и уделите внимание.

    1. Проблема любой такой сборки в том, что через годик устареет софт, ядро и прочее, в текущем софте появятся баги плюс никто не даст гарантий, что в сборке нет бэкдора или чего-нибудь эдакого, не говоря уже о том, что каждый предпочитает свой софт.
      И уж тем более непонятно зачем все эти торы и криптоконтейнеры, АНБ домой постучится? Прям какая-то сборка для wanna be кардера, судя по описанию.

      1. А вот и напрасно ты так думаешь. Я, к примеру, к ИТ отношения не имею, но в силу некоторых рабочих моментов вынужден иметь криптодистр. Кстати, тоже на Debian. К кардингу и прочей ерунде отношусь отрицательно. А дистр настраиваю редко, т.к. использую stable-релизы. На счет АНБ, ну придут и? Флешка выдергивается, питание отключается, сама ось в контейнере, раздел зашифрован, плюс все данные нарыт EncFS. Я им ее сам отдам - пусть дешифровывают сколько их душе угодно)

        1. Kaimi, я не знаю, какой у него дистрибутив, если человек далекий от IT, но сейчас почти любой дистр при внезапном вытаскивании USB-накопителя из компьютера немедленно приводит к инициированию выключения питания. В процессе выполнения завершения работы в штатном режиме вся память очищается с целью защиты от атак методом холодной перезагрузки, т.ч. снять ничего из памяти не получится.
          Теперь на счет меня - я не кардер, я простой параноик))
          >>Проблема любой такой сборки в том, что через годик устареет софт, ядро и прочее, в текущем софте появятся баги
          LTS релизы решают.
          >>плюс никто не даст гарантий, что в сборке нет бэкдора или чего-нибудь эдакого
          Ну на счет этого все просто - делается скрипт, который качает исходники той же Hardened Gentoo и оф.репозитория и начинает компиллить ее - все просто и более, чем надежно, когда сорцы приложений и самой оси собираются на глазах. А вот самое главное - это конечно реализация скрипта, чего увы я сам не могу сделать.

  5. Я вот увоил эффективность эврики на статистике запросов по старинке буду должен еще ? допилить матросы.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *