SAFESEH:NO选项实际上是做什么的?

16

我正在尝试像示例中那样使用boost::asio::spawn函数,但在 Release 模式下出现以下错误:

  

libboost_context-vc120-mt-s-1_55.lib(jump_i386_ms_pe_masm.obj) : error   LNK2026: module unsafe for SAFESEH image

显然,我应该在项目设置中设置/SAFESEH:NO选项,但我不明白这会实际做什么。这会如何影响程序中的异常处理行为(包括 C++ 异常和 SEH)?

顺便说一句,我正在使用 MSVC-12.0。


可能是模块对于C++的SAFESEH图像不安全的重复问题。 - Cody Gray
你在相关文档中找不到答案的问题是什么?(文档链接:http://msdn.microsoft.com/en-us/library/9a89h429.aspx) - Cody Gray
1
@Cody Gray 这个帖子回答了问题“为什么会出现这个错误”,但没有解释“/SAFESEH:NO选项实际上会做什么”。 - FrozenHeart
2个回答

21

简短回答:禁用SafeSEH会降低您的程序安全性


详细信息:SafeSEH是一种编译器保护。

在Windows环境中,结构化异常处理程序(Structured Exception Handler)的记录如下所示:

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通过指示操作系统在跳转到处理程序指针之前先检查其有效性(与已知有效EH的表进行比对)来工作。这个过程有一些限制,在特殊情况下应用程序仍可能存在漏洞,但SEH-based攻击发生的可能性较小(或者更难实现)。

当链接到非SafeSEH编译的模块时,链接器无法生成“受信任表”(它无法告诉那些是有效的EHs以及它们的位置),因此您会收到错误提示。

Windows OS 工程中的一些后勤限制,兼容性原因以及控制地址落在加载模块范围之外(和可执行图像)的问题,导致默认禁用此选项,并留给用户选择是否启用它。

如果您的应用程序急需安全性,而您认为上述情况可能构成潜在威胁,则应启用它并重新编译模块以使用它。


1
有点离题,但自从Vista以来,SEH内部的工作方式已经变得更加复杂(也更加高效)了。 - BlueRaja - Danny Pflughoeft
@Marco 如果它可以保护exe文件,那么为什么默认情况下它没有被启用呢? - sonu gupta
@sonugupta 我猜那可能与兼容性原因有关。 - Marco A.
你说SafeSEH可以让Windows检查异常处理程序表,以确保它们没有被覆盖。但是你提到了一些应用程序仍然可能存在漏洞的情况。你能再详细说明一下吗?快速的谷歌搜索似乎表明,当表丢失时(如何丢失?),恶意软件唯一需要担心的是,当代码使用SAFE构建时,处理程序不能指向非代码段。因此,恶意软件会寻找pop,pop,ret序列。 - Motorhead

3
/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不会生成表:

>dumpbin safeseh_no.dll /loadconfig | find "xcept"
            00000000 Safe Exception Handler Table
                   0 Safe Exception Handler Count

如果表格存在,操作系统将使用它验证SEH处理程序在调用之前是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接