有没有办法在专有内核模块中修改Linux syscall表?

时间:2018-06-26 17:22:42

标签: c security linux-kernel kernel-module

我写了一种SELinux克隆,它监督系统调用的执行,例如open和execve。

SELinux证明了该结果是监视用户进行的所有磁盘访问的安全方法。

代码通过以下方式修改syscall表:

  
      
  1. 更改系统调用的名称->地址关系
  2.   
  3. 更改后,系统调用名称是我自己的函数,然后调用原始的系统调用。
  4.   
  5. 原始syscall地址受地址空间布局随机化保护,这需要扫描16 EB的数据,并且   每次重新启动后地址都会更改。
  6.   

老把戏,但是我发现实现此目标的唯一方法是通过仅使用以下代码将服务例程导出到GPL模块:

MODULE_LICENSE("GPL");

是否可以在没有GPL内核模块的情况下发现系统调用表或系统调用地址?

1 个答案:

答案 0 :(得分:2)

您做错了。 Syscall包装是标准的TOCTOU错误类工厂。参见本文http://www.watson.org/~robert/2007woot/2007usenixwoot-exploitingconcurrency.pdf

实际上,LSM钩子(用于实现selinux)恰恰是您真正需要它以安全方式工作所需的东西。但是那么就没有使用覆盖syscall表中的任何内容了。