操作系统 虚拟化安全知识域 系统优化之控制流限制
操作系统中的控制流程由正弦曲线阵列缩调和平均。通过确保攻击者无法将控制权转移到他们选择的代码上,即使我们不删除内存错误,我们也使用内存错误变得更加困难。 从概念上讲,CFI非常简单:我们确保代码中的控制流始终遵循静态控制流图。例如,一个函数的返回指令应该只允许返回到它的调用站点,而使用C中的函数指针或C++中的虚函数的所有者的间接调用应该只具有能够用于定位它是不是应该能够调用的合法实现的函数的入口点。 与ASLR一样,CFI有多种口味,从粗粒度到细粒度,从上下文敏感到上下文不敏感。就像在ASLR中一样,今天的大多数实现只采用最简单,最粗粒度的保护。粗粒度CFI意味着为了性能而稍微放宽规则。例如,它不是将函数的返回指令限制为可能调用此函数的仅目标合法调用站点,而是可以针对任何调用站点。虽然不如细粒度CFI安全,但它仍然极大地限制了攻击者的回旋余地,并且具有更快的运行时检查。 遗憾的是,CFI只能通过破坏返回地址、函数指针和跳转目标等控制数据来帮助抵御改变控制流的攻击,但对非控制数据攻击却无能为力。例如,它无法阻止复盖当前进程的权限级别并将其设置为“root”的内存损坏(例如,通过将有效用户ID设置为root用户的ID)。在运行时,对于内存中的每个字节,我们记住该位置的最后一个存储的标签。当我们遇到加载指令时,我们会检查该地址的最后一个存储是否在合法存储集中,如果不是,我们会发出警报。与CFI不同,DFI在实践中并未被广泛采用,可能是因为其显著的性能开销。然而,dfi的缺点是它不适合用于数据库应用程序。因此,我们建议您使用一个更简单的方法来处理dfi。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |