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 podczas korzystania z objazdów innych firm z programem SQL Server oraz problemy, 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 korzystają z objazdów w celu zapewnienia dodatkowych funkcji programu SQL Server. Są to zazwyczaj funkcje inspekcji. Nie ma procesu certyfikacji dla tras innych firm dla aplikacji firmy Microsoft. W związku z tym, ogólnie rzecz biorąc, Firma Microsoft zdecydowanie zniechęca do korzystania 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.
  • Nie można używać standardowej diagnostyki, takiej jak funkcja fn_get_sql i DBCC INPUTBUFFER polecenie.
  • 100 procent użycia procesora CPU i długi czas odzyskiwania bazy danych podczas korzystania z tabel OLTP w pamięci w programie SQL Server.

Te same problemy mogą wystąpić w przypadku korzystania z oprogramowania spoza firmy Microsoft, takiego jak połączone serwery, procedury rozszerzone lub obiekty COM w ramach procesu 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 . Połączone serwery, obiekty COM i procedury rozszerzone mają jawną rejestrację i zdefiniowane interfejsy.

Uwaga

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 lub podobnych technik. Strona trzecia jest odpowiedzialna za obsługę własnego kodu, tak jak odpowiadałaby za własny serwer połączony lub inne usankcjonowane wdrożenie.

W typowym trakcie rozwiązywania problemów usługi pomocy technicznej firmy Microsoft często proszą o wyłączenie nieistotnych zadań oraz wyłączenie lub usunięcie składników innych firm i innych podobnych technik. Firma Microsoft zawsze próbuje zmniejszyć wpływ problemu podczas identyfikowania problemu. Po zidentyfikowaniu problemu jako niezwiązanego z zadaniami lub produktami innych firm te zadania lub produkty innych firm mogą zostać wprowadzone z powrotem do produkcji.

Nie chcemy odkrywać objazdu, a następnie uznać wystąpienie programu SQL Server za nieobsługiwany. Firma Microsoft przyznaje, że niektóre implementacje są niezbędne. Firma Microsoft wymaga jednak zweryfikowania możliwości obsługi objazdów. Objazd od renomowanych i zaufanych firm zdecydowanie różni się od nieoczekiwanego objazdu, który jest używany przez wirusa. Firma Microsoft nie gwarantuje ani nie certyfikuje 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 jakiekolwiek pytania dotyczące produktów i usług innych firm, skontaktuj się z odpowiednią stroną trzecią. Firma Microsoft nie ponosi odpowiedzialności za problemy spowodowane korzystaniem przez Użytkownika 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 procesu. To działanie może zmienić zachowanie programu SQL Server.

Poniżej przedstawiono kilka przykładowych sytuacji i możliwych skutków ubocznych:

  • Przychodzące pakiety ruchu sieciowego (TDS) są skanowane i zmieniane. Objazd jest dodawany w krytycznym miejscu 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 spowodował różne problemy ze stabilnością programu SQL Server i uszkodzenie danych. Problemy mogą spowodować częściową zmianę pakietu TDS i odtworzenie pamięci programu SQL Server. Funkcje 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ą objaśnione w celu zmiany zachowania. Poniżej przedstawiono możliwe działania niepożądane:

    • Plany wykonywania nie są zgodne z rzeczywistym tekstem zapytania.
    • Polecenie jest przesyłane tylko raz z 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 pokazuje nieprawidłowe dane. Ponadto fn_get_sql funkcja jest podatna na wyjątki i nieprawidłowe wyniki. Funkcja jest używana fn_get_sql przez wiele rozwiązań do monitorowania i może powodować problemy z rozwiązaniami monitorowania.
    • Ogólne harmonogramy trybu użytkownika (UMS) i sql server operating system (SQLOS) mogą zostać przerwane. Prowadzi to do utraty odpowiedzi programu SQL Server, zmian wydajności i przestojów.
  • Interfejsy API Win32, które zapewniają ulepszone funkcje zabezpieczeń, są objaśnione. W zależności od implementacji obiekty rejestrowania na tym poziomie mogą uwidoczniać hasła i inne poufne dane. Ogólne planowanie 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 funkcji programu SQL Server.

Poniższy przykład pokazuje, że kernel32!GetQueuedCompletionStatus funkcja została objaśniona.

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

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

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 wprowadzonej kodu pokazuje działanie objaśnione 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 wykonaj następujące czynności.

Uwaga

Zawsze przetestuj 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 po uruchomieniu 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 pod kątem obrazu na dysku, aby ustalić, czy wstrzyknięto objazdy.

    !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)

Możesz przejrzeć zestaw, 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ące na iniekcji SQL mogą odwoływać się do kodu programu SQL Server. W tym scenariuszu dane wyjściowe !for_each_module "!chkimg -v @#Base -d" rozszerzenia mogą pokazywać, że program SQL Server działa yyparse i ex_raise2 jest modyfikowany:

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 w celu uzyskania szczegółowych informacji na temat sposobu użyciaia w programie SQL Server. Aby uzyskać więcej informacji na temat objazdów i podobnych technik, zobacz Objazdy.