工具链咒术:过去的错误困扰着地址空间布局随机化(ASLR)

主要观点:Justin Miller 的博客展示性能优化如何导致安全削弱,作者团队研究后发现是内核、binutils 和运行时链接器的问题,导致 ASLR 弱化使暴力内存破坏攻击更易成功,需用新工具链重建受影响的二进制文件以恢复 ASLR 优势。
关键信息

  • Linux 内核:v5.10 中添加的提交改变内核 ELF 加载器行为,以提高性能,但会限制 ASLR 可用的位数,v5.17 曾尝试扩展但 v5.18 因回归而回退。
  • binutils:从 2000 年到 2023 年,binutils 的 ld 链接器在不同版本中对 ELF 文件的段对齐设置不同,从 4kB 到 2MB 再到 4kB,v2.40 后恢复为 4kB 页大小。
  • 运行时链接器:glibc v2.35 起,运行时链接器在加载库时会考虑段对齐,导致 ASLR 退化。
  • 失败链:使用旧工具链创建的二进制文件或库与较新的 glibc 或内核配合使用时,会减少随机化地址位,削弱 ASLR。
  • Debian 评估:Debian 从 etch 到 stretch 版本创建的 ELF 文件有问题,buster 及之后版本使用的链接器版本较新,默认设置为 4k 页对齐,但仍存在旧代码未重建的情况。
  • 第三方二进制文件:如 Slack 和 VMware 的某些二进制文件也存在段对齐过大的问题。
    重要细节
  • 内核更改的原因是巨大页面对齐映射可利用巨大页提高性能,但设置时间较长。
  • binutils 历史中不同版本对 MAXPAGESIZE 的更改及背后原因。
  • 运行时链接器的加载和处理过程及相关代码片段。
  • 测试系统的方法,包括检查 ld 和二进制文件的脚本及输出示例。
阅读 14
0 条评论