Передо мной поставили задачу разработать утилиту, позволяющую сравнивать образ ядра в памяти и на диске для определения наличия постороннего кода в загруженном ядре. Пока что собираюсь контролировать целостность таблицы системных вызовов и по возможности самих системных вызовов, так как это излюбленное место внедрения ВПО. Не стал сразу бросаться что-то кодить, хочется выслушать мнения специалистов.
Насчет доступа к образу ядра в памяти есть некоторые наработки, так что тут вроде все понятно. Погуглил в сторону образа ядра на диске (/boot/vmlinuz-2.6.xx.xx). Выяснил, что это запакованный gzip elf файла ядра, перед которым лежит код распаковщика и загрузчика. Выдернул из этого файла архив ядра по статье http://bappoy.pp.ru/2008/09/05/extracting-vmlinux.html , посмотрел на него:), потыкался objdump`ом.
Какие вижу проблемы. Elf файл ядра, как я понимаю, представляет собой нелинкованное ядро. По этому поводу таблицы системных вызовов как таковой там не должно быть - ее должен кто-то заполнить при загрузке. В связи с этим придется каким-то образом самостоятельно рассчитывать вероятные адреса загрузки системных вызовов и сравнивать их тем, что имеет место в таблице системных вызовов. Если бы все системные вызовы лежали в одной секции, то как бы ядро не было загружено, последовательность разностей адресов системных вызовов из соседних ячеек в этой таблице должна была бы оставаться константной. Эту последовательность можно было бы сравнить с тем, что мы видим в памяти. Но лежат ли они всегда в одной секции?
В общем, хочется услышать мнения по поводу того, как можно реализовать такую утилитку.