Linux内核

时间:2017-07-20 11:02:22

标签: kernel security linux-kernel conventions

在查看内核代码时,我遇到了以下情况。

假设我们有两个内核组件 A B (比如内核模块), A 调用来自 B EXPORT_SYMBOL' ed some_func()。假设some_func()有输入参数,应该只分配"合法"或"有效"值。例如,假设我们有

some_func(void * p);

其中void * p应该是非NULL,也许还指向一块正确分配的内存。

我的问题是:谁负责some_func()的论据确实合法?是来电者 A 还是被调用者 B ?我无法找到一个权威来源来判断内核中应该遵循的约定。

在考虑指针输入参数示例时,从安全角度来看,很明显我们可能会遇到NULL指针解引用问题,应该避免这种问题。因此,要专门处理我的问题 A 负责其传递给 B 的参数的安全性,或者应该 B 是否在其导出的每个符号的条目上放置了验证?

请注意,这个问题是关于在内核中调用约定,而与用户空间中的调用约定无关。

1 个答案:

答案 0 :(得分:0)

所有内核代码都在相同的权限级别工作。因此,传递排序的无效参数是编程错误。

对于踢球,让我们说B试图以某种方式验证。显然,NULL检查是微不足道的。但是,如何验证指针指向您可以访问的内容?这是一个额外的踢球者:如果B验证,结束它的罚款,然后在另一个cpu上运行的A模块的代码释放目标区域。如果B现在访问,所有工作都变得无用。

但是,如果您拥有与B相同的权限,为什么会这样玩。如果您愿意,可以直接覆盖其代码。

正如你所看到的,这个问题绝对没有实际意义。

另一方面,让我们将其与用户空间进行对比。内核< - >用户界面是安全边界,传递的数据/指针本质上是不可信的,只能通过保证安全的专用原语访问。请注意提供保证的能力的根本区别:您访问,它可能会触发页面错误,如果发生这种情况,并且没有任何地方可以映射,您知道用户空间正在扭转,您可以很好地返回错误。如果内核代码发生同样的事情,那你就有了一个bug。