MS16-065: TLS/SSL 프로토콜 정보 유출 취약성(CVE-2016-0149)에 대한 설명: 2016년 5월 10일

요약
Microsoft .NET Framework의 암호화 구성 요소에 구현된 경우 전송 계층 보안 프로토콜 및 Secure Sockets Layer 프로토콜(TLS/SSL)에 정보 유출 취약성이 존재합니다. 이 취약성 악용에 성공한 공격자는 암호화된 TLS/SSL 트래픽을 암호 해독할 수 있습니다.

이 취약성을 악용하기 위해 공격자는 먼저 보안 채널에 암호화되지 않은 데이터를 삽입한 다음 대상 지정된 클라이언트와 합법적 서버 간에 MiTM(메시지 가로채기(man-in-the-middle)) 공격을 수행해야 합니다. 이 업데이트는 .NET 암호화 구성 요소가 암호화된 네트워크 패킷을 보내고 받는 방식을 수정하여 취약성을 해결합니다.

이 취약성은 Microsoft 보안 공지 MS16-065의 일부로 해결되었습니다. 이 업데이트는 .NET Framework 암호화 구성 요소가 암호화된 네트워크 패킷을 보내고 받는 방식을 변경합니다.

다음 표에는 CVE(Common Vulnerabilities and Exposures) 목록의 각 취약성에 대한 표준 항목 링크가 포함되어 있습니다.

취약성 제목CVE 번호공개적으로 보고됨악용 여부
TLS/SSL 스푸핑 취약성CVE-2016-0149(영문)아니요

취약성 해결 방법

Microsoft 보안 공지 MS16-065에 도입된 변경 사항으로 인해 핸드셰이크 후 첫 번째 TLS 레코드가 분할되게 됩니다. 이로 인해 SslStream, WebRequest(HttpWebRequest, FtpWebRequest), SmtpClient 및 HttpClient(HttpWebRequest 기반) 스트림이 첫 번째 읽기에 대해 싱글바이트를 반환하고 다음에 이어지는 읽기에서 바로 나머지(n-1)를 반환하게 됩니다. 이 동작 변경은 TLS 1.0 + 암호화 블록 체인을 사용하는 응용 프로그램에서만 발생하며 TLS 1.1 또는 TLS 1.2를 사용하는 경우에는 발생하지 않습니다.

참고 필수 구성 요소로, Microsoft 보안 공지 MS12-006을 설치하여 이 업데이트를 사용하도록 설정해야 합니다.

이 변경 사항으로 인해 .NET Framework 기반 응용 프로그램 일부가 중단될 수 있습니다. 이 문서에서는 Microsoft 보안 공지 MS16-065를 적용한 후 제대로 작동하도록 응용 프로그램을 업데이트하는 데 사용할 수 있는 두 가지 접근 방식에 대해 설명합니다.

호환성 문제에 대한 완화

옵션 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으로 전환할 수 있습니다. 이 레지스트리 키는 Microsoft TechNet 웹 사이트에서 Microsoft 보안 공지 2960358 항목의 권장 조치 절에 나와 있습니다.

    중요 이 레지스트리 변경은 다음과 같은 경우에만 작동합니다.
    • ServicePointManager 기반 API를 사용하는 응용 프로그램이 명시적으로 ServicePointManager.SecurityProtocol 값을 설정하지 않습니다. 이러한 클래스의 예로는 System.Net.Http.HttpClient, System.Net.FtpWebRequest, System.Net.HttpWebRequestSystem.Net.Mail.SmtpClient가 있습니다. 코드에서 ServicePointManager.SecurityProtocol을 설정하면 레지스트리보다 우선적으로 적용됩니다.
    • 응용 프로그램이 SslStream AuthenticateAsClient(String) 오버로드를 사용하고 있습니다.

  • 프로그래밍 방법으로 프로토콜 버전 구성

    .NET Framework 4.5 이상 버전에서 실행되고 있고 SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) 오버로드를 사용하는 .NET Framework 4.0 및 4.5 응용 프로그램은 다시 컴파일해야 하고, SslProtocols.Tls12, SslProtocols.Tls11SslProtocols.Tls를 세 번째 매개 변수로 지정해야 합니다. SslStream 클래스를 사용하는 방법에 대한 전체 설명은 MSDN(Microsoft Developer) 웹 사이트의 SslStream 클래스 항목을 참조하십시오.

    참고 .NET Framework 4.6 이상 버전은 TLS 1.2, TLS 1.1 및 TLS 1.0을 프로토콜 기본값으로 사용합니다. 이에 대해서는 Microsoft TechNet 웹 사이트의 Microsoft 보안 공지 2960358 항목에 설명되어 있습니다.

