什么是安全:实际上没有选项
What SAFESEH:NO option actually do
我试图使用boost::asio::spawn
函数,如在示例中,但它给了我以下错误在发布:
libboost_context-vc120-mt-s-1_55.lib(jump_i386_ms_pe_masm.obj): errorLNK2026: module unsafe for SAFESEH image
很明显,我应该在项目的设置中设置/SAFESEH:NO
选项,但我无法理解这实际上会做什么。这如何影响程序中异常处理的行为(包括c++异常和SEH)?
我用的是MSVC-12.0.
简短的回答:禁用SafeSEH会降低你的程序安全性。
详细信息:SafeSEH是一个编译器保护。
在Windows环境中SEH(结构化异常处理程序)记录如下所示
Stack data (pointed by TEB - thread environment block)
|
| I) Pointer to next SEH record II
| EH pointer
|
| II) Pointer to next SEH record III
| EH pointer
|
| 0xFFFFFF
| default EH (MSVCRT)
通常基于seh的攻击依赖于覆盖上述记录之一并让应用程序抛出异常:这将绕过控制流到您的代码(我是而不是,考虑到这里的DEP/ASLR保护系统,所以我假设一个已知的+X位置)。更准确地说,它们经常"模拟EH返回",并获取下一个"邪恶制作"的指针跳转到shellcode。
SafeSEH的工作原理是指示操作系统在跳转到处理程序指针之前首先检查处理程序指针的有效性(根据已知的有效EHs表)。这个过程有一些限制,在特殊情况下,应用程序可能仍然容易受到攻击,但是基于seh的攻击不太可能发生(或者更难以制作)。
当链接到非safeseh编译的模块时,链接器将无法生成EH位置的"可信表"(它根本无法判断这些位置在哪里以及是否有效),因此您得到的错误。
Windows操作系统工程的一些逻辑限制,兼容性原因以及控制地址超出加载模块(和可执行映像)范围的问题导致选择默认禁用此选项,并让用户选择是否启用它。
如果您的应用程序迫切需要安全性,并且您认为上述场景是一个潜在的威胁,那么您应该启用它并重新编译模块以便使用它。
/SAFESEH生成一个"安全异常处理表":
>dumpbin safeseh_yes.dll /loadconfig | find "xcept"
3001F4D0 Safe Exception Handler Table
1 Safe Exception Handler Count
Safe Exception Handler Table
30018FE0 __except_handler4
/SAFESEH:NO produce NO table:
>dumpbin safeseh_no.dll /loadconfig | find "xcept"
00000000 Safe Exception Handler Table
0 Safe Exception Handler Count
如果表存在,操作系统在调用SEH处理程序之前使用它来验证它是否有效。
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- C/C++预处理器是否可以检测一些编译器选项
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我的删除节点函数实际上没有删除节点?
- 通过选项卡的文本设置QTabWidget顺序
- 通过ccmake在cmake中缓存依赖选项
- 如何传递多个 std::文件系统选项?
- 基于编译器选项的编译二进制路径
- 其中降频广播实际上是有用的
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- 如何应用 libcurl 的持久连接选项
- "delete"在 C++ 中实际上做了什么?
- 文件中.dat Dlib 选项
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 什么是安全:实际上没有选项