Перехватывает загрузчик ELF в ядре Linux: файл fs/binfmt_elf.c через загружаемый модуль ядра

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

В настоящее время вышеуказанная логика была реализована в рамках load_elf_binary функция в fs/binfmt_elf.c файла в дереве исходного кода ядра, однако требуется всего около 250 строк изменения кода, для которых мне нужно перекомпилировать все ядро, поэтому я стремлюсь импровизировать эту функциональность, реализуя ее как загружаемый модуль ядра (LKM), чтобы каждый раз ELF загружается, он проверяет, является ли он модифицированным ELF или нет, и если это так, то он извлекает ключ из соответствующего раздела.

РЕДАКТИРОВАТЬ: Подводя итог, я рассматриваю создание загружаемого модуля ядра для чтения разделов ELF и выборки содержимого пользовательского раздела, который содержит ключ шифрования и соответствующие метаданные, и установки этих значений в регистрах ЦП.

1 ответ

Решение

Да, это возможно, но определенно не легко. Существует даже поддерживаемая функция ядра "kprobes", которая позволяет вставлять вызовы в ваш собственный код из указанных мест (см. Documentation/kprobes.txt). Если вставка вызовов в ваш собственный код недостаточна, я думаю, вам нужно будет использовать те же механизмы, что и в kprobe: исправление нужного местоположения путем перезаписи инструкций с помощью jmpс или callв ваш собственный код.

Однажды я работал в компании, чей продукт безопасности устанавливал свои ловушки, исправляя во время выполнения ядро ​​Windows. Это в значительной степени одно и то же, хотя по крайней мере с Windows в то время существовало ограниченное количество версий, которые должны были поддерживаться.

Так что это определенно возможно, но я бы не хотел это пробовать. Это будет очень хрупким; вы будете пытаться поразить движущуюся цель. Каждое исправление безопасности ядра или обновление версии может привести к поломке вашего кода.

Другие вопросы по тегам