为了获得最大的安全性,最好是静态链接还是动态链接 OpenSSL 库?

信息安全 openssl aslr
2021-08-28 12:54:13

当链接到 OpenSSL(或其他加密库)时,使用共享库并具有地址空间布局随机化或使用静态库而不具有 ASLR 会更安全吗?

2个回答

ASLR 和类似的东西是试图应对缓冲区溢出后果的方法——它们是一种捉迷藏游戏,因此攻击者发现将缓冲区溢出转化为远程代码执行变得更加困难。为了获得适当的安全性,最好先避免缓冲区溢出。

...为此,动态链接更好。原因如下:如果认为任何用 C 编写的给定代码都没有任何缓冲区溢出(尤其是 OpenSSL,它在该主题上有相当长的历史),那将是非常乐观的。因此,您能做的最好的事情就是能够通过更换故障部件及时修复已知的安全漏洞。如果您使用动态链接,这很容易:只需替换 DLL,就可以完成。如果 DLL 由操作系统提供(Linux 系统中的正常情况),那么当您应用来自操作系统供应商的安全更新时,这将自然而然地完成。但是,如果您使用静态链接,那么在您使用打补丁的 OpenSSL 重新编译(或至少重新链接)该特定应用程序之前,补丁程序不会进入您的应用程序。

实际上,静态链接意味着库上的安全修复将需要更长的时间才能应用于应用程序——或者,通常情况下,根本不会应用。这不好。因此,使用动态链接

我参加聚会迟到了,但我只是想发表一些意见,以防其他人路过。公认的答案是准确的,因为静态链接使就地升级变得更加困难。例如,如果您在您的应用程序中使用 OpenSSL,您可以将新的 libcrypto.dll(假设它与您的应用程序向后兼容)部署在旧的 DLL 上,这样就可以了。

然而,关于漏洞利用和其他讨厌的东西,我认为静态链接更安全一些。基本上,您的应用程序外部没有 DLL 可以与同一 DLL 的受污染版本甚至 shim(DLL 代理等......)

此外,这并不是反对任何一个的论点,但是如果您的外部库有利用,那么静态或动态都不会更安全,因为当它已经链接到您的应用程序时,它会在运行时被利用。

我同意他们关于更容易匹配当前 OpenSSL 版本的建议,并且在大多数情况下会建议动态链接,但是您最了解您的应用程序,并且由于最初的问题是问哪个更安全(我假设部署在盒子上时) ,您还应该考虑篡改。