使用 OpenSSL 作为库与在正在编写的程序中从独立命令调用输出

信息安全 编程 图书馆
2021-09-06 22:33:03

在另一个关于如何以编程方式使用 OpenSSL 的问题中, 一位社区成员正在编写,一个建议是使用system()命令,而另一个建议是包含 C 头文件并直接使用函数使用库。此外,如果 usingsystem()使用popen()或其他功能是否有安全优势

将 OpenSSL 作为库运行与从系统调用已编译的可执行文件相比,会产生什么安全隐患?我想在某些情况下可能存在依赖于系统上安装的 openssl 的完整性和真实性问题,但应用程序也可能使用过时的库。这种情况是否有某些考虑因素,或者可以更普遍地回答(如果是,请随时编辑问题)。

1个回答

作为一个粗略的总结,OpenSSL被设计为一个库,并且旨在被用作这样的库。命令行实用程序最初是用于测试和手动任务的工具。system()使用或从 C 应用程序调用命令行实用程序的潜在问题popen()包括:

  • 该工具期望其输入为必须生成和管理的文件。其中一些是敏感的,例如包含私钥的文件;复制它们时需要非常小心。

  • 该工具在其标准输出上将其输出作为文件或文本生成;该文本用于人类消费,而不是用于自动解析。一些极端情况可能很麻烦(例如,如果您使用openssl一种方法来分析 X.509 证书的内容,如果证书中的字符串包含换行符会发生什么情况?)。文本输出的格式可能因系统配置的细节(例如系统范围的语言或编码)而异。

  • 错误报告会很困难。使用 C API,您可以准确了解哪个步骤失败以及原因;使用命令行工具,您最多只能获得综合错误状态(“失败”)和文本消息。

  • system()它的兄弟在setuidpopen()应用程序中是绝对不行的(这是 1980 年代“get root shell”漏洞的王者)。

总而言之,从 C 代码调用openssl(命令行实用程序)是繁琐、低效且复杂的。仅复杂性就几乎机械地暗示了安全问题。