Desvios ou técnicas semelhantes podem causar comportamentos inesperados com SQL Server

Este artigo descreve a política de suporte da Microsoft ao usar desvios de terceiros com SQL Server e problemas que podem ocorrer quando você as usa.

Versão original do produto: SQL Server
Número de KB original: 920925

Resumo

O suporte da Microsoft encontrou vários produtos de terceiros que usam desvios para fornecer funcionalidades adicionais para SQL Server. Geralmente, são funcionalidades de auditoria. Não há nenhum processo de certificação para desvios de terceiros para aplicativos da Microsoft. Portanto, geralmente, a Microsoft desencoraja fortemente o uso de desvios.

Recursos que usam desvios ou técnicas semelhantes para alterar o comportamento de SQL Server podem causar os seguintes problemas:

  • Problemas de desempenho.
  • Resultados incorretos.
  • Corrupção de disco e memória.
  • Perda de resposta SQL Server.
  • Término inesperado do processo.
  • Incapacidade de usar diagnóstico padrão, como a função fn_get_sql e o DBCC INPUTBUFFER comando.
  • 100% de utilização da CPU e longos tempos de recuperação de banco de dados quando você usa tabelas OLTP na memória em SQL Server.

Você pode encontrar esses mesmos problemas quando estiver usando software não Microsoft, como servidores vinculados, procedimentos estendidos ou objetos COM no processo SQL Server. Os desvios estão ocultos do modo de exibição DBA. Para descobrir um desvio, você deve usar as técnicas descritas na seção Mais Informações a seguir. Servidores vinculados, objetos COM e procedimentos estendidos têm interfaces explícitas e de registro definidas.

Observação

Devido à natureza oculta dos desvios e à falta de interfaces publicadas, a Microsoft não fornece serviços de suporte para recursos de terceiros que usam desvios ou técnicas semelhantes. O terceiro é responsável pelo suporte de seu próprio código, assim como seria responsável por seu próprio servidor vinculado ou outra implantação sancionada.

É uma prática comum, no curso usual de solução de problemas, que os serviços de suporte da Microsoft peçam para desabilitar trabalhos não essenciais e desabilitar ou remover componentes de terceiros e outras técnicas semelhantes. A Microsoft sempre tenta reduzir a pegada do problema enquanto identifica o problema. Depois que o problema for identificado como não relacionado aos trabalhos ou produtos de terceiros, esses trabalhos ou produtos de terceiros poderão ser introduzidos novamente em produção.

Não é nossa intenção descobrir um desvio e, em seguida, considerar a instância de SQL Server sem suporte. A Microsoft reconhece que algumas implementações são necessárias. No entanto, a Microsoft exige que você valide a capacidade de suporte dos desvios. Um desvio de uma empresa respeitável e confiável é definitivamente diferente de um desvio inesperado que é usado por um vírus. A Microsoft não garante ou certifica esses produtos de terceiros ou como os produtos de terceiros interagem com produtos e serviços da Microsoft. Em vez disso, fornecedores de terceiros são responsáveis pela identificação e confiabilidade de seus produtos e serviços. Se você tiver dúvidas sobre produtos e serviços de terceiros, entre em contato com terceiros aplicáveis. A Microsoft não é responsável por problemas causados pelo uso de produtos ou serviços de terceiros em conexão com SQL Server.

Mais informações

Os desvios fornecem recursos aprimorados e uma compensação de risco/recompensa. Normalmente, quando um desvio é implementado no SQL Server, o código de terceiros é injetado no espaço do processo. Essa atividade pode alterar o comportamento de SQL Server.

Veja a seguir algumas situações de exemplo e possíveis efeitos colaterais:

  • Os pacotes TDS (tráfego de rede) de entrada são verificados e alterados. O desvio é adicionado em um local crítico no thread net_readdata processo de rede. Mesmo 100 ciclos de CPU neste local podem reduzir significativamente a taxa de taxa de lote.

    Uma alteração nos dados TDS reais pode levar a scribblers de memória. Esse problema desencadeou vários problemas de estabilidade SQL Server e na corrupção de dados. Problemas podem fazer com que um pacote TDS seja parcialmente alterado e que o lixo seja reproduzido para SQL Server. As instalações de log nesse nível podem expor senhas e outros dados confidenciais que SQL Server rastreamento foi projetado para suprimir e ajudar a proteger.

  • SQL Server rotinas de análise são desviadas para alterar o comportamento. A seguir estão possíveis efeitos colaterais:

    • Os planos de execução não correspondem ao texto de consulta real.
    • Um comando é enviado apenas uma vez do cliente. No entanto, o comando é executado várias vezes.
    • A saída de rastreamento mostra o comando original em vez da consulta alterada.
    • O DBCC INPUTBUFFER comando mostra o comando original em vez da consulta alterada.
    • A fn_get_sql função mostra dados incorretos. Além disso, a fn_get_sql função é suscetível a exceções e a resultados incorretos. A fn_get_sql função é usada por muitas soluções de monitoramento e pode causar problemas nas soluções de monitoramento.
    • O agendamento geral do UMS (Modo de Usuário) e do SQLOS (Sistema Operacional SQL Server) pode ser interrompido. Isso leva à perda de SQL Server resposta, às alterações de desempenho e a interrupções.
  • As APIs win32 que fornecem recursos de segurança aprimorados são desviadas. Dependendo da implementação, as instalações de log nesse nível podem expor senhas e outros dados confidenciais. O agendamento geral de UMS e SQLOS é interrompido. Isso leva à perda de SQL Server resposta e a interrupções.

  • Não há suporte para modificar tabelas de funções e redirecionar funções principais de SQL Server ou API do Windows no processo de SQL Server. Isso pode levar à instabilidade e ao comportamento inesperado na funcionalidade SQL Server.

