内存安全错误仍然是C和C++中严重漏洞的主要来源。传统的基于位置的消毒器(如LLVM的ASan)虽然广泛使用,但只能检测缓冲区溢出等有限类型的错误,且开销较高。基于指针的消毒器提供了更强的安全保障,但以往的实现因高开销和兼容性问题难以在生产环境中部署。本文提出了PTSan,一种基于LLVM的实用内存安全消毒器。PTSan通过在每个指针的高位存储对象标识符,并在固定大小的运行时表中存储对象边界,从而在有限的活跃对象预算与低开销、优化器可见性和通用硬件支持之间取得平衡。由于标识符随指针值传播,LLVM的数据流分析可以自然地传播它,无需显式的逐指针元数据指令。PTSan将元数据查找与检查执行分离,均以LLVM IR表示,从而支持检查的提升、消除和合并,以及基于整个函数最小割的兼容性标签剥离放置。当硬件支持Intel线性地址掩码(LAM)时,可进一步消除剩余的标签剥离指令。在通用硬件上,PTSan的开销与最快的已发布基于位置的消毒器相当:SPEC CPU 2017在x86-64上的几何平均开销为57.2%(使用Intel LAM时为46.4%),ARM64上为54.7%,在应用型的LLVM MultiSource套件上为31.5%(x86-64)。这大约是具有类似指针-对象权限保证的先前系统已发布开销百分比的三分之一,同时独立内存安全测试套件测量显示,PTSan保持了跨对象、非对象和时间检测覆盖范围。其物理内存开销接近原生,这对于生产部署至关重要。本文还通过实际服务器和安全工作负载展示了实用开销。结果表明,PTSan将实用的基于指针的内存安全引入了仅需重新编译的消毒器部署模型。
💡 推荐理由: PTSan显著降低了基于指针的内存安全检测的开销,使其在生产环境中部署成为可能,有望大幅减少C/C++软件中的内存安全漏洞。
🎯 建议动作: 研究跟进