我们正在使用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
选项。
以下是我的问题。
通过在libeay32.dll的映像头中引入重定位信息,我是否使libeay32.dll易受安全性影响[fips 140-2]?
我在使用这些开放式ssl库的模块中引入了哪些安全漏洞及其副作用?
这种装载问题的任何清洁解决方案?
提前致谢...
答案 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)。