Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

요약

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.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 응용 프로그램은 다시 컴파일해야 하고, SslProtocols.Tls12, SslProtocols.Tls11 및 SslProtocols.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 구조 사용 안 함(전역으로)

개별 응용 프로그램에 대해 SCH_SEND_AUX_RECORD 구조 사용 안 함

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 대상 응용 프로그램:

지금 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 파일을 다운로드합니다.
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\AppContextHKEY_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

>>>>>


도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×