Udostępnij za pośrednictwem


Objazdy lub podobne techniki mogą powodować nieoczekiwane zachowania w programie SQL Server

W tym artykule opisano zasady pomocy technicznej firmy Microsoft w przypadku korzystania z objazdów innych firm z programem SQL Server i problemów, które mogą wystąpić podczas ich używania.

Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 920925

Podsumowanie

Pomoc techniczna firmy Microsoft napotkała wiele produktów innych firm, które używają objazdów w celu zapewnienia dodatkowych funkcji dla programu SQL Server. Są to zwykle funkcje inspekcji. Nie ma procesu certyfikacji dla objazdów innych firm dla aplikacji firmy Microsoft. W związku z tym firma Microsoft zdecydowanie odradza korzystanie z objazdów.

Funkcje korzystające z objazdów lub podobnych technik w celu zmiany zachowania programu SQL Server mogą powodować następujące problemy:

  • Problemy z wydajnością.
  • Nieprawidłowe wyniki.
  • Uszkodzenie dysku i pamięci.
  • Utrata odpowiedzi programu SQL Server.
  • Nieoczekiwane zakończenie procesu.
  • Brak możliwości korzystania ze standardowej diagnostyki, takiej jak funkcja fn_get_sql i DBCC INPUTBUFFER polecenie.
  • 100- procentowe wykorzystanie procesora CPU i długi czas odzyskiwania bazy danych w przypadku używania tabel OLTP w pamięci w programie SQL Server.

Te same problemy mogą wystąpić w przypadku korzystania z oprogramowania innego niż Microsoft, takiego jak serwery połączone, procedury rozszerzone lub obiekty COM w procesie programu SQL Server. Objazdy są ukryte w widoku DBA. Aby odkryć objazd, należy użyć technik opisanych w poniższej sekcji Więcej informacji . Serwery połączone, obiekty COM i procedury rozszerzone mają jawną rejestrację i zdefiniowane interfejsy.

Uwaga 16.

Ze względu na ukryty charakter objazdów i brak opublikowanych interfejsów firma Microsoft nie świadczy usług pomocy technicznej dla funkcji innych firm korzystających z objazdów ani podobnych technik. Strona trzecia jest odpowiedzialna za wsparcie własnego kodu, podobnie jak w przypadku własnego połączonego serwera lub innego zaakceptowanego wdrożenia.

Częstą praktyką jest zwykle rozwiązywanie problemów w przypadku usług pomocy technicznej firmy Microsoft z prośbą o wyłączenie zadań bezczynności oraz wyłączenie lub usunięcie składników innych firm oraz innych, podobnych technik. Firma Microsoft zawsze stara się zmniejszyć ślad problemu podczas identyfikowania problemu. Po zidentyfikowaniu problemu jako niepowiązanego z pracą lub produktami innych firm te zadania lub produkty innych firm mogą zostać wprowadzone z powrotem do produkcji.

Nie naszym zamiarem jest odkrycie objazdu, a następnie rozważenie nieobsługiwanego wystąpienia programu SQL Server. Firma Microsoft potwierdza, że niektóre implementacje są niezbędne. Firma Microsoft wymaga jednak zweryfikowania możliwości obsługi objazdów. Objazd od renomowanej i zaufanej firmy zdecydowanie różni się od nieoczekiwanego objazdu, który jest używany przez wirusa. Firma Microsoft nie gwarantuje ani nie certyfikowa tych produktów innych firm ani sposobu interakcji produktów innych firm z produktami i usługami firmy Microsoft. Zamiast tego dostawcy zewnętrzni są odpowiedzialni za identyfikację i wiarygodność swoich produktów i usług. Jeśli masz pytania dotyczące produktów i usług innych firm, skontaktuj się z odpowiednią stroną trzecią. Firma Microsoft nie ponosi odpowiedzialności za żadne problemy spowodowane przez korzystanie z produktów lub usług innych firm w związku z programem SQL Server.

Więcej informacji

Objazdy zapewniają ulepszone możliwości i kompromis ryzyka/nagrody. Zazwyczaj po zaimplementowaniu objazdu w programie SQL Server kod innej firmy jest wstrzykiwany do przestrzeni procesów. To działanie może zmienić zachowanie programu SQL Server.

