MS16-065: Descrição da vulnerabilidade de divulgação não autorizada de informações do protocolo TLS/SSL (CVE-2016-0149): 10 de maio de 2016

Sumário
Existe uma vulnerabilidade de divulgação de informações nos protocolos TLS e SSL conforme implementados no componente de criptografia do Microsoft .NET Framework. Um atacante que explorar com êxito essa vulnerabilidade poderá descriptografar o tráfego TLS/SSL criptografado.

Para explorar a vulnerabilidade, um atacante primeiro tem que injetar dados não criptografados no canal seguro e depois realizar um ataque intermediário (MiTM, man-in-the-middle) entre um cliente de destino e um servidor legítimo. A atualização aborda a vulnerabilidade modificando a maneira que o componente de criptografia .NET envia e recebe pacotes de rede criptografados.

Esta vulnerabilidade é corrigida como parte do Boletim de Segurança da Microsoft MS16-065. Esta atualização altera a maneira que o componente de criptografia do .NET Framework envia e recebe pacotes de rede criptografados.

A tabela a seguir contém links para a entrada padrão para cada vulnerabilidade na lista Vulnerabilidades Comuns e Exposições.

Título da vulnerabilidadeNúmero de CVEDivulgadas de forma públicaExplorado
Vulnerabilidade de falsificação de TLS/SSLCVE-2016-0149SimNão

Resolução da vulnerabilidade

A mudança introduzida no Boletim de Segurança da Microsoft MS16-065 causa a divisão do primeiro registro de TLS depois do handshake. Isso faz com que os fluxos SslStream, WebRequest (HttpWebRequest, FtpWebRequest), SmtpClient e HttpClient (quando baseados no HttpWebRequest) retornem um único byte para a primeira leitura, seguido imediatamente pelos (n-1) bytes restantes em leituras sucessivas. Esta alteração de comportamento ocorre somente para aplicativos que usam o TLS 1.0 + Encadeamento de Blocos de Criptografia, mas não quando eles usam TLS 1.1 ou TLS 1.2.

Observação Como um pré-requisito, é necessário instalar o Boletim de Segurança da Microsoft MS12-006 para ativar esta atualização.

Essa alteração pode fazer com que alguns aplicativos que são baseados no.NET Framework parem de funcionar. Este artigo descreve duas abordagens que podem ser usadas para atualizar o aplicativo para funcionar corretamente depois de aplicar o Boletim de Segurança da Microsoft MS16-065.

Mitigação para problemas de compatibilidade

Opção 1: Mudar para o protocolo TLS 1.2

Esta opção faz o aplicativo usar o protocolo TLS 1.2 modificando o Registro ou configurando de forma programática a versão do protocolo.
  • Modificar o Registro

    Importante  Siga as etapas nesta seção com cuidado. Sérios problemas poderão ocorrer caso você modifique o Registro incorretamente. Antes de modificá-lo, faça o backup do Registro para a restauração no caso de ocorrer problemas.

    Os aplicativos .NET Framework 4.0 e .NET Framework 4.5.x que estão executando no .NET Framework 4.5 e versões posteriores podem mudar o protocolo padrão para o TLS 1.2, TLS 1.1 e TLS 1.0 ativando a chave de Registro SchUseStrongCrypto. Essa chave de Registro é discutida na seção Ações sugeridas do tópico Microsoft Security Advisory 2960358 no site do Microsoft TechNet.

    Importante Essa alteração do Registro só funcionará se as seguintes condições forem verdadeiras:
    • Aplicativos que usam APIs baseadas em ServicePointManager não definem o valor de ServicePointManager.SecurityProtocol explicitamente. Exemplos dessas classes incluem System.Net.Http.HttpClient, System.Net.FtpWebRequest, System.Net.HttpWebRequest e System.Net.Mail.SmtpClient. A definição de ServicePointManager.SecurityProtocol no código tem precedência sobre o Registro.
    • Aplicativos estão usando a sobrecarga SslStream AuthenticateAsClient(String).

  • Configurar de forma programática a versão do protocolo

    Os aplicativos do .NET Framework 4.0 e 4.5 que estão executando no .NET Framework 4.5 e versões posteriores e que usam a sobrecarga SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) devem ser recompilados, especificando SslProtocols.Tls12, SslProtocols.Tls11 e SslProtocols.Tls como o terceiro parâmetro. Para uma descrição completa de como usar a classe SslStream, consulte o tópico SslStream Class no site do Microsoft Developer (MSDN).

    Observação O .NET Framework 4.6 e versões posteriores usam o TLS 1.2, TLS 1.1 e TLS 1.0 como os protocolos padrão. Isso é discutido no tópico Microsoft Security Advisory 2960358 no site do Microsoft TechNet.

Opção 2: Gerenciar a divisão dos pacotes

Essa atualização causa a divisão de um único registro em vários registros. Portanto, se um aplicativo está esperando o registro completo estar disponível em uma única chamada Read, esse aplicativo pode parar de funcionar. Para garantir que o aplicativo tem o comportamento correto, verifique se o aplicativo gerencia os pacotes divididos realizando a chamada Stream.Read de forma correta. É possível usar o código de amostra disponível aqui como uma referência para como corrigir o aplicativo para realizar a chamada Read de forma correta.

Para uma solicitação HTTP de amostra que mostre a diferença no comportamento antes (com a mitigação) e depois (sem a mitigação) de as atualizações 3147461 e 3147458 serem instaladas, consulte a seção "Mais informações".

