Partilhar via


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

Este artigo descreve a política de suporte da Microsoft quando você usa desvios de terceiros com o SQL Server e os problemas que podem ocorrer ao usá-los.

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

Resumo

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

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

  • Problemas de desempenho.
  • Resultados incorretos.
  • Corrupção de disco e memória.
  • Perda de resposta do SQL Server.
  • Término inesperado do processo.
  • Incapacidade de usar diagnósticos 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 no SQL Server.

Você pode encontrar esses mesmos problemas ao usar software que não seja da Microsoft, como servidores vinculados, procedimentos estendidos ou objetos COM no processo do SQL Server. Os desvios estão ocultos da visualização do 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 registro explícito e interfaces 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.

É prática comum, no curso normal da solução de problemas, que os serviços de suporte da Microsoft solicitem que você desabilite trabalhos não essenciais e desabilite ou remova componentes de terceiros e outras técnicas semelhantes. A Microsoft sempre tenta reduzir o volume 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 na produção.

Não é nossa intenção descobrir um desvio e, em seguida, considerar que a instância do SQL Server não tem 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 usado por um vírus. A Microsoft não garante nem certifica esses produtos de terceiros ou como os produtos de terceiros interagem com os produtos e serviços da Microsoft. Em vez disso, os fornecedores terceirizados são responsáveis pela identificação e confiabilidade de seus produtos e serviços. Se você tiver alguma dúvida sobre produtos e serviços de terceiros, entre em contato com o terceiro aplicável. A Microsoft não é responsável por quaisquer problemas causados pelo uso de produtos ou serviços de terceiros em conexão com o SQL Server.

Mais informações

Os desvios fornecem recursos aprimorados e uma relação 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 do SQL Server.

A seguir estão alguns exemplos de situações e possíveis efeitos colaterais:

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

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

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

    • Os planos de execução não correspondem ao texto da 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 (Agendador do Modo de Usuário) e do SQLOS (Sistema Operacional SQL Server) pode ser interrompido. Isso leva à perda de resposta do SQL Server, a alterações de desempenho e a interrupções.
  • As APIs do Win32 que fornecem recursos de segurança aprimorados são desviadas. Dependendo da implementação, os recursos de registro nesse nível podem expor senhas e outros dados confidenciais. O agendamento geral de UMS e SQLOS é interrompido. Isso leva à perda de resposta do SQL Server e a interrupções.

  • Não há suporte para a modificação de tabelas de funções e o redirecionamento das principais funções do SQL Server ou APIs do Windows no processo do SQL Server. Isso pode levar à instabilidade e a um comportamento inesperado na funcionalidade do SQL Server.

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

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

Na montagem da 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 para o 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 as Ferramentas de Depuração para Windows para determinar se os desvios estão sendo usados. Para fazer isso, siga estas etapas:

Observação

Sempre teste esse método antes de experimentá-lo na produção. Quando você usa as 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. Anexe as Ferramentas de Depuração para Windows ao SQL Server ou carregue um arquivo de despejo de usuário completo.

  2. Emita o comando do depurador a seguir. Esse comando inspeciona cada imagem em relação à 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 tiver sido alterada, a saída poderá ser semelhante à 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.

Os programas antivírus que rastreiam ataques de injeção de SQL podem desviar o código do SQL Server. Nesse cenário, a !for_each_module "!chkimg -v @#Base -d" saída da extensão pode mostrar que o SQL Server funciona yyparse e ex_raise2 é modificado:

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 no SQL Server. Para obter mais informações sobre desvios e técnicas semelhantes, consulte Desvios.