[linux] intercepting system calls
там есть спец механизм, называется system call accounting кажется.
что мешает пропатчить - я так всегда и делаю
Пишешь небольшой модуль.
Он загрузившись вырезает несколько первых инструкций интересующего тебя system call'а.
Записывает на их место прыжок на свою функцию.
В этой свей функции ставишь себе галочку, что произошел такой-то вызов.
Затем исполняешь вырезанные инструкции.
Затем прыгаешь обратно и исполняешь оставшиеся инструкции.
В это время на другом процессоре этот недозаписанный код пытается выполниться.
А big kernel lock на что?
Уж явно не для того, чтобы брать его при каждом системном вызове.
Ядро патчится один раз. Что не так?
> В это время на другом процессоре этот недозаписанный код пытается выполниться.
А что, в процессе подгрузки модуля могут выполняться сисколлы?
А как ты им запретишь?
Можно запретить прерывания, например.
И что, по-твоему, будет?
Эээээ... Разве linux уже не сидит на 80h? Или я что-то проспал?
2) Не забыл, что запретить их нужно на _остальных_ процессорах?
2) Я этого не знал А что этому мешает?
PS: в конце концом можно отменить шедулинг процессов на это время. Тогда никто из них не сможет выполнить syscall.
А мне вот интуиция подсказывает, что выполнится как обычно.
А если бы и пропало, это лучше?
> Я этого не знал.
Это написано выше.
> А что этому мешает?
Они другие, у них есть свои команды, которые они выполняют.
Это уже лучше, но почему-то так не сделали.
2) Не написано. Я например думал что прерывания запрещаются сразу на всех процессорах. Видимо я ошибался.
Если это делается только для подсчета, то может быть проще будет libc подхачить? Конечно, это будет обходиться, но в случае подсчета наплевать.
А в линуксе int80h попадает на случайный процессор?
Я честно говоря имею весьма слабое представление как происходят прерывания на мультипроцессорных машинах. Но я не понимаю какое отношение имеет этот вопрос к теме.
Ну типа если оно зароучено на один процессор, то можно запрещать только на нём. Вряд ли конечно это так.
А те, что генерирует инструкция int, и исключения --- работают по-другому.
Кроме того, int 80 - это только на i386.
перехват системеного вызова раньше делали просто записью в массив указателя на другую функцию обработчик, что начинает криво работать если таких хуков много а мы потом ещё хочум их убирать.
а теперь они нагородили что-то новое...
просто мне потом процесс инсталла как то не очень нравится
Иначе смысл подсчета теряется
а теперь они нагородили что-то новое...Такое впечатление, что они ничего не городили, а просто волевым решением убрали из экспортов этот сис_колл_тейбл и все. И никаких альтернатив не предлагают пока.
Вчера беглый поиск по "system call accounting" ничего не дал, пойду сейчас еще покопаюсь...
В данном случае избежать сможет только статически слинкованный.
Посему, любая возможность избежать учести быть посчитанным, сводит на нет весь смысл шняжки.
Понятно. Я думал это не для security, а что бы провести какой-то benchmark.
И кажется, недавно какое-то API специально для аудита добавили.
И написать модуль который будет подменять этот хук.
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); //точно не помню :)
Изменение собственно ядра в этом случае минимально.
http://lsm.immunix.org/ про это ни слова
А вот про апи как раз я и спрашивал. подсказал что есть audit syscall опция в ядре. похоже что это то что надо, вроде даже есть сурс это дело юзающий, правда туда еще не глядел. Так что если бы кто еще ткнул носом в доку по этому делу, было бы вообще замечательно, и вопрос был бы исчерпан =)
LSM вроде для ветки 2.6 нету, по крайней мере на А вот про апи как раз я и спрашивал. подсказал что есть audit syscall опция в ядре. похоже что это то что надо, вроде даже есть сурс это дело юзающий, правда туда еще не глядел. Так что если бы кто еще ткнул носом в доку по этому делу, было бы вообще замечательно, и вопрос был бы исчерпан =)
То, что его можно поправить и не париться, это я еще в первом посте написал =)
capable вызывает функцию проверки из соответствующего загруженного модуля. Можно написать LSM модуль, который еще ко всему прочему делает то что тебе нужно.
if ( !capable( BLABLABLA ) )
{
return SOMETHING_BAD;
}
PS: взгляни на security/security.c
Оставить комментарий
katrin2201
субж есть bad practice, в ветке ядер 2.6 так вообще deprecatedтипа, ищите другие пути
Хорошо, предложите другой путь получения уведомления о создании нового процесса, кроме как перехват sys_execve? Ткните носом хотя бы куда-нибудь...
Не патчить же сорсы ядра и пересобирать ядро...