Poniżej przedstawiono przykładowe sytuacje i możliwe skutki uboczne:

  • Pakiety przychodzącego ruchu sieciowego (TDS) są skanowane i zmieniane. Objazd jest dodawany w krytycznej lokalizacji w wątku procesu sieciowego net_readdata. Nawet 100 cykli procesora CPU w tej lokalizacji może znacznie zmniejszyć przepływność wsadową.

    Zmiana rzeczywistych danych TDS może prowadzić do bazgrołów pamięci. Ten problem wywołał różne problemy ze stabilnością programu SQL Server i uszkodzeniem danych. Problemy mogą spowodować częściową zmianę pakietu TDS i ponowne odtwarzanie pamięci na serwerze SQL Server. Obiekty rejestrowania na tym poziomie mogą uwidaczniać hasła i inne poufne dane, które śledzenie programu SQL Server ma na celu pomijanie i zabezpieczanie.

  • Procedury analizowania programu SQL Server są objazdowe w celu zmiany zachowania. Możliwe są następujące skutki uboczne:

    • Plany wykonywania nie są zgodne z rzeczywistym tekstem zapytania.
    • Polecenie jest przesyłane tylko raz od klienta. Jednak polecenie jest wykonywane wiele razy.
    • Dane wyjściowe śledzenia pokazują oryginalne polecenie zamiast zmienionego zapytania.
    • Polecenie DBCC INPUTBUFFER wyświetla oryginalne polecenie zamiast zmienionego zapytania.
    • Funkcja fn_get_sql wyświetla nieprawidłowe dane. Ponadto funkcja jest podatna fn_get_sql na wyjątki i niepoprawne wyniki. Funkcja fn_get_sql jest używana przez wiele rozwiązań do monitorowania i może powodować problemy z rozwiązaniami do monitorowania.
    • Harmonogram ogólnego trybu użytkownika (UMS) i planowanie systemu operacyjnego SQL Server (SQLOS) mogą zostać przerwane. Prowadzi to do utraty odpowiedzi programu SQL Server na zmiany wydajności i awarii.
  • Interfejsy API win32, które zapewniają rozszerzone funkcje zabezpieczeń, są objazdowe. W zależności od implementacji obiekty rejestrowania na tym poziomie mogą uwidaczniać hasła i inne poufne dane. Ogólne planowanie usług UMS i SQLOS zostało przerwane. Prowadzi to do utraty odpowiedzi programu SQL Server i awarii.

  • Modyfikowanie tabel funkcji i przekierowywanie podstawowych funkcji programu SQL Server lub interfejsów API systemu Windows nie jest obsługiwane w procesie programu SQL Server. Może to prowadzić do niestabilności i nieoczekiwanego zachowania w funkcji programu SQL Server.

W poniższym przykładzie pokazano, że kernel32!GetQueuedCompletionStatus funkcja została objazdowana.

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

W zestawie funkcji GetQueuedCompletionStatus pierwsza instrukcja została zastąpiona instrukcją skoku.

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

Zestaw dla wprowadzonego kodu pokazuje działanie objazdowe i wywołanie pliku 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]

Możesz użyć narzędzi debugowania dla systemu Windows, aby określić, czy są używane objazdy. W tym celu należy wykonać następujące czynności:

Uwaga 16.

Zawsze testuj tę metodę przed wypróbowaniem jej w środowisku produkcyjnym. W przypadku korzystania z narzędzi debugowania dla systemu Windows proces może zostać zamrożony podczas uruchamiania poleceń. To zachowanie może niekorzystnie wpłynąć na serwer produkcyjny.

  1. Dołącz narzędzia debugowania dla systemu Windows do programu SQL Server lub załaduj pełny plik zrzutu użytkownika.

  2. Wydaj następujące polecenie debugera. To polecenie sprawdza każdy obraz na obrazie na dysku, aby określić, czy objazdy zostały wprowadzone.

    !for_each_module "!chkimg -v @#Base -d"
    
  3. Odłącz debuger.

Jeśli obraz w pamięci został zmieniony, dane wyjściowe mogą wyglądać podobnie do następujących:

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)

Zestaw można przejrzeć, aby dokładniej przyjrzeć się problemowi w następujący sposób:

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

Programy antywirusowe śledzące ataki polegających na wstrzyknięciu kodu SQL mogą objazdować kod programu SQL Server. W tym scenariuszu !for_each_module "!chkimg -v @#Base -d" dane wyjściowe rozszerzenia mogą wskazywać, że funkcje yyparse programu SQL Server i ex_raise2 są modyfikowane:

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

Zalecamy skontaktowanie się z dostawcą objazdów lub podobnych technik, aby uzyskać szczegółowe informacje na temat sposobu korzystania z objazdów w programie SQL Server. Aby uzyskać więcej informacji na temat objazdów i podobnych technik, zobacz Detours (Objazdy).