Обходы или аналогичные методы могут привести к непредвиденному поведению с SQL Server

В этой статье описывается политика поддержки Майкрософт при использовании сторонних обходов с SQL Server и проблемы, которые могут возникнуть при их использовании.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 920925

Сводка

Служба поддержки Майкрософт столкнулась с многочисленными сторонними продуктами, которые используют обходы для предоставления дополнительных функций SQL Server. Обычно это функции аудита. Процесс сертификации для обходов сторонних поставщиков для приложений Майкрософт не существует. Поэтому, как правило, корпорация Майкрософт настоятельно не рекомендует использовать объезды.

Функции, использующие обходы или аналогичные методы для изменения поведения SQL Server, могут вызвать следующие проблемы:

  • Проблемы с производительностью.
  • Неверные результаты.
  • Повреждение диска и памяти.
  • Потеря ответа SQL Server.
  • Непредвиденное завершение процесса.
  • Невозможность использовать стандартную диагностику, например функцию fn_get_sql и DBCC INPUTBUFFER команду.
  • 100-процентная загрузка ЦП и длительное восстановление базы данных при использовании таблиц OLTP в памяти в SQL Server.

Эти же проблемы могут возникнуть при использовании программного обеспечения сторонних разработчиков, например связанных серверов, расширенных процедур или объектов COM в процессе SQL Server. Объезды скрыты от представления DBA. Чтобы обнаружить объезд, необходимо использовать методы, описанные в разделе Дополнительные сведения ниже. Связанные серверы, COM-объекты и расширенные процедуры имеют явную регистрацию и определенные интерфейсы.

Примечание.

Из-за скрытого характера объездов и отсутствия опубликованных интерфейсов корпорация Майкрософт не предоставляет службы поддержки для сторонних функций, использующих обходы или аналогичные методы. Третья сторона отвечает за поддержку собственного кода так же, как она отвечает за собственный связанный сервер или другое санкционированное развертывание.

В обычном процессе устранения неполадок службы поддержки Майкрософт обычно обращаются к вам с просьбой отключить несуществующие задания, а также отключить или удалить сторонние компоненты и другие аналогичные методы. Корпорация Майкрософт всегда пытается уменьшить масштабы проблемы, пока она выявляет проблему. После того как проблема будет определена как не связанная с заданиями или сторонними продуктами, эти задания или сторонние продукты могут быть возвращены в производство.

Мы не намерены обнаруживать обход, а затем считать экземпляр SQL Server неподдерживаемым. Корпорация Майкрософт признает, что некоторые реализации необходимы. Однако корпорация Майкрософт требует, чтобы вы проверили поддержку обходов. Объезд от авторитетной и надежной компании определенно отличается от неожиданного объезда, который используется вирусом. Корпорация Майкрософт не гарантирует и не сертифицировать эти сторонние продукты, а также то, как сторонние продукты взаимодействуют с продуктами и службами Майкрософт. Вместо этого сторонние поставщики несут ответственность за идентификацию и надежность своих продуктов и служб. Если у вас возникли вопросы о сторонних продуктах и услугах, обратитесь к соответствующей третьей стороне. Корпорация Майкрософт не несет ответственности за любые проблемы, вызванные использованием сторонних продуктов или служб в связи с SQL Server.

Дополнительная информация

Обходные обходы обеспечивают расширенные возможности и компромисс между рисками и вознаграждениями. Как правило, при реализации обхода в SQL Server в пространство процесса внедряется сторонний код. Это действие может изменить поведение SQL Server.

Ниже приведены некоторые примеры ситуаций и возможные побочные эффекты.

  • Пакеты входящего сетевого трафика (TDS) сканируются и изменяются. Обход добавляется в критическом расположении в потоке сетевого процесса net_readdata. Даже 100 циклов ЦП в этом расположении могут значительно снизить пропускную способность пакетной обработки.

    Изменение фактических данных TDS может привести к постижовки памяти. Эта проблема вызвала различные проблемы стабильности SQL Server и повреждение данных. Проблемы могут привести к частичному изменению пакета TDS и воспроизведению мусора в SQL Server. Средства ведения журнала на этом уровне могут предоставлять пароли и другие конфиденциальные данные, которые трассировка SQL Server предназначена для подавления и защиты.

  • Процедуры синтаксического анализа SQL Server объедены для изменения поведения. Ниже приведены возможные побочные эффекты:

    • Планы выполнения не соответствуют фактическому тексту запроса.
    • Команда отправляется от клиента только один раз. Однако команда выполняется несколько раз.
    • В выходных данных трассировки вместо измененного запроса отображается исходная команда.
    • Команда DBCC INPUTBUFFER отображает исходную команду вместо измененного запроса.
    • Функция fn_get_sql отображает неверные данные. Кроме того, функция подвержена fn_get_sql исключениям и неверным результатам. Эта fn_get_sql функция используется многими решениями мониторинга и может вызвать проблемы в решениях мониторинга.
    • Общее планирование планировщика пользовательского режима (UMS) и операционной системы SQL Server (SQLOS) может быть прервано. Это приводит к потере ответа SQL Server, изменению производительности и сбоям.
  • Интерфейсы API Win32, предоставляющие расширенные функции безопасности, обходятся. В зависимости от реализации средства ведения журнала на этом уровне могут предоставлять пароли и другие конфиденциальные данные. Общее планирование UMS и SQLOS прерывается. Это приводит к потере ответа SQL Server и сбоям.

  • Изменение таблиц функций и перенаправление основных функций SQL Server или API Windows не поддерживаются в процессе SQL Server. Это может привести к нестабильности и непредвиденному поведению в функциональных возможностях SQL Server.

В следующем примере показано, что kernel32!GetQueuedCompletionStatus функция была объехна.

MyDLL!MyGetQueuedCompletionStatus
ssnetlib!ConnectionReadAsyncWait

В сборке GetQueuedCompletionStatus для функции первая инструкция была заменена инструкцией перехода.

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

Сборка для внедренного кода показывает действие обхода и вызов файла 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]

Вы можете использовать средства отладки для Windows, чтобы определить, используются ли объезды. Для этого выполните указанные ниже действия.

Примечание.

Всегда проверяйте этот метод, прежде чем использовать его в рабочей среде. При использовании средств отладки для Windows процесс может зависнуть при выполнении команд. Такое поведение может негативно повлиять на рабочий сервер.

  1. Подключите средства отладки для Windows к SQL Server или загрузите полный файл дампа пользователя.

  2. Выполните следующую команду отладчика. Эта команда проверяет каждый образ на диске, чтобы определить, были ли внедрены обходные обходы.

    !for_each_module "!chkimg -v @#Base -d"
    
  3. Отсоедините отладчик.

Если изображение в памяти было изменено, выходные данные могут выглядеть следующим образом:

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)

Вы можете просмотреть сборку, чтобы более подробно рассмотреть проблему следующим образом:

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

Антивирусные программы, отслеживающие атаки путем внедрения кода SQL, могут объездить код SQL Server. В этом сценарии выходные данные !for_each_module "!chkimg -v @#Base -d" расширения могут показать, что SQL Server работает yyparse и ex_raise2 изменяется:

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

Мы рекомендуем обратиться к поставщику объездов или аналогичных методов для получения подробных сведений о том, как он использует объезды в SQL Server. Дополнительные сведения об объездах и аналогичных методах см. в разделе Объезд.