assembly 如果进程执行free()时操作系统不刷新TLB条目,会发生什么情况?

2sbarzqh  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(88)

如果进程执行free()时操作系统不刷新TLB条目,会发生什么情况?
这个进程能看到过时的数据吗?或者另一个进程能看到不属于它的数据吗?内存会泄漏吗?

9rnv2umw

9rnv2umw1#

free对于小的分配通常只是将内存块放在这个进程内的自由列表上(有效地使用libc中的全局变量来跟踪这个数据结构)。我想你是这个意思吧。
正常情况下,munmap会刷新该内核以及可能正在运行同一任务的线程的其他内核上该页的TLB条目(TLB shootdown)。但如果没有这样做:
在TLB条目处于热状态的内核上的访问将继续工作,就好像该进程的页表条目对该虚拟地址没有改变一样。(直到该条目被逐出并必须重新加载。)读取(如果它是可写的,则包括写入)仍将被允许。
如果页面被重新用作新进程的内核堆栈,这是非常糟糕的,因为执行munmap的进程可能会通过修改返回地址来接管内核。如果它是root进程的用户空间堆栈,情况也是如此。
或者,如果它被重用为文件数据的pagecache(如/etc/passwd/etc/shadow),您可能能够修改RAM中该数据的副本,使其他进程从该文件读取与磁盘上的数据不匹配的数据。(操作系统可能不会认为pagecache是脏的,因此可能不会将该文件数据写回磁盘。)
或者更改以root身份运行的可执行文件的字节。例如,以某种方式使其发生,然后运行sudo,希望内核会选择新释放的页面来使用,然后修改sudo的机器码缓存版本,因为它被sudo进程Map为exec +只读。(例如,在它询问密码时修改它,在您输入错误密码时更改它的操作。)
或者在一个已经运行的进程中,可能它的一些错误处理函数很少执行,并且与其他“冷”函数在一个页面中,因此这些“冷”函数已经从RAM中被逐出。向该进程提供一种罕见的坏输入将使它调用这些错误处理函数之一,从而触发硬页面错误将它从磁盘带到一个新的页面。如果它选择了您的页面,你现在可以修改其中一个函数的机器代码,再次触发同样的错误。嘣,那个进程正在运行你的机器代码,成功的代码注入攻击。
为了增加这些攻击的机会,分配大量的内存,使系统的可用内存不足。然后触摸几个页面来启动TLB,并以任何方式munmap这些页面,使操作系统忘记使它们无效。这些新页面将是操作系统可用于新分配的大部分页面。
显然,这在任何试图进行任何类型隔离的操作系统中都是一个绝对严重的安全漏洞,如果与释放后使用的错误结合起来,这将是一个巨大的正确性问题,很容易损坏文件(以及即将写入磁盘的文件系统元数据)。

相关问题