Visual Studio 2015的预览版于2014年11月12日发布。 它包括一个新的正在工作的特性,称为 控制流护罩 . 通过简单地向项目中添加一个新选项,VisualC++编译器将向您的二进制文件中注入额外的安全检查。 这些将检测到试图劫持您的代码。 在劫机者破坏你的数据或电脑之前,检查将停止你的代码执行。
这个博客解释了你如何用 控制流护罩 在预览中。 您的反馈将决定我们如何推进发布计划。
在本文的其余部分,我将把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公司 . 我们希望这项技术 这将提高黑客试图攻击你的电脑和电脑的难度 代码。 今后,我们可能会延长 提供更强的运行时检查的技术。