Visual Studio 2015预览版:正在进行的安全功能

Visual Studio 2015的预览版于2014年11月12日发布。  它包括一个新的正在工作的特性,称为 控制流护罩 .  通过简单地向项目中添加一个新选项,VisualC++编译器将向您的二进制文件中注入额外的安全检查。  这些将检测到试图劫持您的代码。  在劫机者破坏你的数据或电脑之前,检查将停止你的代码执行。

null

这个博客解释了你如何用 控制流护罩 在预览中。 您的反馈将决定我们如何推进发布计划。

在本文的其余部分,我将把controlflowguard缩写为 CFG公司 .

如果你正在构建你的项目 从命令行,如: cl测试.cpp 然后告诉两个编译器(通过 /D2防护罩D4 )和链接器(通过 /guard:cf ) 添加CFG指令插入,如下所示: cl/D24防护罩  测试.cpp /链接/guard:cf (是的, /D2防护罩D4 是个奇怪的名字。  展望未来,我们将改变它-很可能 /guard:cf ,其中“cf”表示“控制流”。  但那是为了将来) 如果要在Visual Studio中构建项目,只需在项目的属性页中进行相应的更改: 因此,对于编译器,请单击以下序列: Project属性C++配置属性c/c++命令行附加选项 .  在结果窗口中,添加 /D2防护罩D4 类似地,对于链接器,单击以下序列: 项目|属性|配置属性|链接器|命令行|其他选项 .  在结果窗口中,添加 /guard:cf 就这些。  你不需要改变任何源代码-没有重组,没有注解,什么都没有。 编译器和链接器完成了所需的所有繁重工作—您只需指示它们使用这些新开关即可。

运行 垃圾箱 工具,并指定 /标题 /加载配置 选项。 在我们的运行示例中,我们会说: dumpbin/headers/loadconfig test.exe . 我已经提取了输出的相关部分并突出显示 三面旗 办理登机手续 蓝色 ,如下: 可选标题值 10B魔术#(PE32) //此处跳过字段 C140 DLL特性 动基座 NX兼容 警卫 节包含以下加载配置: 0000005摄氏度 大小 004271C0公司 安全Cookie 00425120 安全异常处理程序表 19 安全异常处理程序计数 0041D128号 检查函数指针的保护CF地址 00000000 保留 0041D1A8型 保护CF功能表 A8级 保护CF函数计数 00003500 保护旗 CF仪表化 存在FID表格 保护延迟负载IAT 在自己的部分延迟加载IAT

我们想让你试试这个 功能,并就您的发现向我们提供反馈:

  • CFG容易使用吗?
  • CFG容易理解吗?
  • 有什么影响?  更大的二进制文件?  轻微的 运行时速度?  有陷阱吗 攻击?
  • 我们怎样才能改进CFG?

通过供应 对于正在运行的程序,攻击者试图 让它做一些从未想过的事情。 例如,如果提供比预期更多的输入,攻击者可能会 覆盖程序为保存响应而保留的区域。  (这是一种叫做“缓冲区溢出”的攻击, 或“缓冲区溢出”)。  此后 程序可能执行一个间接调用指令,但不是跳转到 原来计划的位置,现在跳转到另一个位置 代码由攻击者控制。 请注意,这种攻击利用 原始程序中的漏洞(bug)。  此漏洞不是计算机的 断层;这是编写代码的团队的错误。  也就是说,发现并关闭 漏洞可能非常困难且耗时。 CFG公司 在这种情况下,我们会采取以下措施。  在编译和链接代码时,它分析 并发现任何间接调用指令可以到达的每个位置。  它将这些知识构建到二进制文件中 (在额外的数据结构中–在 垃圾箱 /加载配置 显示器)。  它也 在代码中的每个间接调用之前注入一个检查,以确保 目标是预期的安全地点之一。  如果该检查在运行时失败,操作系统 系统关闭程序。 所以,即使最初的代码 包含可被攻击者利用的bug;即使 代码的作者不知道这个bug,也没有修复它;甚至 虽然攻击者成功地在他的第一步,以利用安全漏洞; 尽管如此,CFG将阻止攻击继续造成后续损害。

你不需要这么做 CFG公司 代码的每一部分。  CFG’d和non-CFG’d代码的混合将 执行得很好,但非CFG’d部分当然不会包括任何 注入式检查–因此无法通过间接调用阻止攻击向量。 记住这句格言:“锁链是最重要的 只有最薄弱的环节才是最有力的”。  所以呢 尽可能多的使用CFG代码。

CFG操作取决于它 运行在“CFG-Aware”版本的Windows操作系统上。  当前,CFG出现在 以下版本的x86和x64版本,用于桌面和服务器:

  • Windows 10技术预览
  • Windows 8.1更新

你的保护代码将被执行 好 啊。  但它当然不会从中受益 安全性–您需要在支持CFG的Windows版本上运行 操作系统。  事实上 保护代码中的额外检查将在自动执行之前燃烧几个周期 转过来就成功了,所以你甚至可以发现 在这些场景中的性能。

为了这次实验性的发布 CFG,我们没有提供CFG版本的C或C++库。  这些将包含在将来的版本中。

支持CFG的技术是 概念上很简单:确保所有间接调用都会导致跳转到合法调用 目标。  类似的技术也得到了应用 在过去的几年里,原型,分析和报告。  例如,微软的 剑桥研究中心 他们工作的早期变体 ,后来成为CFG。 最小化 CFG检查在确保向后兼容性的同时,是一个主要的问题 软件工程挑战。  不仅如此 我们是否为每一张支票手工制作了最好的指令序列 调用编译器的分析来删除(即, 优化) 任何能证明特定间接调用 本质上是安全的。 此外,操作系统- 内存管理器和运行时加载器在保证 CFG的正确性。  CFG本身有什么缺陷吗 当然会破坏整个功能! 我们已经记不清有多少几十个或几百个研究人员 微软内部的工程师受到了CFG的影响。  我们希望你喜欢这一切努力的结果 过去几年秘密进行的工作!

CFG监视和检查某些 程序“控制流”的各个方面  – 也就是说,执行从一个接一个的连续指令变为连续指令。  这就解释了“CF”的缩写 注意到上面的注释。 CFG可以看作 利用缓解技术,利用 /GS公司 , DEP公司 ASLR公司 . 我们希望这项技术 这将提高黑客试图攻击你的电脑和电脑的难度 代码。 今后,我们可能会延长 提供更强的运行时检查的技术。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享