O exemplo a seguir mostra que a kernel32!GetQueuedCompletionStatus função foi desviada.

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

No assembly para a GetQueuedCompletionStatus função, a primeira instrução foi substituída por uma instrução de salto.

0:038> u kernel32!GetQueuedCompletionStatus
kernel32!GetQueuedCompletionStatus
77e660f1 e90a9f00aa jmp 21e70000 ß This points to an address that does not appear in the loaded module list (lm). It is injected code.
77e660f6 83ec10 sub esp,10h

O assembly do código injetado mostra a atividade desviada e uma chamada para o arquivo MyDLL .

0:038> u 21e70000
21e70000 55 push ebp
21e70001 8bec mov ebp,esp
21e70003 51 push ecx
21e70004 8b4518 mov eax,dword ptr [ebp+18h]
21e70007 50 push eax
21e70008 8b4d14 mov ecx,dword ptr [ebp+14h]
21e7000b 51 push ecx
21e7000c 8b5510 mov edx,dword ptr [ebp+10h]
21e7000f 52 push edx
21e70010 8b450c mov eax,dword ptr [ebp+0Ch]
21e70013 50 push eax
21e70014 8b4d08 mov ecx,dword ptr [ebp+8]
21e70017 51 push ecx
21e70018 e8234d19ee call MyDLL+0x4d40 (10004d40) <- Call to the MyDLL file.
21e7001d 8945fc mov dword ptr [ebp-4],eax
21e70020 8b55fc mov edx,dword ptr [ebp-4]

Você pode usar ferramentas de depuração para Windows para determinar se os desvios estão sendo usados. Para fazer isso, execute as etapas a seguir.

Observação

Sempre teste esse método antes de experimentá-lo em produção. Quando você usa Ferramentas de Depuração para Windows, o processo pode congelar quando você executa os comandos. Esse comportamento pode afetar negativamente um servidor de produção.

  1. Anexar ferramentas de depuração para Windows a SQL Server ou carregar um arquivo de despejo de usuário completo.

  2. Emita o comando de depurador a seguir. Esse comando inspeciona cada imagem na imagem em disco para determinar se os desvios foram injetados.

    !for_each_module "!chkimg -v @#Base -d"
    
  3. Desanexe o depurador.

Se a imagem na memória foi alterada, a saída poderá se assemelhar ao seguinte:

Comparison image path: c:\program files\microsoft sql server\mssql\binn\ssnetlib.dll\ssnetlib.dll
Scanning section: .text
Size: 56488  
Range to scan: 0c261000-0c26eca8  
0c263710-0c26371a 11 bytes - ssnetlib!ConnectionClose  
[ 8b ff 55 8b ec 83 ec 10:68 00 00 00 00 e9 27 8a ]  
0c2641e0-0c2641ea 11 bytes - ssnetlib!ConnectionReadAsync (+0xad0)  
[ 8b ff 55 8b ec 83 ec 38:68 00 00 00 00 e9 00 7e ]  
0c265160-0c26516a 11 bytes - ssnetlib!ConnectionWriteAsync (+0xf80)  
[ 8b ff 55 8b ec 83 ec 28:68 00 00 00 00 e9 ba 70 ]  
Total bytes compared: 56488(100%)  
Number of errors: 33  
33 errors : 0c260000 (0c263710-0c26516a)

Você pode examinar o assembly para examinar mais de perto o problema da seguinte maneira:

0:038> u ssnetlib!ConnectionClose
ssnetlib!ConnectionClose]:
0c263710 6800000000 push 0
0c263715 e9278ada03 jmp MyDLL!MyGetQueuedCompletionStatus <- A detour has been installed.

Programas antivírus que acompanham ataques de injeção de SQL podem desviar SQL Server código. Nesse cenário, a saída da !for_each_module "!chkimg -v @#Base -d" extensão pode mostrar que o SQL Server funções e ex_raise2 são modificadosyyparse:

Comparison image path: <symbol file path>\sqlservr.exeRange to scan: c81000-3de7d48 ed71a8-ed71ad 6 bytes - sqlservr!yyparse [ ff f5 41 54 41 55:e9 c7 95 5c 76 90 ]1202820-1202824 5 bytes - sqlservr!ex_raise2 (+0x32b678) [ ff f3 57 41 54:e9 20 e0 29 76 ] Total bytes compared: 51801416(17%)Number of errors: 11

Recomendamos que você entre em contato com o provedor dos desvios ou técnicas semelhantes para obter informações detalhadas sobre como ele usa os desvios em SQL Server. Para obter mais informações sobre desvios e técnicas semelhantes, consulte Desvios.