LINUX.ORG.RU

Перехват sys_execve()

 , ,


0

1

В общем, нужно запретить запуск некоторых процессов, которые занесены в черный список. Нашел 2 варианта:

  1. Цеплять к каждому процессу ptrace.
  2. Подменить sys_execve().

Решил реализовать второй вариант, т.к. первый показался мне уж слишком ужасным.

В общем, реализовал некий LKM, который находил адрес таблицы системных вызовов и подменял там адрес sys_execve() на адрес моей функции (которая вызывала системную функцию для разрешенных процессов или выходила бы, если процесс в списке запрещенных). Так вот, сначала проверил модуль на вызове sys_open() и все нормально заработало. Я обрадовался, однако моя радость продлилась недолго, ибо когда я подменил sys_execve() и внутри своей функции просто выводил первый аргумент (путь и имя бинарника) и запускал стандартный обработчик - комп ребутнулся. После того как я убрал вывод в консоль, просто перестали запускаться процессы. Ну и вот сегодня я прочел, что с подменой именно этого системного вызова не все так просто, однако дальнейшие поиски ничего не дали, поэтому я обратился сюда. Думаю, приводить мой код нет смысла, т.к. проблема явно не в реализации.

Версия ядра - 3.11

Буду благодарен хоть за какие-то подсказки.

Перемещено beastie из security



Последнее исправление: Mizantrop_LoL (всего исправлений: 3)

Ответ на: комментарий от DELIRIUM

Премного благодарен. Однако у меня тут вопрос. Там используются заголовочные файлы из каталога asm, однако у меня он отсутствует (есть только asm-generic, но когда я что-то из него подключаю - компилятор ругается ошибками). Это нормально?

Mizantrop_LoL
() автор топика

У самсунгов есть особый модуль ядра, который запрещает неподписанные elf бинарники запускать http://opensource.samsung.com/reception/receptionSub.do?method=sub&sub=F&... Там есть код проверки ЭЦП, его можно заменить на код, проверяющий «а не пытаемся ли мы запрещенный бинарник загрузить».

Там код есть, который таблицу системных вызовов находит, и по всей видимости патчит там что-то

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Я сейчас только одним глазком посмотрел и ничего не переписывал у себя. Просто до этого, когда пытался подключить (если не ошибаюсь) asm/unistd.h (который подключал как asm-generic/unistd.h) - оно ругалось, что не может найти остальные инклуды, в которых была опять таки папка asm, которой у меня нету. Вот оно и ругалось) В общем, от кода толку не будет (потому что сейчас там этого инклуда нету) и выхлопа, соответсвенно, нету.

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

Mizantrop_LoL
() автор топика
Ответ на: комментарий от gh0stwizard

Если я правильно понял - они производят приложения для всяких гразных делишек с ядром (или я ошибся? А то мой английский оставляет желать лучшего), а мне надо написать свой велосипед)

Mizantrop_LoL
() автор топика
Ответ на: комментарий от Mizantrop_LoL

Что, настолько типичное задание?)

Senior Developer,Team Lead, С/C++ Unix,требуется (комментарий)

В этом же топике вроде было кстати писькомерство по решению этого задания, так что можешь ещё там поискать примеры кода (но своё я там, ЕМНИП, не выкладывал).

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 2)

Прав доступа к файлам достаточно.

Krieger_Od ★★
()
Ответ на: комментарий от Mizantrop_LoL

Секрет в подписке на тэги.
А вообще, вот тебе бесплатно классический совет: изучение IT нужно изучать с английского.

yurikoles ★★★
()
Ответ на: комментарий от DELIRIUM

В общем, в том топике кроме срача ничего не нашел. Попробовал тот способ, который у тебя, однако у меня не находит структуру security_operations. Ну и как я узнал, ядро можно собрать и без LSМ, поэтому такой вариант тоже не канает, к сожалению :(. Есть еще какие-то способы?

Mizantrop_LoL
() автор топика
Ответ на: комментарий от Mizantrop_LoL

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

anonymous
()
Ответ на: комментарий от Mizantrop_LoL

Конечно, не находит, она не экспортируется ядром. Ты посмотри на файлы рядом: probe.c, например. Там probe.c и probe.h утащены из проекта AKARI, в них как раз находится функционал по вытаскиванию struct security_operations наружу.

Кароче попробуй собрать мой модуль у себя и проверить, как оно работает.

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 1)
Ответ на: комментарий от Mizantrop_LoL

Само задание - написать файрволл, который блокирует процессы из черного списка.

ох лол. Для твоего тестового задания хватит что-то типа такого

$ touch file
$ chmod -x file
$ sudo chattr +i file
[sudo] password for user:
при попытке сделать файл исполнимым получаем:
$ chmod +x file
chmod: changing permissions of ‘file’: Operation not permitted

reprimand ★★★★★
()

А почему бы не использовать SELinux ?

Jetty ★★★★★
()
Ответ на: комментарий от DELIRIUM

Обижаешь :( Я, ведь, само собой, уже погуглил, что такое LSM и просмотрел частично, как работает твой модуль. А точнее, посмотрел, что да как оно подменяет, нашел ту функцию, которая ищет структуру, скопировал ее себе, чисто чтобы протестировать, найдет ли у меня что-то, однако у меня она вернула NULL.

Mizantrop_LoL
() автор топика
Ответ на: комментарий от reprimand

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

Ну и если даже не от имени рута, то вызовом fork()+exec(), я полагаю, все равно можно будет запустить процесс.

В любом случае, надо запилить это дело в виде модуля ядра.

Mizantrop_LoL
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.