概要
Microsoft .NET Framework の暗号化コンポーネントとして実装される Transport Layer Security (TLS) プロトコルと Secure Sockets Layer (SSL) プロトコルに情報漏洩の脆弱性が存在します。攻撃者がこの脆弱性を悪用した場合、暗号化された TLS/SSL トラフィックを解読する可能性があります。この脆弱性を悪用するには、攻撃者はまずセキュリティで保護されたチャネルに暗号化されていないデータを挿入してから、標的のクライアントと正規のサーバーの間で man-in-the-middle (MiTM) 攻撃を実行する必要があります。この更新プログラムは、.NET の暗号化コンポーネントが暗号化されたネットワーク パケットを送受信する方法を変更することによって、この脆弱性を解決します。この脆弱性は、マイクロソフト セキュリティ情報 MS16-065 の一部として解決されます。この更新プログラムは、.NET Framework 暗号化コンポーネントが暗号化されたネットワーク パケットを送受信する方法を変更します。
次の表には、Common Vulnerabilities and Exposures リストの各脆弱性の標準のエントリへのリンクが含まれています。
|
Vulnerability title |
CVE number |
Publicly disclosed |
Exploited |
|---|---|---|---|
|
TLS/SSL Spoofing Vulnerability |
Yes |
No |
脆弱性の解決策
マイクロソフト セキュリティ情報 MS16-065 で導入された変更により、ハンドシェイク後の最初の TLS レコードが分割されます。これにより、SslStream、WebRequest (HttpWebRequest、FtpWebRequest)、SmtpClient、および HttpClient (HttpWebRequest が基になります) ストリームが最初の読み取りの 1 バイトを返し、その直後に後続読み取りの残りの (n-1) バイトが続きます。この動作変更は、TLS 1.0 + Cipher Block Chaining を使用するアプリケーションの場合のみ発生し、TLS 1.1 または TLS 1.2 を使用するときには発生しません。注: 前提条件として、マイクロソフト セキュリティ情報 MS12-006 をインストールし、この更新プログラムを有効にする必要があります。この変更のために、.NET Framework を基にしているいくつかのアプリケーションが機能しなくなります。この資料では、マイクロソフト セキュリティ情報 MS16-065 を適用した後にアプリケーションを正常に機能させるために使用できる 2 つの方法について説明します。
互換性の問題の緩和策
オプション 1: TLS 1.2 プロトコルに切り替える
このオプションでは、レジストリを変更するかプロトコルのバージョンをプログラム的に構成することによってアプリケーションで TLS 1.2 プロトコルを使用するようにします。
-
レジストリの変更重要 このセクションの手順の実行には注意が必要です。レジストリを誤って変更すると、深刻な問題が発生することがあります。レジストリを変更する前に、問題が発生した場合に備えて、復元できるようにレジストリのバックアップ を作成します。.NET Framework 4.5 以降のバージョン上で実行されている .NET Framework 4.0 および .NET Framework 4.5.x アプリケーションは、SchUseStrongCrypto レジストリ キーを有効にすることによって既定のプロトコルを TLS 1.2、TLS 1.1、および TLS 1.0 に切り替えることができます。このレジストリ キーの詳細については、マイクロソフト TechNet Web サイトのマイクロソフト セキュリティ アドバイザリ 2960358 の「推奨する対応策」セクションを参照してください。重要 このレジストリ変更は、以下の条件に該当する場合にのみ有効です。
-
ServicePointManager ベースの API を使用するアプリケーションが、ServicePointManager.SecurityProtocol の値を明示的に設定していない。そのようなクラスの例として、System.Net.Http.HttpClient、System.Net.FtpWebRequest、System.Net.HttpWebRequest、および System.Net.Mail.SmtpClient があります。コード内の ServicePointManager.SecurityProtocol の設定は、レジストリよりも優先されます。
-
アプリケーションが SslStream AuthenticateAsClient(String) オーバーロードを使用している
-
-
プロトコルのバージョンのプログラム的な構成.NET Framework 4.5 以降で実行され、SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) オーバーロードを使用している .NET Framework 4.0 および 4.5 アプリケーションは再コンパイルする必要があります。その際、3 番目のパラメーターとして、SslProtocols.Tls12、SslProtocols.Tls11、および SslProtocols.Tls を指定します。SslStream クラスの使用方法の詳細については、MSDN (Microsoft Developer Network) Web サイトの SslStream クラスのトピックを参照してください。注: .NET Framework 4.6 以降のバージョンは、既定のプロトコルとして TLS 1.2、TLS 1.1、および TLS 1.0 を使用します。この詳細については、Microsoft TechNet Web サイトのマイクロソフト セキュリティ アドバイザリ 2960358 を参照してください。
オプション 2: 分割パケットを処理する
この更新プログラムにより、1 つのレコードが複数のレコードに分割されます。そのため、アプリケーションが 1 回の Read の呼び出しで完全なレコードを使用できると想定している場合、そのようなアプリケーションが機能しなくなることがあります。アプリケーションが正しく動作するようにするには、アプリケーションが Stream.Read 呼び出しを正しく実行して分割パケットを処理することを確認します。こちらで利用できるサンプル コードを使用して、Read 呼び出しを正しく実行するようにアプリケーションを修正する方法を参照できます。更新の前 (緩和策あり) と後 (緩和策なし) の違いを示すサンプルの HTTP 要求 3147461 および次の更新プログラムが含まれます。3147458 がインストールされます。「詳細」を参照してください。Stream.Read メソッドの詳しい例については、MSDN (Microsoft Developer Network) Web サイトの Stream.Read Method (Byte[], Int32, Int32) のトピックを参照してください。
アプリケーションの互換性の問題の回避策
警告 これらの回避策によって、コンピューターやネットワークが、悪意のあるユーザーやウイルスなどの悪質なソフトウェアからの攻撃を受けやすくなる場合があります。この資料の情報は、記載されている回避策をユーザーが自己の判断で使用することを前提に提供されているものであり、この回避策をお勧めするものではありません。これらの回避策は、自己の責任において使用してください。
方法 1: レジストリ キーを更新する (すべてのバージョンの .NET Framework で使用可能です)
SCH_SEND_AUX_RECORD 構造を (グローバルに) 無効にします。 個別のアプリケーションの SCH_SEND_AUX_RECORD 構造を無効にします。
SCH_SEND_AUX_RECORD 構造を (グローバルに) 無効にします。
すべてのアプリケーションについて、次のレジストリ サブキーを追加します。
レジストリの場所:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>DWORD 名: SchSendAuxRecord値のデータ: 0注: <バージョン番号> プレースホルダーは、バージョンに応じて v4.0.30319 または v2.0.50727 です。64 ビット コンピューター上で実行されている 32 ビット アプリケーションの場合は、次のレジストリ サブキーを追加します。
レジストリの場所:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>DWORD 名: SchSendAuxRecord値のデータ: 0注: <バージョン番号> プレースホルダーは、バージョンに応じて v4.0.30319 または v2.0.50727 です。
回避策
この資料で説明されているセキュリティで保護されたモードを一時的に無効にするには、適切なリンクをクリックして .reg ファイルをダウンロードし、ダウンロードした .reg ファイルをダブルクリックしてレジストリを変更します。Microsoft .NET Framework 3.5 を対象としたアプリケーションの場合:
ManualOptOutSchSendAuxRecord20.reg ファイル Microsoft .NET Framework 4.0 以降のバージョンを対象としたアプリケーションの場合:
ManualOptOutSchSendAuxRecord40.reg ファイル この資料で説明されているセキュリティで保護されたモードを再び有効にするには、適切なリンクをクリックして .reg ファイルをダウンロードし、ダウンロードした .reg ファイルをダブルクリックしてレジストリを変更します。Microsoft .NET Framework 3.5 を対象としたアプリケーションの場合:
ManualOptInSchSendAuxRecord20.reg ファイル Microsoft .NET Framework 4.0 以降のバージョンを対象としたアプリケーションの場合:
ManualOptInSchSendAuxRecord40.reg ファイル マイクロソフトのサポート ファイルをダウンロードする方法の詳細については、以下のマイクロソフト サポート技術情報番号をクリックしてください。
119591 オンライン サービスからマイクロソフトのサポート ファイルを入手する方法 マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、配布ファイルのウイルス チェックを行っています。配布ファイルはセキュリティで保護されたサーバー上に置かれており、権限のない第三者が無断でファイルを変更できないようになっています。
個別のアプリケーションの SCH_SEND_AUX_RECORD 構造を無効にします。
すべてのアプリケーションについて、次のレジストリ サブキーを追加します。
レジストリの場所:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecordDWORD 名: アプリケーションの .exe の完全修飾パス (例: C:\MyApp\MyApp.exe)値のデータ: 0注: <バージョン番号> プレースホルダーは、バージョンに応じて v4.0.30319 または v2.0.50727 です。64 ビット コンピューター上で実行されている 32 ビット アプリケーションの場合は、次のレジストリ サブキーを追加します。
レジストリの場所:HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecordDWORD 名: アプリケーションの .exe の完全修飾パス (例: C:\MyApp\MyApp.exe)値のデータ: 0 (唯一の有効は値は 0 です。他の値は無視されます)注: <バージョン番号> プレースホルダーは、バージョンに応じて v4.0.30319 または v2.0.50727 です。
方法 2: アプリケーション レベルで構成を変更します (.NET Framework バージョン 4.6 以降でのみ使用できます)
.NET Framework 4.6 以降では、コードまたはアプリケーションの構成、レジストリの変更によりアプリケーション レベルで構成を変更できます。.NET Framework 4.6 では、次のいずれかの方法を使用してスイッチを設定できます。これらの例は、セキュリティ機能を無効にします。
-
プログラム的アプリケーションで最初に次のコードを実行する必要があります。これは、Service Point Manager が 1 回のみ初期化するためです。
private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching"; private const string DontEnableSchSendAuxRecordName = @"Switch.System.Net.DontEnableSchSendAuxRecord"; AppContext.SetSwitch(DisableCachingName, true); AppContext.SetSwitch(DontEnableSchSendAuxRecordName , true);
-
アプリケーションの構成アプリケーションの構成を変更するには、次のエントリを追加します。
<runtime><AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true"/></runtime>
-
レジストリ キー (コンピューター グローバル)
レジストリの場所:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AppContextHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext値: Switch.System.Net.DontEnableSchSendAuxRecord種類:文字列型 (String)値: True注: すべてのアプリケーションについて Switch.System.Net.DontEnableSchSendAuxRecord = False を指定します。
詳細
次に、この更新をインストールする前と後のクライアント/サーバーの通信パターンの例を示します。この情報は、この修正のインストールによるアプリケーションの動作停止の識別方法を説明するために提供されています。
|
緩和策なし |
緩和策あり |
|---|---|
|
[Server] waiting for connections (127.0.0.1:4431)[Client] Connecting to localhost:4431[Server] Client connected.[Client] Connected.Authenticating...[Server] Client authenticated.[Client] Sending request (94 Bytes)[Client] Waiting for reply…[Server] Received 94 bytes:<<<GET / HTTP/1.0Host:contoso.comUser-Agent:Testing application>>> [Server] Replied with 476 bytes.[Client 1:476 Bytes] Response:<<<<<HTTP/1.1 200 OK…>>>>> |
[Server] waiting for connections (127.0.0.1:4431)[Client] Connecting to localhost:4431[Server] Client connected.[Client] Connected.Authenticating...[Server] Client authenticated.[Client] Sending request (94 Bytes)[Client] Waiting for reply...[Server] Received 1 bytes:<<<G>>> [Server] Received 93 bytes:<<<ET / HTTP/1.0Host:contoso.comUser-Agent:Testing application>>> [Server] Replied with 476 bytes.[Client 1:1 Bytes] Response:<<<<<H>>>>> [Client 2:475 Bytes] Response:<<<<<TTP/1.1 200 OK …>>>>> |