Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl 在fips验证的libeay32.dll中添加重新定位信息的后果_Openssl_Fips - Fatal编程技术网

Openssl 在fips验证的libeay32.dll中添加重新定位信息的后果

Openssl 在fips验证的libeay32.dll中添加重新定位信息的后果,openssl,fips,Openssl,Fips,我们正在使用FIPS验证的libeay32.dll。此dll使用/FIXED链接器开关,以便在固定的基址处加载libeay32.dll。我们项目中的其他模块正在使用LoadLibrary()函数以共享模式使用openssl dll。我们在加载上述dll时观察到间歇性问题 作为解决方案的一部分,我们在libeay32.dll的映像头中添加了重新定位信息,并理解如果不是固定的,dll将在某个基址加载,以解决间歇加载问题。我查看了OpenSSL用户指南,其中提到以下内容 带有fips选项的标准Open

我们正在使用FIPS验证的libeay32.dll。此dll使用
/FIXED
链接器开关,以便在固定的基址处加载libeay32.dll。我们项目中的其他模块正在使用
LoadLibrary()
函数以共享模式使用openssl dll。我们在加载上述dll时观察到间歇性问题

作为解决方案的一部分,我们在libeay32.dll的映像头中添加了重新定位信息,并理解如果不是固定的,dll将在某个基址加载,以解决间歇加载问题。我查看了OpenSSL用户指南,其中提到以下内容

带有fips选项的标准OpenSSL构建将使用基本 默认情况下,
0xFB00000的
libeay32.dll的地址。这个值是
之所以选择此选项,是因为它不太可能与其他对象发生冲突
已加载的库。如果与其他车辆发生碰撞
已加载的库将触发libeay32.dll的运行时重新定位,
完整性检查将因错误而失败

FIPS_R_FINGERPRINT_DOES_NOT_MATCH_NONPIC_RELOCATED
基址冲突可以通过洗牌其他DLL或 使用指定的替代基址重新编译OpenSSL
--with-baseaddr=
选项

以下是我的问题

  • 通过在libeay32.dll的映像头中引入重定位信息,我是否使libeay32.dll易受安全攻击[fips 140-2]

  • 在使用这些开放ssl库的模块中,我引入了什么样的安全漏洞及其副作用

  • 对于此类装载问题,是否有更清洁的解决方案

  • 先谢谢你

    通过在libeay32.dll的映像头中引入重定位信息,我是否使libeay32.dll易受安全性攻击

    所有Windows PE文件。它不像Unix和Linux上的
    -fPIC
    。机制不同,因为PE/PE+可执行文件格式不同于ELF/ELF64规范。此外,Microsoft编译器/链接器不使用,Unix和Linux通常会使用

    在Windows上需要的是
    /ASLR
    ,但是
    /ASLR
    /FIXED
    正交<代码>/FIXED
    由FIPS模块使用,以确保模块的完整性
    /ASLR
    是Windows和Microsoft SDLC项目上的最佳实践

    地址空间布局随机化使得攻击者在某些情况下更难猜测地址。例如,它将有助于“返回libc”攻击


    我在使用这些OpenSSL库的模块中引入了什么样的安全漏洞及其副作用

    由于
    /FIXED
    ,攻击者总是知道二进制文件的加载位置,并且他可能能够使用它构建一个新的应用程序。这假设攻击者通过一个漏洞获得攻击

    我不喜欢FIPS验证库的一个原因是您丢失了
    /ASLR


    对于此类装载问题,是否有更清洁的解决方案

    通常您可以做的是,在使用FIPS DLL的可执行文件(EXE)中,添加OpenSSL导入库作为库列表中的第一项。它大致按照指定的顺序写入PE头。然后,运行时链接/加载程序将提前而不是延迟加载库。尽早加载可将[不满意]位移的可能性降至最低

    我相信您也可以在程序(EXE)中执行以下操作。它取自,也经过了验证。将它放在预编译头中,或程序的“主头”中

    #ifdef NDEBUG
    #pragma comment(lib, "msvcrt")
    #else
    #pragma comment(lib, "msvcrtd")
    #endif
    
    #pragma comment(lib, "libeay32")
    #pragma comment(lib, "anotherlib")
    #pragma comment(lib, "yetanotherlib")
    

    FIPS非常关注政策和程序。你必须严格遵守。如果通过更改
    /FIXED
    修改生成过程,则会丢失验证。你不妨使用普通图书馆

    正如您正确指出的,您可以更改用于模块的基址。第52/208页提供了权限。

    对于64位构建(假设您正在构建OpenSSL的DLL版本),只需将ms/ntdll.mk文件更改为在libeay32.DLL文件的链接中使用/dynamic,即可获得ASLR支持。标准的64位构建过程本身没有/fixed-in-place,但是/dynamic的额外步骤很可能就是您想要实现的

    $(O_CRYPTO): $(CRYPTOOBJ) $(O_FIPSCANISTER) $(PREMAIN_DSO_EXE)
            SET FIPS_LINK=$(LINK_CMD)
            SET FIPS_CC=$(CC)
            SET FIPS_CC_ARGS=/Fo$(OBJ_D)\fips_premain.obj $(SHLIB_CFLAGS) -c
            SET PREMAIN_DSO_EXE=$(PREMAIN_DSO_EXE)
            SET FIPS_SHA1_EXE=$(FIPS_SHA1_EXE)
            SET FIPS_TARGET=$(O_CRYPTO)
            SET FIPSLIB_D=$(FIPSLIB_D)
            $(FIPSLINK) $(MLFLAGS)  /map  /dynamicbase /out:$(O_CRYPTO) /def:ms/LIBEAY32.def @<<
      $(SHLIB_EX_OBJ) $(CRYPTOOBJ) $(O_FIPSCANISTER) $(EX_LIBS) $(OBJ_D)\fips_premain.obj 
    <<
            IF EXIST $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2
    
    $(O_CRYPTO):$(Cryptobj)$(O_Fipscant)$(PREMAIN_DSO_EXE)
    设置FIPS\u LINK=$(LINK\u CMD)
    设置FIPS_CC=$(CC)
    设置FIPS\u CC\u ARGS=/Fo$(OBJ\u D)\FIPS\u premain.OBJ$(SHLIB\u CFLAGS)-c
    设置PREMAIN\u DSO\u EXE=$(PREMAIN\u DSO\u EXE)
    设置FIPS_SHA1_EXE=$(FIPS_SHA1_EXE)
    设置FIPS_目标=$(O_加密)
    设置FIPSLIB_D=$(FIPSLIB_D)
    
    $(FIPSLINK)$(MLFLAGS)/map/dynamicbase/out:$(O_CRYPTO)/def:ms/LIBEAY32.def@tjh是正确的;从FIPS 140-2的角度来看,OpenSSL本身(例如1.0.1、1.0.2)只是应用程序代码,超出了FIPS 140-2验证的范围。只有模块——一个独立的、不同的软件组件——被验证,并且验证过程根本没有考虑OpenSSL本身

    还要注意的是,在FIPS中,土地安全仅次于验证的神圣性。例如,通常不允许OpenSSL纠正FIPS模块中的安全漏洞(例如“Lucky 13”、CVE-2014-0076、CVE-2016-0701)