옵션 2: 분할된 패킷 처리

이 업데이트로 인해 단일 레코드가 여러 레코드로 분할되게 됩니다. 따라서 응용 프로그램이 전체 레코드가 단일 읽기 호출에서 사용 가능할 것으로 예상하는 경우 이러한 응용 프로그램은 중단될 수 있습니다. 응용 프로그램이 제대로 작동하게 하려면, 응용 프로그램이 Stream.Read 호출을 제대로 수행하여 분할된 패킷을 처리하는지 확인합니다. 읽기 호출을 제대로 수행하도록 응용 프로그램을 수정하는 방법에 대한 참고자료로 여기에서 제공되는 샘플 코드를 사용할 수 있습니다.

업데이트 31474613147458 설치 이전(완화 사용) 및 이후(완화 사용 안 함) 동작의 차이를 보여주는 샘플 HTTP 요청은 "추가 정보" 절을 참조하십시오.

Stream.Read 메서드의 전체 예는 MSDN(Microsoft Developer) 웹 사이트의 Stream.Read 메서드(Byte[], Int32, Int32) 항목을 참조하십시오.

프로그램 호환성 문제에 대한 해결 방법

경고 이러한 해결 방법으로 인해 컴퓨터나 네트워크가 악의적인 사용자나 바이러스와 같은 악성 소프트웨어의 공격에 더 취약해질 수 있습니다. 따라서 이러한 해결 방법을 권장하지는 않지만 사용자의 판단에 따라 구현할 수 있도록 이 정보를 제공하고 있습니다. 이러한 해결 방법의 사용에 따른 모든 책임은 사용자에게 있습니다.

방법 1: 레지스트리 키 업데이트(모든 버전의 .NET Framework에 사용 가능)



SCH_SEND_AUX_RECORD 구조 사용 안 함(전역으로)
모든 응용 프로그램에 대해 다음 레지스트리 하위 키를 추가합니다.
레지스트리 위치:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>

DWORD 이름: SchSendAuxRecord
값 데이터: 0

참고 <version_number> 자리 표시자는 버전에 따라 v4.0.30319 또는 v2.0.50727입니다.

64비트 컴퓨터가 실행되는 32비트 응용 프로그램에 대해 다음 레지스트리 하위 키를 추가합니다.
레지스트리 위치:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>

DWORD 이름: SchSendAuxRecord
값 데이터: 0

참고 <version_number> 자리 표시자는 버전에 따라 v4.0.30319 또는 v2.0.50727입니다.

해결 방법
이 문서에 설명된 보안 모드를 일시적으로 사용하지 않게 설정하려면 해당 링크를 클릭하여 .reg 파일을 다운로드하고 다운로드한 .reg 파일을 두 번 클릭하여 레지스트리를 변경합니다.

Microsoft .NET Framework 3.5 대상 응용 프로그램:

Microsoft .NET Framework 4.0 이상 버전 대상 응용 프로그램:

이 문서에 설명된 보안 모드를 다시 사용하게 설정하려면 해당 링크를 클릭하여 .reg 파일을 다운로드하고 다운로드한 .reg 파일을 두 번 클릭하여 레지스트리를 변경합니다.

Microsoft .NET Framework 3.5 대상 응용 프로그램:

Microsoft .NET Framework 4.0 이상 버전 대상 응용 프로그램:

Microsoft 지원 파일을 다운로드하는 방법에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하십시오.
119591 온라인 서비스로부터 Microsoft 지원 파일을 받는 방법
Microsoft는 파일을 게시한 날짜에 사용할 수 있는 최신 바이러스 예방 프로그램으로 이 파일을 검사했습니다. 이 파일은 해당 파일을 무단으로 변경할 수 없도록 보안이 강화된 서버에 보관됩니다.


