Я написал своего рода клон SELinux, который контролирует выполнение системных вызовов, например open и execve.
Результат проверен SELinux как безопасный способ контроля доступа всех пользователей к диску.
Код изменяет таблицу системных вызовов следующим образом:
- Изменить отношение имени-> адреса системного вызова
- После изменения имя системного вызова является моей собственной функцией, которая затем вызывает исходный системный вызов.
- исходный адрес системного вызова защищен рандомизацией макета адресного пространства, которая требует сканирования 16 эксабайт данных, и
адрес меняется при каждой перезагрузке.
Старый трюк, но я нашел единственный способ добиться этого - через служебную подпрограмму, экспортируемую только в модули GPL со следующим кодом:
MODULE_LICENSE("GPL");
Есть ли способ обнаружить таблицу syscall или адрес syscall без модуля ядра GPL?