Chromeの小さな鍵のアイコンをクリックすると、問題のサイトはTLS v1を使用していると表示されます。opensslを使用して確認したところ、TLS1、SSL2、SSL3を使用してサイトにアクセスできました。 SSL2は安全ではないと私が理解しているところによると、これに基づいて、サイトは3つのいずれかを使用して攻撃を受ける可能性があります。
Webブラウザーから安全なサイトにアクセスするときに使用されるSSL/TLSのバージョンを決定するものは何ですか?
@Terryが言うように、クライアントsuggests、サーバーchooses。詳細があります:
最初のクライアントメッセージの一般的な形式(ClientHello
)は、サポートされている最も高いバージョンを示し、implicitlyは、以前のすべてのバージョンがサポートされていると主張しています-これは必ずしもそうではありません本当。たとえば、クライアントがTLS 1.2をサポートしている場合、「最大バージョン:1.2」を示します。ただし、サーバーは、クライアントが必ずしも使用したくない以前のバージョン(たとえば、TLS 1.0)の使用を選択する場合があります。
現代のクライアントは数回試行する習慣をつけています。たとえば、クライアントは最初に「TLS 1.2」を示すClientHello
を送信し、何か(何か)が失敗した場合、「TLS 1.0」を示すClientHello
を使用して再試行します。クライアントがこれを行うのは、TLS 1.0を実行できるが、「TLS 1.2」を含むClientHello
メッセージを拒否できる、不十分に実装された非準拠のTLSサーバーがあるためです。
面白い結果として、アクティブな攻撃者は、初期接続を強制的に閉じることにより、両方が新しいプロトコルバージョンをサポートしている場合でも、クライアントとサーバーに古いバージョン(TLS 1.0など)を使用させることができます。これは「バージョンロールバック攻撃」と呼ばれます。クライアントとサーバーが明らかに弱いプロトコルバージョンを使用することを受け入れない限り(そしてTLS 1.0がまだ十分に強力である限り)、重要ではありません。ただし、これは、クライアントがそのような「再試行」ポリシーを実装している限り(クライアントがそのような「再試行」を実装しなかった場合)、クライアントとサーバーが「可能な」最良のプロトコルバージョンを使用していることを保証できないことを意味します。ロールバック攻撃は阻止されますが、一部のWebサイトは到達不能に見えます)。
SSL 2.0のClientHello
メッセージの形式は非常に異なります。クライアントがSSL 2.0とそれ以降のバージョンの両方をサポートしたい場合、SSL 2.0形式に従う特別なClientHello
を送信し、「ところで、SSL 3.0とTLS 1.0も知っている」と指定する必要があります。 。これは RFC 2246の付録E で説明されています。最近のSSLクライアント(Webブラウザー)はこれを実行しません(IE 6.0はまだ実行していますが、IE 7.0はそうではありません)。
RFC 4346 (TLS 1.1)は、このようなSSLv2形式のClientHello
メッセージが「段階的に廃止」され、回避する必要があることを指定します。 RFC 5246 (TLS 1.2)は、クライアントがSSL 2.0をサポートしてはならない(SHOULD NOT)、したがって、そのようなClientHello
メッセージを送信する理由はないはずであることをより明確に述べています。 RFC 6176 現在SSL2.0を完全に禁止。
現在、RFCは法律ではありません。特定のRFCをサポートしていないため、刑務所に行くことはありません。ただし、RFCは依然としてガイダンスを提供しているため、近い将来(または遠く)の状況をどうにかして示しています。
実際には:
ClientHello
メッセージのみを送信し、サーバーがサポートしているように見えるものに応じて、SSL 3.0、TLS 1.0、TLS 1.1またはTLS 1.2に問題なく接続します(ただし、 "ポリシー、バージョンのダウングレードは、アクティブな攻撃者によって強制される可能性があります)。ClientHello
メッセージがSSLv3 + ClientHello
を偽装している限り、SSLv2 ClientHello
形式を受け入れます。広報だけの場合でも、サーバーでSSL 2.0サポート(SSLv2 ClientHello
形式ではなく、実際のSSL 2.0サポート)を非アクティブ化する必要があります。
TLSハンドシェイクプロセスを確認する必要があります。
簡単にまとめると、クライアント(この場合はブラウザー)はClientHello
メッセージをサーバーに送信します。これには、サポートする最大TLSバージョンと、優先順にサポートする暗号スイートのリストが含まれています。次に、サーバーは、TLS接続に使用するTLSバージョンと暗号スイートを決定し、ServerHello
で応答することによりクライアントに通知します。理想的には、最も高いTLSバージョンと最も強力な暗号スイートを選択する必要がありますが、TLS仕様はこれを保証しません。サーバーは、クライアントから提供されたリストから自由に使用できます。
クライアントがSSL/TLSを使用してサーバーにデータを送信する場合、クライアントは最初にハンドシェイクを実行して、サーバーで自身を認証する必要があります。このハンドシェイクは「ClientHello」で始まります。クライアントは、クライアントがサポートするバージョンのSSLまたはTLS、サポートされている暗号、およびその他のセッションデータをサーバーに送信します。古いバージョンのSSL(バージョン2)では、このハンドシェイクパケットを傍受し、サポートされている暗号リストを変更して、弱い暗号のみを含めることができました。 SSLv3はハンドシェイクの最後の部分でハッシュを使用するため、これはもはや不可能です。クライアントとサーバーの両方がハッシュし、送信されたメッセージと受信されたメッセージを比較します。
最新のブラウザはすべて、SSLv3からTLSv1.2までをサポートしていますが、サーバーでサポートされている最も高いバージョンを使用します。仲介者はハンドシェイクで送信されたパケットを直接変更することはできませんが、仲介者は特定のパケットを傍受してドロップすることができます。ブラウザーをだましてサーバーがSSL/TLSの特定のバージョンをサポートしていないと思わせることにより、攻撃者は交渉されたバージョンをダウングレードできます。 Praetorian's の最近の投稿にアクセスすると、その方法を確認できます: Man-in-the-middle TLSプロトコルダウングレード攻撃
SSLv3から今すぐ離れる理由
SSLv3には、プロトコルのダウングレード攻撃を防止するための特別な緩和策が含まれていましたが、必ずしもSSLv3が理想的なプロトコルであるとは限りません。 SSLv3には重要な暗号の違いがあり、TLSv1.2が現在の標準である理由をさらに示す弱点をもたらす可能性があります。合意された暗号化と認証の暗号、および鍵交換メカニズムは、プロトコルのダウングレードテストで大きく異なりました。上記の例では、TLSv1.2は楕円曲線暗号(ECC)とAESのカウンターモードを使用していますが、SSLv3は古いRC4暗号とRSAを使用しています。
なぜこれが必要なのかと尋ねる人もいます。 2013年のブラックハットの講演で、アレックススタモスは暗号化の現状と将来について話しました。彼は、危険の1つは将来のある時点で古い暗号または鍵交換メカニズムを破る可能性にあると主張しました。 RSAの場合、暗号学者と数学者は因数分解の問題で大きな進歩を遂げました。 Diffie-Hellman(DH)は暗号セキュリティの離散対数問題に依存しており、離散ログの計算に使用される効率的なアルゴリズムは存在しませんが、離散対数アルゴリズムのランタイムはこの1年で大幅に減少しました。 Stamosが議論したように、RSAまたはDHが失敗すると、コード署名が破られ、SSL/TLSに対する攻撃が非常に蔓延するようになります。
要約すると、接続に対するアクティブな攻撃により、暗号化セキュリティが低下する可能性があります。クライアントとサーバーは、新しいバージョンのTLSのみをサポートすることで、これを防ぐことができます。さらに、クライアントは失敗したハンドシェイクに適切に応答する必要があります。現在、多くのブラウザはセキュリティよりも相互運用性を選択しており、これによりプロトコルのダウングレード攻撃が可能になります。これらの変更には、かなりの時間と労力が必要です。ブラウザは、ハンドシェイクの処理方法の側面を再実装する必要があります。下位互換性が失われる場合があります。ただし、最終的には、ECCをサポートする新しいバージョンのTLSを使用する必要があります。今すぐプッシュを作って、将来の攻撃を防いでみませんか?