Openssl 在fips验证的libeay32.dll中添加重新定位信息的后果
我们正在使用FIPS验证的libeay32.dll。此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
/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)