【问题标题】:FIPS Capable OpenSSL cross-compiled: incore fingerprint issueFIPS Capable OpenSSL 交叉编译:incore 指纹问题
【发布时间】:2017-03-24 09:19:09
【问题描述】:

我在尝试在 MIPS 设备上使用编译为 FIPS 功能OpenSSL 共享库 (libcrypto) 时遇到问题。
我通过以下方式(总结)交叉编译了 FIPS 对象模块和 OpenSSL 库:

export FIPS_SIG=<my_path>/incore
./config fips --with-fipsdir=<my_path>/fips-2.0
make depend
make
make install

我完成了所有需要的步骤,因此我能够编译和安装库。
当我尝试从链接 OpenSSL 库的应用程序运行 FIPS_mod_set(1) API 时出现此问题。
FIPS 模式初始化失败,收到此错误:

2010346568:error:2D06B06F:lib(45):func(107):reason(111):NA:0:

调试FIPS代码,发现问题出在FIPS_check_incore_fingerprint(void)函数内部:
检查memcmp(FIPS_signature,sig,sizeof(FIPS_signature)) 失败。
深入调试,我发现 FIPS_signature 值仍然是默认值,所以我怀疑 fipsld 调用的 incore 脚本> 实用程序,未在 OpenSSL 共享对象中正确嵌入指纹。
如何检查 incore 脚本是否将指纹嵌入到共享对象中?
如何打印预期的指纹?
我需要调整 incore 脚本吗? (我想这是不允许的)
你有什么建议吗?
非常感谢!

P.S.:我正在使用 x86 Linux 机器进行交叉编译。

【问题讨论】:

  • 仅供参考...只有一个 MIPS 平台已经过验证。它是带有 TI TNETV1050 处理器的 VxWorks 6.8 操作环境。另请参阅OpenSSL FIPS 140-2 Security Policy, v 2.0. pp. 9-10
  • Here 是我不久前遇到一个与此相关的问题时提出的问题。出于调试目的,您可以更改任何文件(我对 fips_premain.cfips.cfipsld 进行了更改),但是在构建“官方”版本你不能改变任何东西(实际上有很多限制)。此外,请确保您的平台/架构对受支持。
  • 问题中缺少大量可能有用的信息。与其猜测潜在的问题,也许User Guide for the OpenSSL FIPS Object Module v2.0 会是一个好的开始。
  • 我了解与 FIPS 使用相关的所有限制,并且我仔细研究了所有文档。我知道 FIPS 对象模块无法更改,但我正在尝试了解如何将其与我的交叉编译的 OpenSSL 库集成。可能我找到了一个线索:incore 脚本正在处理共享库的错误偏移中的指纹。这可能是与 ELF 路径(和交叉编译的可执行文件)有关的问题。我会及时向大家发布。谢谢!

标签: linux openssl mips cross-compiling fips


【解决方案1】:

我发现了问题!我将尝试解释整个调试过程和解决方案。

简介:

当 OpenSSL 被配置为支持 FIPS 时,在编译期间 Makefile 会调用一个实用程序 fipsld,它都会执行 FIPS 的检查 对象模块并为应用程序可执行文件生成新的 HMAC-SHA-1 摘要(如官方 OpenSSL 用户指南 https://www.openssl.org/docs/fips/UserGuide-2.0.pdf 中所述)

fipsld 命令要求设置 CCFIPSLD_CC 环境变量, 后者优先。
在 Makefile 中你会发现类似这样的内容:

libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT)
    @if [ "$(SHLIB_TARGET)" != "" ]; then \
        if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \
            FIPSLD_LIBCRYPTO=libcrypto.a ; \
            FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \
            export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \
        fi; \
        $(MAKE) -e SHLIBDIRS=crypto  CC="$${CC:-$(CC)}" build-shared && \
        (touch -c fips_premain_dso$(EXE_EXT) || :); \
    else \
        echo "There's no support for shared libraries on this platform" >&2; \
        exit 1; \
    fi

然后,fipsld 实用程序调用 shell 脚本 incore,用于将 FIPS 对象模块的预期指纹嵌入 OpenSSL 共享对象中。通过 FIPS_SIG 环境变量指定内核路径很重要,例如:

export FIPS_SIG=$PWD/openssl­fips­2.0/util/incore

调试:

调试 incore 脚本,我可以看到该脚本试图将签名嵌入到共享对象的偏移量 0x001EE6B0FIPS_signature 共享对象内的符号位于不同的偏移量处,更具体地说是在 0x001F0630

objdump -t libcrypto.so.1.0.0 | grep FIPS_signature
001f0630 g     O .data  00000014              FIPS_signature

readelf -a libcrypto.so.1.0.0 | grep FIPS_signature
   870: 001f0630    20 OBJECT  GLOBAL DEFAULT   18 FIPS_signature
  3925: 001f0630    20 OBJECT  GLOBAL DEFAULT   18 FIPS_signature

进一步转储共享对象我无法在偏移量 0x001EE6B0 处找到生成的签名,因此我得出结论,共享对象是在签名嵌入过程之后由其他进程编辑的。

解决方案:

我正在为 OpenSSL 数据包使用包 Makefile,格式如下:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
    <options>
    all
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
    <options>
    build-shared
rm $(PKG_BUILD_DIR)/libssl.so.*.*.*
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
    <options>
    do_linux-shared
$(MAKE) -C $(PKG_BUILD_DIR)
    <options>
    install

正如怀疑的那样,ma​​ke build-sharedma​​ke do_linux-shared 命令以错误的方式更改共享对象。
注意make build-shared 在没有使用正确的环境变量的情况下被调用。

我更改了包 Makefile:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
    <options>
    all
$(MAKE) -C $(PKG_BUILD_DIR)
    <options>
    install

现在FIPS_check_incore_fingerprint(void) 函数成功返回,一切正常!

注意:

以下适用于 Android 设备的指南对于找到合适的解决方案非常有用。 https://wiki.openssl.org/index.php/FIPS_Library_and_Android

【讨论】:

  • “我可以看到该脚本试图将签名嵌入到共享对象的偏移量 0x001EE6B0” 您介意解释一下您是如何找到这个的吗?谢谢!
  • 我打印了 incore 脚本中使用的偏移量(修补代码),并将偏移量与 objdump 检查产生的偏移量进行了比较
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2016-11-13
相关资源
最近更新 更多