web-dev-qa-db-ja.com

最大限のセキュリティを確保するには、OpenSSLライブラリを静的または動的にリンクするのが最適ですか?

OpenSSL(または他の暗号化ライブラリ)にリンクする場合、共有ライブラリを使用してアドレス空間のレイアウトをランダム化する方が安全ですか、または静的ライブラリを使用してASLRを使用しない方が安全ですか?

4
user3642765

ASLRなどは、バッファオーバーフローの結果に対処しようとする方法です。これらは非表示&シークゲームであるため、攻撃者はバッファオーバーフローをリモートコード実行に変換するのが難しくなります。適切なセキュリティのために、最初にバッファオーバーフローが発生しないようにすることをお勧めします。

...そしてそのためには、動的リンクの方が優れています。その理由は次のとおりです。Cで記述された特定のコードにはバッファオーバーフローがないと信じるのは非常に楽観的です(特に、OpenSSLの場合、その件に関してかなり長い歴史があります)。したがって、あなたができる最善のことは、欠陥のある部分を交換することにより、既知のセキュリティホールを迅速に修正できるようにすることです。動的リンクを使用する場合、これは簡単です。DLLを置き換えるだけで、DLLを作成できます。 DLLがOSによって提供される場合(Linuxシステムでは通常のケース))、これはOSベンダーからのセキュリティ更新を適用するときに自然に行われます。ただし、静的リンクを使用する場合は、パッチが適用されたOpenSSLを使用して特定のアプリケーションを再コンパイル(または少なくとも再リンク)するまで、パッチはアプリケーションに組み込まれません。

実際には、静的リンクは、ライブラリのセキュリティ修正がアプリケーションに適用されるまでに時間がかかることを意味します。ほとんどの場合、まったく適用されません。これは悪いです。したがって、動的リンクを使用です。

9
Tom Leek

私はパーティーに遅れましたが、誰かが通り過ぎる場合に備えて意見を述べたかっただけです。静的なリンクによりインプレースアップグレードを行うことがより困難になるという点で、受け入れられた回答は正確です。たとえば、アプリでOpenSSLを使用している場合は、新しいlibcrypto.dll(アプリとの下位互換性があると想定)を古いDLLにデプロイするだけで十分です。

ただし、エクスプロイトやその他の厄介なものに関しては、静的リンクの方が少し安全だと私は主張します。基本的に、同じDLLの汚染されたバージョンや、shim(DLLプロキシなど)と交換できる、アプリケーションの外部にDLLはありません。 ..)

さらに、これは実際にはどちらにも反対するものではありませんが、外部ライブラリがエクスプロイトを持っている場合は、静的または動的のどちらも、アプリケーションにすでにリンクされているランタイムで悪用されるため、安全ではありません。

現在のOpenSSLバージョンをより簡単に一致させることに関する彼らの助言に同意します。ほとんどの場合、動的リンクが推奨されますが、あなたはアプリケーションを最もよく知っており、元の質問はどちらがより安全であるかを尋ねたので(ボックスにデプロイしている間、私は想定しています) 、改ざんについても検討する必要があります。

0
chanchos