为所有内容部署 ASLR 的挑战之一是,至少在 Windows 上,某些 DLL(库)未以与 ASLR 兼容的方式编译。(它们没有被编译为与位置无关的代码,因此它们在内存中加载的位置不能随机化。)
这是有问题的,因为如果应用程序仅加载一个非随机化的 DLL,那么它实际上就不是随机化的。为了阻止标准攻击(例如,ROP 攻击),所有代码都必须随机化:即使是单个非随机化的 DLL 也足以让 ROP 攻击成为可能。因此,对于一阶近似,ASLR 仅在其所有DLL 都是随机化的情况下才可用于保护特定应用程序。应用程序通常会加载许多 DLL,并且由于只需要一个非随机 DLL,因此确保所有 DLL 都是随机的尤为重要。
一般来说,业界正朝着增加随机化使用的方向发展,但速度很慢:我想将它带到任何程序将使用的每个 DLL 都需要时间。例如,最近发现Dropbox DLL 不使用随机化,因此任何使用 Dropbox DLL 的程序都不会受到 ROP 攻击的保护(任何使用 Dropbox DLL 的程序都会失去 ASLR 的好处)。
我的问题:某些 DLL 不随机化的典型原因是什么?通常是某种技术障碍或技术问题导致难以或不可能将 DLL 编译为与位置无关的代码吗?构建 DLL 的开发人员是否缺乏对安全性的认识/关注?是否是旧版 DLL 非常旧且尚未重新编译以利用随机化?默认情况下 Microsoft Visual C++ 是否无法执行正确的操作(默认情况下是否无法将 DLL 编译为与位置无关的代码)?完全是另外一回事吗?
是否有任何技术进步或工具可以帮助为当前不支持随机化的 DLL 更好地部署 ASLR/随机化?
相关资源:SlopFinder是一种用于扫描系统以查找不支持 ASLR 的 DLL 的工具。