Есть ли способ изменить таблицу системных вызовов Linux в проприетарном модуле ядра? - PullRequest
0 голосов
/ 26 июня 2018

Я написал своего рода клон SELinux, который контролирует выполнение системных вызовов, например open и execve.

Результат проверен SELinux как безопасный способ контроля доступа всех пользователей к диску.

Код изменяет таблицу системных вызовов следующим образом:

  1. Изменить отношение имени-> адреса системного вызова
  2. После изменения имя системного вызова является моей собственной функцией, которая затем вызывает исходный системный вызов.
  3. исходный адрес системного вызова защищен рандомизацией макета адресного пространства, которая требует сканирования 16 эксабайт данных, и адрес меняется при каждой перезагрузке.

Старый трюк, но я нашел единственный способ добиться этого - через служебную подпрограмму, экспортируемую только в модули GPL со следующим кодом:

MODULE_LICENSE("GPL");

Есть ли способ обнаружить таблицу syscall или адрес syscall без модуля ядра GPL?

1 Ответ

0 голосов
/ 26 июня 2018

Вы сделали это неправильно. Обтекание системным вызовом является стандартной фабрикой ошибок класса TOCTOU. Посмотреть эту статью http://www.watson.org/~robert/2007woot/2007usenixwoot-exploitingconcurrency.pdf

На самом деле, перехватчики LSM (используемые для реализации selinux) - это именно то, что вам нужно, чтобы заставить это работать безопасно. Но тогда нет смысла перезаписывать что-либо в таблице системных вызовов.

...