正交防线是识域调节操作系统的控制流。通过确保攻击者无法将控制权转移到他们选择的控制流代码上,即使我们不删除内存错误,操作我们也使利用内存错误变得更加困难。系统虚拟系统限制最好的化安例子被称为控制流完整性(CFI),现在许多编译器工具链(如LLVM和微软的全知强化VisualStudio),并于2017年以ControlFlowGuard的识域名义并入Windows内核-另见软件安全CyBOK知识领域。
从概念上讲,控制流CFI非常简单:我们确保代码中的操作控制流始终遵循静态控制流图。例如,系统虚拟系统限制一个函数的化安返回指令应该只允许返回到它的调用站点,而使用C中的函数指针或C++中的虚函数的间接调用应该只能够定位它应该能够调用的合法函数的入口点。为了实现这种保护,我们可以标记间接控制转移指令的所有合法目标(返回、间接调用和间接跳转),并将这些标签添加到特定于此指令的集合。在运行时,我们检查指令即将进行的控制转移是否是到集合中的目标。否则,CFI会发出警报和/或使程序崩溃。
与ASLR一样,CFI有多种口味,从粗粒度到细粒度,从上下文敏感到上下文不敏感。就像在ASLR中一样,今天的大多数实现只采用最简单,最粗粒度的保护。粗粒度CFI意味着为了性能而稍微放宽规则。例如,它不是将函数的返回指令限制为可能调用此函数的仅目标合法调用站点,而是可以针对任何调用站点。虽然不如细粒度CFI安全,但它仍然极大地限制了攻击者的回旋余地,并且具有更快的运行时检查。
在现代机器上,某些形式的CFI甚至(或将要)得到硬件的支持。例如,英特尔控制流强制技术(CET)支持影子堆栈和间接分支跟踪,以帮助分别强制实施退货和前向控制传输的完整性(以非常粗粒度的方式)。ARM也不甘示弱,它提供了指针身份验证,以防止对指针值进行非法修改—主要是通过使用指针的上位来存储指针身份验证代码(PAC),其功能类似于加密指针值上的签名(除非您获得正确的PAC,否则您的指针无效)。
遗憾的是,CFI只能通过破坏返回地址、函数指针和跳转目标等控制数据来帮助抵御改变控制流的攻击,但对非控制数据攻击却无能为力。例如,它无法阻止覆盖当前进程的权限级别并将其设置为“root”的内存损坏(例如,通过将有效用户ID设置为root用户的ID)。但是,如果对控制流的限制在实践中如此成功,您可能想知道数据流是否也可以进行类似的限制。事实上,它们确实如此,这被称为数据流完整性(DFI)。在DFI中,我们静态地确定每个加载指令(即从内存中读取的指令)存储指令可能合法地产生了数据,并且我们标记这些指令并将这些标签保存在一组中。在运行时,对于内存中的每个字节,我们记住该位置的最后一个存储的标签。当我们遇到加载指令时,我们会检查该地址的最后一个存储是否在合法存储集中,如果不是,我们会发出警报。与CFI不同,DFI在实践中并未被广泛采用,可能是因为其显著的性能开销。
责任编辑:武晓燕 来源: 河南等级保护测评 操作系统虚拟化C++(责任编辑:百科)
智升集团控股(08370.HK)发布业绩公告:全年公司拥有人应占亏损2700万元
四川省达州市达川区市场监督管理局 食品安全知识宣传走进堡子镇
北京银行个人养老金账户怎么开通?浙商银行个人养老金账户怎么开?
江西南昌南外环高速公路全线竣工通车 带动昌南地区经济社会发展
深圳大湾区首推专项支持票据产品 持续发力为 “专精特新”发展助力
好消息!全国首个百万千瓦煤电机组节能减排升级与改造示范项目建成投产