web-dev-qa-db-ja.com

OpenSSL、GnuTLS、JavaのTLS、.NETのTLSの実装に機能的な違いはありますか?

質問

  • SSL/TLSのさまざまな実装間に機能的な(または検出可能な)違いはありますか?それらの違いは何ですか? (例:「False Start」を実装するもの)

  • 誰かがTLS応答に基づいて使用されている基本的なSSLコードを検出できるのではないでしょうか。

背景

以下のSSLスタックに疑わしい機能( false start など)を組み込むこと、または実装固有のバグが含まれている可能性があるため、

  • OpenSSL はCで記述され、Apacheで使用されます
  • GnuTLS はCで記述されています
  • SunのSSL実装(主にJavaで記述)
  • Microsoft TLSが内部でWin32を使用しているかどうか、またはマネージコードを使用しているかどうかはわかりません。
5

SSL/TLS には多くのばらつきがあります。たとえば、データを送信する必要がある場合、データは1つまたは複数のレコードに分割され、実装は各レコードのサイズを自由に選択できます(標準のサイズ制限内)。特に、最新の実装では、BEAST攻撃に対する保護として、非常に短いレコード(0または1バイトのアプリケーションデータ)をいくつか作成する傾向があります。また、すべての実装は、数百の可能な暗号スイートのサブセットのみをサポートします。肝心な点は、実装を互いに区別することができるということです(私はそれを行う簡単に利用できるツールを知りませんが、実行することはそれほど難しくありません)。

使用されている実装を漏らすこと自体は大きな問題ではありません(人を緊張させる傾向があります)。とにかく、SSLサーバーがWebサーバー内で使用されている場合、Webサーバーを特定すると、SSL実装に関する明確な手がかりがすでに得られます(サーバーがIISの場合、SSLコードはMicrosoftのコードになります...)。また、SSL/TLSの実装はそれほど多くありません。攻撃者はこれを使用する必要はありません推測。1つが機能するまで、知っているすべてのエクスプロイトを試す必要があります。

「疑わしい機能」を備えた実装を使用する場合、問題は攻撃者がこの実装を使用していることを知っているまたは推測していることではありません。問題は、疑わしい機能を備えた実装を使用していることです。

6
Thomas Pornin