[linux] intercepting system calls

katrin2201

субж есть bad practice, в ветке ядер 2.6 так вообще deprecated
типа, ищите другие пути
Хорошо, предложите другой путь получения уведомления о создании нового процесса, кроме как перехват sys_execve? Ткните носом хотя бы куда-нибудь...
Не патчить же сорсы ядра и пересобирать ядро...

vall

там есть спец механизм, называется system call accounting кажется.

Aleksei66

а можно задачу полнистью?
что мешает пропатчить - я так всегда и делаю

mama10001

Зачем пересобирать ядро?
Пишешь небольшой модуль.
Он загрузившись вырезает несколько первых инструкций интересующего тебя system call'а.
Записывает на их место прыжок на свою функцию.
В этой свей функции ставишь себе галочку, что произошел такой-то вызов.
Затем исполняешь вырезанные инструкции.
Затем прыгаешь обратно и исполняешь оставшиеся инструкции.

Marinavo_0507

> Записывает на их место прыжок на свою функцию.
В это время на другом процессоре этот недозаписанный код пытается выполниться.

Julie16

А big kernel lock на что?

Marinavo_0507


Уж явно не для того, чтобы брать его при каждом системном вызове.

mama10001

Ядро патчится один раз. Что не так?

sergey_m

> > Записывает на их место прыжок на свою функцию.
> В это время на другом процессоре этот недозаписанный код пытается выполниться.
А что, в процессе подгрузки модуля могут выполняться сисколлы?

Marinavo_0507

> А что, в процессе подгрузки модуля могут выполняться сисколлы?
А как ты им запретишь?

Julie16

Можно запретить прерывания, например.

Marinavo_0507

И что, по-твоему, будет?

Julie16

Эээээ... Разве linux уже не сидит на 80h? Или я что-то проспал?

Marinavo_0507

1) Что делает int при запрещённых прерываниях?
2) Не забыл, что запретить их нужно на _остальных_ процессорах?

Julie16

1) Вероятно пропадает впустую. Хотя это наверное от платформы зависит.
2) Я этого не знал А что этому мешает?

Julie16

PS: в конце концом можно отменить шедулинг процессов на это время. Тогда никто из них не сможет выполнить syscall.

Marinavo_0507

> Вероятно пропадает впустую.
А мне вот интуиция подсказывает, что выполнится как обычно.
А если бы и пропало, это лучше?
> Я этого не знал.
Это написано выше.
> А что этому мешает?
Они другие, у них есть свои команды, которые они выполняют.

Marinavo_0507

Это уже лучше, но почему-то так не сделали.

Julie16

1) ? Это как? Как может выполниться прерывание если они запрещены?
2) Не написано. Я например думал что прерывания запрещаются сразу на всех процессорах. Видимо я ошибался.

sergey_m

Если это делается только для подсчета, то может быть проще будет libc подхачить? Конечно, это будет обходиться, но в случае подсчета наплевать.

sergey_m

А в линуксе int80h попадает на случайный процессор?

Julie16

Я честно говоря имею весьма слабое представление как происходят прерывания на мультипроцессорных машинах. Но я не понимаю какое отношение имеет этот вопрос к теме.

sergey_m

Ну типа если оно зароучено на один процессор, то можно запрещать только на нём. Вряд ли конечно это так.

Marinavo_0507

Это всё только для внешних прерываний.
А те, что генерирует инструкция int, и исключения --- работают по-другому.
Кроме того, int 80 - это только на i386.

vall

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

katrin2201

по большому счету ничего не мешает
просто мне потом процесс инсталла как то не очень нравится

katrin2201

Мне важно, чтобы никакой процесс не мог избежать учести быть посчитанным =)
Иначе смысл подсчета теряется

katrin2201

а теперь они нагородили что-то новое...
Такое впечатление, что они ничего не городили, а просто волевым решением убрали из экспортов этот сис_колл_тейбл и все. И никаких альтернатив не предлагают пока.
Вчера беглый поиск по "system call accounting" ничего не дал, пойду сейчас еще покопаюсь...

sergey_m

В данном случае избежать сможет только статически слинкованный.

katrin2201

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

sergey_m

Понятно. Я думал это не для security, а что бы провести какой-то benchmark.

Marinavo_0507

Можно попробовать написать LSM-модуль.
И кажется, недавно какое-то API специально для аудита добавили.

Julie16

Ну в конце-концов тебе никто не может помешать добавить в ядре в нужном сисколле

lock(my_hook_mutex)//нужно еще понять какой lock/unlock
if ( my_hook )
{
my_hook;
}
unlock(my_hook_mutex)

....blavlabla

EXPORT_SYMBOL(my_hook); //точно не помню :)
EXPORT_SYMBOL(my_hook_mutex); //точно не помню :)

И написать модуль который будет подменять этот хук.
Изменение собственно ядра в этом случае минимально.

katrin2201

LSM вроде для ветки 2.6 нету, по крайней мере на http://lsm.immunix.org/ про это ни слова
А вот про апи как раз я и спрашивал. подсказал что есть audit syscall опция в ядре. похоже что это то что надо, вроде даже есть сурс это дело юзающий, правда туда еще не глядел. Так что если бы кто еще ткнул носом в доку по этому делу, было бы вообще замечательно, и вопрос был бы исчерпан =)

katrin2201

Ну просто сурсы ядра вообще не хочется править =)
То, что его можно поправить и не париться, это я еще в первом посте написал =)

Julie16

Как тебе ответили, есть такая штука как LSM. При любом системном вызове есть следующая проверка:

if ( !capable( BLABLABLA ) )
{
return SOMETHING_BAD;
}
capable вызывает функцию проверки из соответствующего загруженного модуля. Можно написать LSM модуль, который еще ко всему прочему делает то что тебе нужно.

Julie16

PS: взгляни на security/security.c
Оставить комментарий
Имя или ник:
Комментарий: