概要

Microsoft 支持部门遇到了众多第三方产品用迂回的方式来向 Microsoft SQL Server 中提供其他功能。这些通常审核功能。没有认证进程的第三方迂回的 Microsoft 应用程序的方式。因此,一般情况下,Microsoft 强烈不鼓励使用迂回的方式。

功能,用迂回的方式或类似的技术来更改 SQL Server 的行为可能会引起下列问题︰

  • 性能问题

  • 不正确的结果

  • 磁盘和内存损坏

  • SQL Server 响应的损失

  • 进程意外的终止

  • 不能使用标准诊断,如fn_get_sql函数和DBCC INPUTBUFFER命令

  • 100%的 CPU 使用率和在 SQL Server 中使用内存中的 OLTP 表时的长时间数据库恢复时间

使用非 Microsoft 软件如链接的服务器、 扩展的过程或在 SQL Server 进程内的 COM 对象时,可能会遇到同样的问题。从 DBA 视图隐藏迂回的方式。揭示 detour,必须使用在"更多信息"一节中介绍的技术。链接的服务器、 COM 对象和扩展的过程具有显式注册并定义接口。

注意:由于迂回的方式隐藏的性质和缺少的已发布接口,Microsoft 不提供对第三方功能,用迂回的方式或类似的技术支持服务。第三方负责支持的代码,就像它有责任自己链接服务器或其他认可部署。

它是常见的做法,在 Microsoft 支持服务,让您可以禁用不必要的作业以及禁用或删除第三方组件和其他类似的技术用于故障诊断的常规课程。Microsoft 始终尝试减少问题的足迹时发现问题。该问题确定为后与作业或第三方产品无关,这些作业或第三方产品可能会引入回生产。

它不是我们想要发现 detour,然后考虑的是不受支持的 SQL Server 实例。Microsoft 承认某些实现是必要的。但是,Microsoft 要求您验证支持性迂回的方式。来自著名和受信任公司 detour 与所使用的病毒意外 detour 肯定不同。Microsoft 不保证,也证明这些第三方产品或与 Microsoft 产品和服务的第三方产品的交互方式。相反,第三方供应商负责的标识和可信赖的他们的产品和服务。如果您有第三方产品和服务有任何疑问,请访问的适用的第三方。Microsoft 不承担任何责任的任何问题,由您使用第三方产品或服务发送 SQL Server。

详细信息

迂回的方式提供了增强的功能和风险/回报权衡。通常情况下,当在 SQL Server 中实现 detour 时,第三方代码被注入进程空间。此活动可能会更改 SQL Server 的行为。

下面是一些示例情况和可能的副作用︰

  • 扫描并更改传入网络通信量 (TDS) 数据包。在 net_readdata 网络进程线程的某个关键位置添加 detour。在此位置甚至 100 个 CPU 周期可显著地减少批处理吞吐率。

    实际的 TDS 数据中的更改可能会导致内存 scribblers。此问题已触发各种 SQL Server 稳定性问题和数据损坏。问题可能会导致部分更改,并重播到 SQL Server 的垃圾的 TDS 数据包。记录在此级别的设备可能会公开密码和其他敏感数据跟踪旨在抑制并帮助保护该 SQL Server。

  • SQL Server 分析例程被 detoured 更改行为。可能的副作用如下︰

    • 执行计划与实际查询文本不匹配。

    • 一次只能从客户端提交命令。但是,命令执行多次。

    • 跟踪输出显示原始的命令,而不是更改后的查询。

    • DBCC INPUTBUFFER 命令会显示原始的命令,而不是更改后的查询。

    • Fn_get_sql函数显示不正确的数据。此外, fn_get_sql函数是容易对异常和不正确的结果。Fn_get_sql函数由许多监控解决方案,监视解决方案可能会造成问题。

    • 整体用户模式计划 (UMS) 和 SQL Server 操作系统 (SQLOS) 计划可能会中断。这就导致 SQL Server 响应丢失、 性能变化和停机。

  • Detoured 是 Win32 Api,提供了增强的安全功能。根据实现,在此级别的日志记录工具可能暴露的密码和其他敏感数据。 总体 UMS 和 SQLOS 计划被中断。这样就可以对 SQL Server 响应丢失和中断。

  • 修改函数表和重定向核心 SQL Server 功能或 Windows API 不支持 SQL Server 进程内。在 SQL Server 功能,这可能导致不稳定和意外的行为。

下面的示例演示kernel32 !GetQueuedCompletionStatus被 detoured 函数。

MyDLL!MyGetQueuedCompletionStatusssnetlib!ConnectionReadAsyncWait

在GetQueuedCompletionStatus函数的程序集,与跳转指令已更换的第一个指令。

0:038> u kernel32!GetQueuedCompletionStatuskernel32!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

插入的代码的程序集显示 detoured 的活动和对 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. 分离调试程序。

要获取 Windows 调试工具,请访问下面的 Microsoft 网站︰

http://www.microsoft.com/whdc/devtools/debugging/default.mspx如果在内存中的映像已被更改,则输出可能如下所示︰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!ConnectionClosessnetlib!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 中使用迂回的方式的详细信息。有关迂回的方式和类似技术的详细信息,请访问以下 Microsoft 研究中心网站︰

http://research.microsoft.com/sn/detours

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×