개별 응용 프로그램에 대해 SCH_SEND_AUX_RECORD 구조 사용 안 함
모든 응용 프로그램에 대해 다음 레지스트리 하위 키를 추가합니다.
레지스트리 위치:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

DWORD 이름: 응용 프로그램 .exe의 정규화된 경로(예: C:\MyApp\MyApp.exe)
값 데이터: 0

참고 <version_number> 자리 표시자는 버전에 따라 v4.0.30319 또는 v2.0.50727입니다.

64비트 컴퓨터가 실행되는 32비트 응용 프로그램에 대해 다음 레지스트리 하위 키를 추가합니다.
레지스트리 위치:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

DWORD 이름: 응용 프로그램 .exe의 정규화된 경로(예: C:\MyApp\MyApp.exe)
값 데이터: 0(유일하게 유효한 값은 0입니다. 기타 모든 값은 무시됩니다.)

참고 <version_number> 자리 표시자는 버전에 따라 v4.0.30319 또는 v2.0.50727입니다.

방법 2: 응용 프로그램 수준에서 구성 변경(.NET Framework version 4.6 이상 버전에만 사용 가능)

.NET Framework 4.6부터 코드나 응용 프로그램 구성 또는 레지스트리 변경을 통해 응용 프로그램 수준에서 구성을 변경할 수 있습니다.

.NET Framework 4.6에서 다음 방법을 사용하여 스위치를 설정할 수 있습니다. 해당 예에서는 보안 기능을 사용하지 않게 설정합니다.
  • 프로그래밍 방법

    응용 프로그램이 수행해야 하는 첫 작업은 다음 코드 실행입니다. Service Point Manager는 한 번만 초기화하기 때문입니다.
    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\AppContext
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext

    값: Switch.System.Net.DontEnableSchSendAuxRecord
    종류: String
    값: True

    참고 모든 응용 프로그램에 대해 Switch.System.Net.DontEnableSchSendAuxRecord = False입니다.
추가 정보
이 업데이트 설치 전후 샘플 클라이언트/서버 통신 패턴은 다음과 같습니다. 이 정보는 해당 픽스 설치로 인한 응용 프로그램 손상 식별을 위한 설명으로 제공됩니다.

완화 사용 안 함완화 사용
[서버] 연결 대기 중(127.0.0.1:4431)
[클라이언트] localhost:4431에 연결 중
[서버] 클라이언트가 연결되었습니다.
[클라이언트] 연결되었습니다. 인증 중...
[서버] 클라이언트가 인증되었습니다.
[클라이언트] 요청(94바이트)을 보내는 중
[클라이언트] 응답 대기 중…

[서버] 94바이트 받음: <<<GET / HTTP/1.0
호스트: contoso.com
사용자 에이전트: 응용 프로그램 테스트 중

>>>
[서버] 476바이트로 응답했습니다.

[클라이언트 1: 476바이트] 응답: <<<<<HTTP/1.1 200 OK

>>>>>
[서버] 연결 대기 중(127.0.0.1:4431)
[클라이언트] localhost:4431에 연결 중
[서버] 클라이언트가 연결되었습니다.
[클라이언트] 연결되었습니다. 인증 중...
[서버] 클라이언트가 인증되었습니다.
[클라이언트] 요청(94바이트)을 보내는 중
[클라이언트] 응답 대기 중…
[서버] 1바이트 받음: <<<G>>>
[서버] 93바이트 받음: <<<ET / HTTP/1.0
호스트: contoso.com
사용자 에이전트: 응용 프로그램 테스트 중

>>>
[서버] 476바이트로 응답했습니다.
[클라이언트 1: 1바이트] 응답: <<<<<H>>>>>
[클라이언트 2: 475바이트] 응답: <<<<<TTP/1.1 200 OK

>>>>>

속성

문서 ID: 3155464 - 마지막 검토: 05/13/2016 17:34:00 - 수정: 2.0

Microsoft .NET Framework 4.6.1, Microsoft .NET Framework 4.6, Microsoft .NET Framework 4.5.2, Microsoft .NET Framework 3.5.1, Microsoft .NET Framework 3.5, Microsoft .NET Framework 2.0 Service Pack 2

  • kbsecvulnerability kbsecurity kbsecbulletin kbfix kbexpertiseinter kbbug atdownload KB3155464
피드백