地址空间布局随机化是一种非常有效的击败二进制文件漏洞利用的方法,因为漏洞利用必须成功定位它希望首先攻击的内存地址,并且不能依赖它们是恒定的。我感兴趣的是进一步采取这一措施并将随机性引入到编译过程中以更改编译级实现细节的可能性,例如将变量放入不同的寄存器中或以不同的顺序放入堆栈帧中,或者以不同的方式进行 LLVM 传递为了使函数和常量表达式以不同的方式内联,或者甚至可能引入千分之一的边界或空检查,否则这些检查将被排除在完全优化的构建之外。可以为每个用户创建不同的构建,这样我的所有用户都可以获得自己的二进制文件,该二进制文件遵循源代码,但具有不同的侧通道和 UB,从而极大地限制了依赖这些东西的任何攻击的有效性。
是否有任何主要的构建工具链/语言可以配置来执行此操作?如果没有,有没有办法在我的源代码中模拟类似的东西?
(我也欢迎对这个想法进行框架挑战。例如,我承认拥有一个“完全可复制的构建”可能比我为每个用户提供个性化构建所获得的任何东西都更有价值。但是,我也觉得这这个想法在测试中可能很有用,这样开发人员就可以确信是他们的源代码,而不是他们正在使用的计算机的特定版本,决定了软件的正确性。)
的一个很好的例子:它不会为大多数情况提供额外的安全性,但会使很多事情变得非常复杂。