Para um exemplo completo do método Stream.Read, consulte o tópico Stream.Read Method (Byte[], Int32, Int32) no site do Microsoft Developer (MSDN).

Soluções alternativas para problemas de compatibilidade de aplicativos

Aviso Estas soluções alternativas podem tornar um computador ou uma rede mais vulneráveis a ataque por usuários mal-intencionados ou software mal-intencionado, como vírus. Não recomendamos estas soluções alternativas, mas estamos fornecendo estas informações para que você possa implementar estas soluções alternativas segundo seus próprios critérios. O uso destas soluções alternativas é de sua responsabilidade.

Método 1: Atualizar as chaves de Registro (disponíveis para todas as versões do.NET Framework)



Desativar a estrutura SCH_SEND_AUX_RECORD (globalmente)
Para todos os aplicativos, adicione a seguinte subchave do Registro:
Local do Registro:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>

Nome da DWORD: SchSendAuxRecord
Dados do valor: 0

ObservaçãoO espaço reservado <número_da_versão> é v4.0.30319 ou v2.0.50727, dependendo da versão.

Para aplicativos de 32 bits que são executados em computadores de 64 bits, adicione também a seguinte subchave do Registro:
Local do Registro:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>

Nome da DWORD: SchSendAuxRecord
Dados do valor: 0

ObservaçãoO espaço reservado <número_da_versão> é v4.0.30319 ou v2.0.50727, dependendo da versão.

Solução alternativa
Para desativar temporariamente o modo de segurança descrito neste artigo, clique no link apropriado para baixar um arquivo .reg e clique duas vezes no arquivo .reg baixado para fazer as alterações no Registro.

Para aplicativos destinados ao Microsoft .NET Framework 3.5:

Para aplicativos destinados ao Microsoft .NET Framework 4.0 e versões posteriores:

Para reativar o modo de segurança descrito neste artigo, clique no link apropriado para baixar um arquivo .reg e clique duas vezes no arquivo .reg baixado para fazer as alterações no Registro.

Para aplicativos destinados ao Microsoft .NET Framework 3.5:

Para aplicativos destinados ao Microsoft .NET Framework 4.0 e versões posteriores:

Para obter mais informações sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de Dados de Conhecimento Microsoft:
119591 Como obter os arquivos de suporte da Microsoft nos serviços online
A Microsoft examinou o arquivo em busca de vírus. A Microsoft usou o software de detecção de vírus mais recente disponível na data de publicação do arquivo. O arquivo está armazenado em servidores de segurança avançada que ajudam a evitar alterações não autorizadas.


Desativar a estrutura SCH_SEND_AUX_RECORD para aplicativos individuais
Para todos os aplicativos, adicione a seguinte subchave do Registro:
Local do Registro:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

Nome da DWORD:Caminho totalmente qualificado para o aplicativo .exe (por exemplo, C:\MyApp\MyApp.exe)
Dados do valor: 0

ObservaçãoO espaço reservado <número_da_versão> é v4.0.30319 ou v2.0.50727, dependendo da versão.

Para aplicativos de 32 bits que são executados em computadores de 64 bits, adicione também a seguinte subchave do Registro:
Local do Registro:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

Nome da DWORD:Caminho totalmente qualificado para o aplicativo .exe (por exemplo, C:\MyApp\MyApp.exe)
Dados do valor: 0 (o único valor válido é 0. Qualquer outro valor será ignorado.)

ObservaçãoO espaço reservado <número_da_versão> é v4.0.30319 ou v2.0.50727, dependendo da versão.

Método 2: Alterar a configuração no nível de aplicativo (disponível somente para a do .NET Framework 4.6 e versões posteriores)

Começando com o .NET Framework 4.6, você pode alterar a configuração no nível de um aplicativo por meio do código ou configuração do aplicativo ou alterações no Registro.

No .NET Framework 4.6, você pode definir a opção usando qualquer um dos seguintes métodos. Estes exemplos desativam o recurso de segurança.
  • De forma programática

    A primeira coisa que o aplicativo deve fazer é executar o código a seguir. Isso ocorre porque o Service Point Manager irá inicializar somente uma vez.
    private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching"; private const string DontEnableSchSendAuxRecordName = @"Switch.System.Net.DontEnableSchSendAuxRecord"; AppContext.SetSwitch(DisableCachingName, true); AppContext.SetSwitch(DontEnableSchSendAuxRecordName , true);
  • Configuração do aplicativo

    Para alterar a configuração do aplicativo, adicione a seguinte entrada:
    <runtime><AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true"/></runtime>
  • Chave do Registro (computador global)

    Locais do Registro:
    HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AppContext
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext

    Valor: Switch.System.Net.DontEnableSchSendAuxRecord
    Tipo: Cadeia
    Valor: Verdadeiro

    Observação Switch.System.Net.DontEnableSchSendAuxRecord = False para todos os aplicativos.
Mais Informações
A seguir está uma amostra do padrão de comunicação cliente/servidor antes e depois de a atualização ser instalada. Estas informações são fornecidas para ilustração para identificar qualquer quebra de aplicativos devido a instalação dessa correção.

Sem a mitigaçãoCom a mitigação
[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.0
Host: contoso.com
User-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.0
Host: contoso.com
User-Agent: Testing application

>>>
[Server] Replied with 476 bytes.
[Client 1: 1 Bytes] Response: <<<<<H>>>>>
[Client 2: 475 Bytes] Response: <<<<<TTP/1.1 200 OK

>>>>>

Propriedades

ID do Artigo: 3155464 - Última Revisão: 05/13/2016 17:35:00 - Revisão: 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
Comentários