我可以故意进行非确定性编译吗?

问题描述 投票:0回答:1

地址空间布局随机化是一种非常有效的击败二进制文件漏洞利用的方法,因为漏洞利用必须成功定位它希望首先攻击的内存地址,并且不能依赖它们是恒定的。我感兴趣的是进一步采取这一措施并将随机性引入到编译过程中以更改编译级实现细节的可能性,例如将变量放入不同的寄存器中或以不同的顺序放入堆栈帧中,或者以不同的方式进行 LLVM 传递为了使函数和常量表达式以不同的方式内联,或者甚至可能引入千分之一的边界或空检查,否则这些检查将被排除在完全优化的构建之外。可以为每个用户创建不同的构建,这样我的所有用户都可以获得自己的二进制文件,该二进制文件遵循源代码,但具有不同的侧通道和 UB,从而极大地限制了依赖这些东西的任何攻击的有效性。

是否有任何主要的构建工具链/语言可以配置来执行此操作?如果没有,有没有办法在我的源代码中模拟类似的东西?

(我也欢迎对这个想法进行框架挑战。例如,我承认拥有一个“完全可复制的构建”可能比我为每个用户提供个性化构建所获得的任何东西都更有价值。但是,我也觉得这这个想法在测试中可能很有用,这样开发人员就可以确信是他们的源代码,而不是他们正在使用的计算机的特定版本,决定了软件的正确性。)

security compilation llvm
1个回答
0
投票

    添加非确定性编译会破坏可重现的构建,因此用户将无法再验证他们安装的软件包
  • 用户通常会安装预构建包,并且您肯定不希望为每个用户构建包。 => 这种对策变得毫无用处:攻击者可能会访问用户使用的相同构建
  • 堆栈布局和寄存器分配经过大量优化。尝试不确定地干扰此过程将导致不确定的性能 -> 基准测试将变得毫无用处
  • 理论上,基于源代码的发行版的用户可以利用这种安全措施,但它可能会导致许多不确定性错误,而这些错误将无法自动定位
  • 总结一下:这种安全措施是所谓的
安全剧场

的一个很好的例子:它不会为大多数情况提供额外的安全性,但会使很多事情变得非常复杂。

© www.soinside.com 2019 - 2024. All rights reserved.