美团二面:为什么mmap共享内存比malloc危险?


美团二面:为什么mmap共享内存比malloc危险?

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

大家好,我是小风哥,畅销书《计算机底层的秘密》作者。
今天来聊个面试题,为什么mmap共享内存比malloc更危险,这是一个比较有区分度的题目。
在系统编程中,内存管理是程序员必须面对的核心问题之一。
C/C++开发者常用的内存分配方式包括malloc(堆内存)和mmap(共享内存/文件映射)。
虽然两者都能提供内存分配的能力,但从系统风险的角度来看,mmap共享内存比malloc更加危险,稍有不慎就可能引发严重的安全漏洞或稳定性问题。
mmap可以让多个进程直接读写同一块物理内存,这意味着一个进程的错误操作可能直接影响其他进程的数据,甚至导致崩溃。比如进程A的越界写入可能导致进程B崩溃或读取到损坏的数据。
一句话,共享内存破坏了进程间的内存隔离。
而如果使用malloc,这种越界写入最多只会影响当前进程,不会跨进程传播错误。因为malloc分配的内存仅在当前进程内有效,天然具备隔离性,其他进程无法直接访问。
mmap可以设置内存的读写/执行权限(如PROT_EXEC),如果错误配置可能被黑客利用进行代码注入攻击(如缓冲区溢出后执行恶意代码)。
假设有一个网络服务程序,使用mmap分配了一块内存用于处理客户端请求,并错误地赋予了可执行权限(PROT_EXEC):
同时,程序将用户输入数据(如网络数据包)复制到该内存区域,但未检查输入长度。
这样攻击者就可以构造一个超长数据包,其中包含恶意机器码(如shellcode)和精心设计的溢出数据,溢出数据覆盖了程序的返回地址或函数指针,使其指向mem_start的起始地址。
当程序执行到该返回地址时,会跳转到mem_start区域。
由于mem_start被错误配置为可执行(PROT_EXEC),因此操作系统不会阻止该区域的代码执行。
攻击者的shellcode被成功执行,可能实现提权、反弹Shell等恶意操作。
而使用malloc分配的堆内存则无此问题。
使用mmap共享内存时,多进程或线程需通过信号量、锁等机制同步访问,否则导致数据竞争(DataRace)或脏读,这显然会影响所有共享这块内存的进程。
malloc本身是线程安全的(通过全局锁或线程本地缓存),但程序员需自行管理分配的内存区域的并发访问。若未加锁,仍可能导致竞争条件,但与mmap的共享内存相比,影响范围限于当前进程内。
最后推荐一下我写的专栏《深入理解操作系统》,第二版焕新升级,600+精美手绘图、87节体系课,专治看不懂学不会,让你体验知识自动流进大脑的感觉,如果你想彻底搞懂操作系统,那么这个专栏就是为你准备的:


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录