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

时间:2016-03-28 18:14:46

标签: openssl fips

我们正在使用FIPS验证的libeay32.dll。此dll使用ppi = [] for line in read_text: prot_interaction = line[0:14] ppi.append(prot_interaction) result_ppi = [] for line in read_text: result = line[-1] result_ppi.append(result) 链接器开关,以便libeay32.dll将加载到固定的基址。我们项目中的其他模块使用/FIXED函数在共享模式下使用openssl dll。我们在加载上述dll时观察到了间歇性问题。

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

  

使用fips选项的标准OpenSSL构建将使用基础   默认情况下 LoadLibrary() libeay32.dll 的地址。这个值是   选择因为它不可能动态地与其他冲突   加载的库。如果与另一个动态冲突   加载的库将触发 0xFB00000 的运行时重定位,   完整性检查将失败并显示错误

libeay32.dll
     

可以通过改组其他DLL来解决基址冲突   使用指定的备用基地址重新编译OpenSSL    FIPS_R_FINGERPRINT_DOES_NOT_MATCH_NONPIC_RELOCATED 选项。

以下是我的问题。

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

  2. 我在使用这些开放式ssl库的模块中引入了哪些安全漏洞及其副作用?

  3. 这种装载问题的任何清洁解决方案?

  4. 提前致谢...

3 个答案:

答案 0 :(得分:1)

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

$(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

之前的回答有关于无法修改支持FIPS的OpenSSL构建过程的错误陈述。它只是安全策略中记录的fipscanister本身的构建,具有固定的不可更改的过程。支持FIPS的OpenSSL构建过程完全可以修改以满足您的要求 - 它只是使用OpenSSL FIPS模块。

答案 1 :(得分:0)

  

通过在libeay32.dll的图像标题中引入重定位信息,我是否使libeay32.dll易受安全影响

所有Windows PE文件have relocation information。它不像Unix和Linux上的-fPIC。机制不同,因为PE / PE +可执行格式与ELF / ELF64规范不同。此外,Microsoft编译器/链接器不使用PC-relative addressing mode,而Unix和Linux通常会这样做。

您在Windows上想要的是/ASLR,但/ASLR/FIXED正交。 FIPS模块使用/FIXED来确保模块的完整性。 /ASLR是Windows和Microsoft SDLC项目的最佳做法。

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

  

我在使用这些OpenSSL库的模块中引入了哪些类型的安全漏洞?

由于/FIXED,攻击者总是知道二进制文件的加载位置,并且他可以使用它构建ROP chain。这假设攻击者抓住了漏洞。

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

  

这种装载问题的任何清洁解决方案?

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

我相信你也可以在程序中执行以下操作(EXE)。它来自Crypto++'s dll.h,它也有验证。将它放在预编译的头文件或程序的“主标题”中。

#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来修改构建过程,则会丢失验证。您也可以使用常规库。

正如您所正确指出的那样,您可以更改用于模块的基址。权限由User Guide for the OpenSSL FIPS Object Module v2.0,第52/208页提供。

答案 2 :(得分:0)

是正确的;从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)。