우회 또는 유사한 기술로 인해 SQL Server 예기치 않은 동작이 발생할 수 있습니다.

이 문서에서는 SQL Server 타사 우회를 사용하는 경우의 Microsoft 지원 정책과 사용할 때 발생할 수 있는 문제에 대해 설명합니다.

원래 제품 버전: SQL Server
원래 KB 번호: 920925

요약

Microsoft 지원에서 우회를 사용하여 SQL Server 추가 기능을 제공하는 수많은 타사 제품이 발견되었습니다. 일반적으로 감사 기능입니다. Microsoft 애플리케이션에 대한 타사 우회에 대한 인증 프로세스는 없습니다. 따라서 일반적으로 Microsoft는 우회 사용을 강력히 권장하지 않습니다.

우회 또는 유사한 기술을 사용하여 SQL Server 동작을 변경하는 기능은 다음과 같은 문제를 일으킬 수 있습니다.

  • 성능 문제.
  • 잘못된 결과입니다.
  • 디스크 및 메모리 손상.
  • SQL Server 응답 손실.
  • 예기치 않은 프로세스 종료.
  • fn_get_sql 함수 및 명령과 같은 표준 진단 사용할 수 DBCC INPUTBUFFER 없음
  • SQL Server 메모리 내 OLTP 테이블을 사용하는 경우 100% CPU 사용률 및 긴 데이터베이스 복구 시간.

SQL Server 프로세스 내에서 연결된 서버, 확장 프로시저 또는 COM 개체와 같은 비 Microsoft 소프트웨어를 사용하는 경우 이와 동일한 문제가 발생할 수 있습니다. 우회는 DBA 보기에서 숨겨집니다. 우회를 발견하려면 다음 추가 정보 섹션에 설명된 기술을 사용해야 합니다. 연결된 서버, COM 개체 및 확장 프로시저에는 명시적 등록 및 정의된 인터페이스가 있습니다.

참고

우회의 숨겨진 특성과 게시된 인터페이스의 부족으로 인해 Microsoft는 우회 또는 유사한 기술을 사용하는 타사 기능에 대한 지원 서비스를 제공하지 않습니다. 제3자는 자체 연결된 서버 또는 기타 승인된 배포를 담당하는 것처럼 자체 코드를 지원할 책임이 있습니다.

일반적인 문제 해결 과정에서 Microsoft 지원 서비스에서 중요하지 않은 작업을 사용하지 않도록 설정하고 타사 구성 요소 및 기타 유사한 기술을 사용하지 않도록 설정하거나 제거하도록 요청하는 것이 일반적입니다. Microsoft는 문제를 식별하는 동안 항상 문제의 공간을 줄이려고 노력합니다. 문제가 작업 또는 타사 제품과 관련이 없는 것으로 확인되면 해당 작업 또는 타사 제품이 다시 생산에 도입될 수 있습니다.

우회를 폭로한 다음 SQL Server instance 지원하지 않는 것으로 간주하려는 의도는 아닙니다. Microsoft는 일부 구현이 필요하다는 것을 인정합니다. 그러나 Microsoft에서는 우회의 지원 가능성의 유효성을 검사해야 합니다. 평판이 적이고 신뢰할 수있는 회사에서 우회하는 것은 바이러스에 의해 사용되는 예기치 않은 우회와 확실히 다릅니다. Microsoft는 이러한 타사 제품 또는 타사 제품이 Microsoft 제품 및 서비스와 상호 작용하는 방식을 보증하거나 인증하지 않습니다. 대신 타사 공급업체는 제품 및 서비스의 식별 및 신뢰성을 책임집니다. 타사 제품 및 서비스에 대한 질문이 있는 경우 해당 타사에 문의하세요. Microsoft는 SQL Server 관련하여 타사 제품 또는 서비스 사용으로 인해 발생하는 문제에 대해 책임을 지지 않습니다.

추가 정보

우회는 향상된 기능과 위험/보상 절충을 제공합니다. 일반적으로 우회가 SQL Server 구현되면 타사 코드가 프로세스 공간에 삽입됩니다. 이 활동은 SQL Server 동작을 변경할 수 있습니다.

다음은 몇 가지 예제 상황 및 가능한 부작용입니다.

  • 들어오는 TDS(네트워크 트래픽) 패킷이 검사되고 변경됩니다. 우회는 net_readdata 네트워크 프로세스 스레드의 중요한 위치에 추가됩니다. 이 위치에서 100개의 CPU 주기도 일괄 처리량 처리량을 크게 줄일 수 있습니다.

    실제 TDS 데이터가 변경되면 메모리 낙서가 발생할 수 있습니다. 이 문제로 인해 다양한 SQL Server 안정성 문제와 데이터 손상이 발생했습니다. 문제로 인해 TDS 패킷이 부분적으로 변경되고 가비지 재생이 SQL Server 수 있습니다. 이 수준의 로깅 기능은 SQL Server 추적이 억제하고 보안을 위해 설계된 암호 및 기타 중요한 데이터를 노출할 수 있습니다.

  • SQL Server 구문 분석 루틴은 동작을 변경하기 위해 우회됩니다. 다음과 같은 부작용이 발생할 수 있습니다.

    • 실행 계획이 실제 쿼리 텍스트와 일치하지 않습니다.
    • 명령은 클라이언트에서 한 번만 제출됩니다. 그러나 명령은 여러 번 실행됩니다.
    • 추적 출력은 변경된 쿼리 대신 원래 명령을 표시합니다.
    • 명령은 DBCC INPUTBUFFER 변경된 쿼리 대신 원래 명령을 표시합니다.
    • 함수에 fn_get_sql 잘못된 데이터가 표시됩니다. 또한 함수는 fn_get_sql 예외 및 잘못된 결과에 취약합니다. 이 fn_get_sql 함수는 많은 모니터링 솔루션에서 사용되며 모니터링 솔루션에 문제가 발생할 수 있습니다.
    • 전체 UMS(사용자 모드 스케줄러) 및 SQLOS(SQL Server 운영 체제) 예약이 중단될 수 있습니다. 이로 인해 SQL Server 응답이 손실되고 성능이 변경되고 중단됩니다.
  • 향상된 보안 기능을 제공하는 Win32 API는 우회됩니다. 구현에 따라 이 수준의 로깅 기능은 암호 및 기타 중요한 데이터를 노출할 수 있습니다. 전체 UMS 및 SQLOS 예약이 중단됩니다. 이로 인해 SQL Server 응답이 손실되고 가동이 중단됩니다.

  • 함수 테이블 수정 및 핵심 SQL Server 함수 또는 Windows API의 리디렉션은 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 함수 및 ex_raise2 가 수정됨을 표시할 수 있습니다.yyparse

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. 우회 및 유사한 기술에 대한 자세한 내용은 우회를 참조하세요.