【问题标题】:Null pointer dereference in User space and kernel space用户空间和内核空间中的空指针取消引用
【发布时间】:2016-05-16 07:56:24
【问题描述】:

如果我们在用户空间和内核空间取消引用空指针会发生什么?

据我了解,行为基于编译器、架构等。

但通常对于每个分配有虚拟内存的用户空间程序,分页用于使用页表将虚拟地址转换为物理地址。

所以如果我们在用户空间中取消引用空指针,该地址是无效的,因此上下文切换将发生,并且在内核中基于此空指针取消引用的中断'Segmentation fault will come or page fault error will come'。

在内核空间中:

如果我们取消引用 NULL 指针,系统可能会崩溃,或者内核可能无法从该调用返回。

我的理解是否正确?或任何其他信息缺失意味着请解释。

Ref:我从这个“What happens in OS when we dereference a NULL pointer in C?”了解到

【问题讨论】:

    标签: linux kernel userspace


    【解决方案1】:

    内核将虚拟地址 0 处的页面映射到所有未设置权限位的进程。当您尝试访问该页面时,您会收到一个page fault。处理它的内核例程向您的进程发出SIGSEGV signal。如果您没有注册 SIGSEGV 的处理程序,则核心是 dumped 并且您会看到“分段错误”消息。

    内核方面,情况有点不同。毕竟,内核应该是健壮的:

    • 如果取消引用发生并且可以恢复(例如,您的触控板驱动程序犯了错误),则会生成 kernel oops。内核继续运行(目前)。
    • 如果取消引用导致无法恢复,Oops 将导致kernel panic。需要重启。
    • 如果由于某种原因,在第 0 页映射了数据,则会损坏内存。这可能会导致恐慌,被忽视甚至是abused for a privilege escalation attack

    【讨论】:

    • :谢谢,还有一个疑问,如果我们在用户空间中取消引用空指针,它也会在内部调用系统调用,对吗?那么什么会造成用户空间和内核空间不同?,内存处理是否不同对于两者?我听说与内核空间相比,用户空间的内存访问更少。你能解释一下吗?“内核将虚拟地址 0 处的页面映射到所有没有设置权限位的进程。”你能请解释一下?
    • 您应该查看关于虚拟内存的维基百科文章。在评论中涵盖的内容太多了。简而言之,内存管理单元处理您的指针取消引用。当您取消引用 0 时,MMU 会发现它不存在并调用内核。如果地址有效,则不涉及内核。
    • 应该注意,有些人在用户空间中称为空指针 deref 的东西也可能被滥用。考虑char x[42]; overflow_array(x, 42);char x[42]; overflow_array(42, x);,其中overflow_array 触发一些缓冲区溢出条件......它们都应该归结为:让a 成为表达式x[42+y] = something_else;b 是表达式42[x+y] = something_else;,其中a 扩展为*(x + 42 + y)b 扩展为*(42 + x + y);看看这两个表达式是如何等价的应该是微不足道的......现在考虑null_pointer[x+y] vs x[null_pointer+y]......
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多