보안 이슈

AhnLab 보안 전문가의 심층분석! 보안 이슈 정보를 전해드립니다.

SMB고스트, 발생 원인과 공격 과정 ‘집중 분석’

  • Facebook에 공유하실 수
    있습니다.

  • Twitter에 공유하실 수
    있습니다.

  • Linked in

    Linked in에 공유하실 수
    있습니다.

  • 붙여넣기

    블로그나 게시판에 붙여넣기 하실
    수 있습니다.

  • AhnLab
  • 2020-11-02
2020년 3월 12일, Microsoft가 긴급 업데이트를 통해 취약점 패치를 제공했다. 이 취약점이 코로나블루(CoronaBlue) 또는 SMB고스트(SMBGhost)로 불리는 CVE-2020-0796이다. 발표 당시 치명적인 위협으로 간주되었으며, 일부에서는 ‘제 2의 워너크라이 사태’가 발생할 수 있다고 우려하기도 했다. 또한 2020년 4월 레몬덕(Lemonduck) 악성코드에 이 취약점을 스캔하는 코드가 추가되기도 했으며, 악성코드 전파를 위해 최근까지 지속적으로 사용되고 있다. 

이 글에서는 CVE-2020-0796 취약점 발생 원인과 공격 과정, 취약점 패치, 탐지, 조치 방법에 대해 설명하고자 한다. 



CVE-2020-0796 취약점은 Microsoft SMB 3.1.1 (SMBV3) 프로토콜에서 압축된 메시지를 처리하는 Srv2!Srv2DecompressData 함수 내부에서 OriginalSize와 Offset을 처리하는 과정에 정수 오버플로우(Integer Overflow)가 발생하는 취약점이다. 취약점을 통해 시스템 장애 및 권한 상승, 원격 코드 실행이 가능하다. 해당 취약점은 2020년 3월 12일 패치를 통해 제거되었다.

영향 받는 버전
● Windows 10 Version 1903 for 32-bit Systems
Windows 10 Version 1903 for ARM64-based Systems
Windows 10 Version 1903 for x64-based Systems
Windows 10 Version 1909 for 32-bit Systems
Windows 10 Version 1909 for ARM64-based Systems
Windows 10 Version 19039 for x64-based Systems
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)

취약점 발생 원인
SMB2 COMPRESSION_TRANSFORM_HEADER는 통신 시 압축된 메시지를 보낼 때 사용되는 헤더이다. 해당 헤더는 Windows10 1809 이후 버전인 SMB 3.1.1부터 적용된다.

 
[그림 1] SMB2 COMPRESSION_TRANSFORM_HEADER

CVE-2020-0796 취약점은 조작된 SMB2_COMPRESSION_TRANSFORM_HEADER 패킷을 처리할 때, srv2!Srv2DecompressData 함수에서 압축 해제 루틴을 처리하게 되는데 헤더에 존재하는 Originalsize + Offset 값이 0Xffffffff를 넘어가게 되면 정수 오버플로우(Integer Overflow) 취약점에 의해 비정상적인 메모리 공간이 할당되는 취약점이다.

서버와 네고시에이트(Negotiate) 통신을 통해 세션을 생성하고 SMB2 COMPRESSION_TRANSFORM_HEADER의 OriginalSize + Offset이 0Xffffffff보다 큰 데이터로 조작한다. 조작된 패킷을 서버로 전송한다.
 

[그림 2] 조작된 패킷 전송

Srv2!Srv2DecompressData 함수 내부에서 압축 해제 과정을 수행하게 되는데 압축 해제한 데이터를 삽입하기 위한 메모리 공간을 srvnet!SrvNetAllocateBuffer 함수를 통해 할당한다. 인자값으로 OriginalSize+Offset 값을 사용하게 되는데 이때, 정수 오버플로우(Integer Overflow)에 의해 할당되어야 하는 크기보다 작은 크기의 메모리 공간이 할당된다. 

메모리 공간 할당에 관한 루틴은 이후 공격 과정에서 자세히 설명한다.
 

[그림 3] SrvNetAllocateBuffer를 통한 공간 할당


[표 1] 정수 오버플로우(Integer Overflow) 취약점 발생

메모리 공간 할당 이후 srv2!SmbCompressionDecompress 함수를 통해 압축 해제를 수행한다. 클라이언트(Client)로부터 받은 패킷에 설정된 압축 알고리즘에 따라 압축 해제를 수행한다. 



[그림 4] 압축 해제 함수 호출 코드

압축 해제 과정은 다음과 같다. OriginalSize+Offset 인자값에 따라 메모리 공간을 할당한다.  Header+Offset 위치에 있는 압축된 데이터를 CompressionAlgorithm에 따라 설정된 알고리즘으로 압축 해제 후 할당된 메모리의 버퍼(Buffer) 영역에 복사한다.


[그림 5] SmbCompressionDecompress 과정

취약점 공격을 위해 OriginalSize+Offset이 0xffffffff 값보다 큰 데이터로 제작된 패킷을 처리하게 되면 내부에서 정수 오버플로우(Integer Overflow) 취약점이 발생해 압축 해제된 데이터보다 작은 크기의 공간이 할당된다. 이후, srv2!SmbCompressionDecompress을 통해 압축 해제 과정을 수행하게 되는데 Offset을 통해 압축된 데이터의 위치를 확인한다. 하지만, 비정상적인 Offset을 통해 할당되지 않은 메모리를 가리키게 되면서 액세스 바이얼레이션(Access Violation)이 발생하게 된다. 

[그림 6] 정수 오버플로우(Integer Overflow) 도식화


[표 2] 액세스 바이얼레이션(Access Violation) 발생

취약점 공격 과정
CVE-2020-0796 취약점을 사용한 공개된 POC 코드를 통해 분석을 진행한다. 취약점을 통해 다음과 같은 공격이 가능하다.
● LPE (Local Privilege Escalation)
RCE (Remote Command Execution)

로컬 환경에서 취약점 공격을 통해 토큰을 조작해서 관리자 권한을 획득할 수 있는 LPE(Local Privilege Escalation)를 수행할 수 있고, 조작된 패킷을 보내 공격 대상의 시스템에서 임의의 명령을 수행할 수 있는 RCE(Remote Command Execution)를 수행할 수 있다.
 
LPE (Local Privilege Escalation)
공개된 POC 코드를 통해 LPE 공격에 대한 분석을 진행한다. 로컬 시스템에서 취약점 공격을 통해 관리자 권한을 획득할 수 있는 LPE는 다음과 같은 방식을 통해 수행된다. 현재 프로세스의 토큰 주소를 획득하고 해당 주소를 조작된 패킷에 삽입해 전송한다. 전송된 패킷을 통해 취약점을 공격하고 현재 프로세스의 토큰을 시스템(SYSTEM) 프로세스의 토큰으로 변경해 관리자 권한을 획득한다. 이후 인젝션을 통해 쉘코드를 실행한다.


[그림 7] LPE 공격 과정

취약점 공격을 위한 패킷을 제작한다. SMB2 COMPRESSION_TRANSFORM_HEADER에서 Offset 다음 부분에 SYSTEM 프로세스 토큰+0x40의 데이터를 삽입하고 더미 데이터 + 현재 프로세스의 토큰+0x40의 주소를 압축한 데이터를 삽입해 제작한 패킷을 전송한다.

 
[그림 8] 조작된 패킷 전송

전송된 패킷을 Srv2!Srv2DecompressData 함수에서 OriginalSize+Offset을 인자로 메모리 공간을 할당하기 위한 srvnet!SrvNetAllocateBuffer 함수를 호출한다. 이때, 정수 오버플로우(Integer Overflow)를 통해 비정상적인 값이 인자로 사용된다.



[그림 9] 정수 오버플로우(Integer Overflow)를 통한 메모리 공간 할당

srvnet!SrvNetAllocateBuffer 함수는 다음과 같이 공간을 할당한다. 인자값으로 사용된 패킷의 OriginalSize+Offset 값에 따라 SrvNetBufferLookasides를 참조해 사이즈(Size)를 가져온다. 이때, 정수 오버플로우(Integer Overflow)에 의해 원래 크기보다 작은 값을 인자값으로 사용해 가장 작은 사이즈(Size)인 0x1100을 가져온다. 이후, srvnet!SrvNetAllocateBufferFromPool 함수를 통해 풀(Pool) 메모리를 할당한다.

[그림 10] 메모리 공간 할당 과정

할당된 풀(Pool) 메모리는 다음과 같은 구조를 가지고 있다. 압축 해제된 데이터가 복사되는 버퍼(Buffer)와 메모리 할당에 관련 헤더 부분들로 구성되어 있다. BufferSize+0x68 부분에 존재하는 P버퍼(PBuffer) 부분은 버퍼(Buffer)의 주소값을 가지고 있다.


[그림 11] 할당된 메모리 공간 구조

조작된 패킷을 통해 정수 오버플로우(Integer Overflow) 취약점을 발생시키고 압축된 데이터보다 작은 메모리 공간을 할당한다. 이후, 압축 해제를 통해 버퍼 오버플로우를 발생시켜 P버퍼(PBuffer) 부분을 현재 프로세스의 Token+0x40 값으로 덮어쓴다.


[그림 12] PBuffer 변조 과정



[표 3] 변조된 PBuffer 메모리 비교

압축 해제 과정 이후, 전송된 패킷의 Offset과 압축된 데이터 사이에 데이터가 존재할 때, memcpy를 통해 풀(Pool) 메모리의 P버퍼(PBuffer)를 참조해 버퍼의 시작 부분에 데이터를 해당 데이터를 복사한다.


[그림 13] 메모리 복사 코드

풀(Pool) 메모리의 P버퍼(PBuffer)는 현재 프로세스의 토큰+0x40 주소로 변조되고, 로우 데이터(Raw Data) 부분에 시스템 프로세스 토큰+0x40의 값이 삽입되어 있기 때문에 memcpy를 통해 현재 프로세스 토큰+0x40은 프로세스 토큰+0x40 값으로 변조된다.


[그림 14] 권한 상승 과정 도식화


[표 4] 변조된 토큰 비교

현재 프로세스의 토큰+0x40을 변조 후 프로세스의 권한을 확인해 보면 [표 5]와 같이 다양한 권한이 설정된 것을 확인할 수 있으며, 쉘코드를 통해 실행된 cmd.exe가 관리자 권한으로 실행되며 LPE(Local Privilege Escalation)가 수행된 것을 확인할 수 있다.
 

[표 5] 권한 상승 후 프로세스 권한 비교

 
[그림 15] 관리자 권한을 통한 cmd.exe 실행

RCE (Remote Command Execution)
공개된 POC 코드를 통해 RCE(Remote Command Execution) 공격에 대한 분석을 진행한다. 조작된 패킷을 보내 원격으로 임의의 명령을 실행시킬 수 있는 RCE 공격 과정은 다음과 같다. 먼저, 물리 메모리를 읽어 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry) 주소와 HAL 힙(Heap) 주소를 찾는다. 이후 찾은 HAL 힙(Heap) 주소를 통해 HalpApicRequestInterrupt 주소를 찾는다. 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry)를 통해 PTE 주소를 찾아 NX 비트(bit)를 변조한다. KUSER_SHARED_DATA 주소에 쉘코드를 삽입하고 삽입한 쉘코드 주소로 HapApicRequestInterrrupt 주소로 변경 후 쉘코드가 실행된다. 


[그림 16] RCE 공격 과정

RCE 과정에 대해 설명하기 전 라이트 프리미티브(Write Primitive)와 리드 프리미티브(Read Primitive)에 대해 설명한다.

1) 라이트 프리미티브(Write Primitive)
라이트 프리미티브(Write Primitive)는 임의의 메모리 주소에 원하는 값을 삽입하기 위한 방법이다. LPE에서 토큰 값을 변조하기 위해 사용했던 방법이 그대로 사용된다.

취약점을 통해 조작할 메모리 주소로 풀(Pool) 메모리의 P버퍼(PBuffer) 부분을 변경한다.


[그림 17] P버퍼(Buffer) 조작 과정

압축 해제 과정 이후 memcpy를 통해 P버퍼(Buffer)에 삽입되어 있는 주소로 로우 데이터(Raw Data)를 복사하게 되므로 임의의 주소에 원하는 데이터를 삽입할 수 있다.


[그림 18] 라이트 프리미티브(Write Primitive)를 통한 메모리 변조

2) 리드 프리미티브(Read Primitive)
리드 프리미티브(Read Primitive)는 임의의 물리 메모리 주소를 읽기 위한 방법이다. 라이트 프리미티브(Write Primitive)를 통해 페이크(Fake) MDL을 삽입하고 풀(Pool) 메모리의 PMDL을 조작해 페이크(Fake) MDL 주소로 변경한다. 이후 네고시에트(Negotiate) 패킷을 리퀘스트(Request)를 하게 되면 정상적인 응답(Response)이 아닌 물리 메모리의 데이터를 전송해 임의의 물리 메모리를 읽을 수 있다.


[그림 19] 리드 프리미티브(Read Primitive) 과정

페이크(Fake) MDL을 생성해 임의의 물리 메모리의 주소로 설정하고 풀(Pool) 메모리의 PMDL을 페이크(Fake) MDL 주소로 변경하게 되면 네고시에이트(Negotiate) 패킷의 응답(Response)을 수행할 때, tcp.sys를 통해 페이크(Fake) MDL을 참조하게 되고 설정한 임의의 물리 메모리 데이터를 전송한다. 


[표 6] MDL 구조

KUSER_SHARED_DATA는 고정적인 메모리 주소를 가지고 있기 때문에 라이트 프리미티브(Write Primitive)를 통해 KUSER_SHARED_DATA + 0x900 주소에 페이크(Fake) MDL을 삽입한다.


[그림 20] 페이크(Fake) MDL 삽입 도식화

기존의 버퍼 오버플로우(Buffer Overflow)를 통해 PMDL을 변조하게 되면 P버퍼(PBuffer)까지 변조되기 때문에 압축 해제 이후 memcpy를 통해 할당되지 않은 메모리에 접근해 액세스 바이얼레이션(Access Violation)이 발생하거나 비정상적인 값을 복사해 에러가 발생할 수 있다.

PMDL 부분만 변조하기 위해 Offset을 PMDL 위치로 조작하고 압축 데이터(Compressed Data) 영역에 데이터를 KUSER_SHARED_DATA + 0x900 주소를 압축하고 이후 압축되지 않은 0x1337 데이터를 삽입한다. 해당 패킷의 압축 해제 과정을 수행하게 되면 PMDL 영역부터 압축 해제된 데이터가 복사되면서 PMDL을 KUSER_SHARED_DATA + 0x900 주소로 덮어쓴 후 0x1337 데이터 때문에 압축 해제에 실패하게 되면서 PMDL 영역만 조작할 수 있다. 


[그림 21] PMDL 변조

PMDL 오버라이트(Overwrite) 이후 압축 해제에 실패하게 되면 할당된 메모리의 올로케이션 헤더(Allocation Header)의 주소 값을 인자로 SrvNetFreeBuffer 함수가 호출된다.


[그림 22] SrvNetFreeBuffer 호출 코드

[그림 23]은 SrvNetAllocateBuffer에서 풀(Pool) 메모리를 할당하기 위해 참조했던 SrvNetBufferLookasides의 구조를 간단하게 표현한 것이다.

SrvNetBufferLookasides는 사이즈(Size) 별로 룩어사이드(Lookaside)를 관리하고 있다. 룩어사이드(Lookaside)는 GENERAL_LOOKASIDE_POOL 구조를 가지고 있으며, 풀(Pool) 메모리를 할당하거나 해제할 때 리스트헤드(ListHead) 부분을 참조한다. 풀(Pool) 메모리 공간을 할당할 때, 리스트헤드(ListHead)에 저장된 메모리가 존재할 시 ExpInterlockedPopEntrySList를 통해 가져온다. 풀(Pool) 메모리 공간을 해제할 때 ExpInterlockedPushEntrySList를 통해 메모리를 리스트헤드(ListHead)에 저장하며 메모리 관리를 한다.


[그림 23] SrvNetBufferLookasides 구조

압축 해제 실패 이후 SrvNetFreeBuffer 함수에서 초기화 과정을 수행하는데 풀(Pool) 메모리의 PMDL1에 대한 초기화를 수행하지 않는다. 페이크(Fake) MDL의 주소로 조작되어 있는 PMDL1이 초기화되지 않은 상태로 ExpInterlockedPushEntrySList를 통해 룩어사이드(Lookaside)의 리스트헤드(ListHead)에 저장된다. 이후, 네고시에이트 응답(Negotiate Response) 과정을 위해 Smb2ExecuteNegotiateReal 함수가 호출되며, 메모리 공간 할당을 위해 srv2AllocateResponseBuffer 함수가 호출된다. 룩어사이드(Lookaside)의 리스트헤드(ListHead) 부분을 확인하고 ExpInterlockedPopEntrySList를 통해 할당 해제된 메모리 공간을 불러오게 되는데 PMDL1이 페이크(Fake) MDL 주소로 되어 있기 때문에 tcp.sys를 통해 임의의 물리 메모리 주소를 읽어 전송하게 된다.


[그림 24] 메모리 재사용 도식화


[그림 25] 페이크 MDL 조작을 통한 물리 메모리 데이터 전송

3) RCE 공격 과정
RCE(Remote Command Execution) 공격 과정에서 사용될 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry)와 HAL 힙(Heap)의 베이스 어드레스(Base Address)를 얻기 위한 과정을 수행한다. HAL 힙(HAL Heap)에 존재하는 HalPLowStub는 _PROCESSOR_START_BLOCK 구조를 가지고 있다. 해당 구조에 KPROCESSOR_STATE에 SpecialRegisters 부분에 CR3 레지스터 값이 존재한다.


[그림 26] _PROCESSOR_START_BLOCK

리드 프리미티브(Read Primitive)를 통해 0x10000부터 물리 메모리를 읽으며, JMP 연산 부호(Opcode)를 찾은 뒤 0x78 Offset에 존재하는 HalPLowStub 가상 주소를 구한다. HalPLowStub 가상 주소 & 0xFFFFFFFFF0 000000 를 통해 HAL 힙 베이스 어드레스(HAL Heap Base Address)를 찾는다. 0xA0 Offset에 CR3 레지스터 값이 존재해 PML4 값을 찾는다.


[표 7] HalpLowStub


[그림 27] HAL 힙 베이스 어드레스(HAL Heap Base Address) PML4 데이터 확인

셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry)를 찾기 위해 다음과 같은 과정을 수행한다. PML4의 주소값의 물리 메모리를 읽으며 PML4 엔트리(Entry) 부분을 찾는다. PML4 Entry & 0xffff00 값이 PML4 값과 같은 값을 가지고 있는 주소값을 구한다. 구한 주소값을 0xfff와 And 연산을 수행하고 >>3 연산을 수행하게 되면 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry)를 구할 수 있다.


[그림 28] 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry) 검색

Hal!HalpApicrequestInterrupt 함수의 주소가 저장된 주소를 찾기 위해 다음과 같은 과정을 수행한다. HAL 힙 베이스 어드레스(HAL Heap Base Address)의 물리 메모리 주소의 데이터를 읽어 HalInterruptControler Table을 찾기 위해 HAL 함수 주소인 0xfffff80000000000 영역의 주소가 4개 연속으로 존재하는 주소값을 찾는다. 최종적으로 5번째 HAL 함수 주소가 존재하는 Index + 0x38 + HAL 힙 베이스 어드레스(HAL Heap Base Address)의 값이 hal!HalApicRequestInterrupt 함수의 주소값을 가지고 있는 주소이다.


[그림 29] HalApicRequestInterrupt 주소 검색

KUSER_SHARED_DATA에 쉘코드를 복사 후 실행하기 위해 KUSER_SHARED_DATA의 PTE의 값을 변조한다. PTE의 NX 비트(Bit)를 설정하기 위해 64비트의 값을 0으로 변조한다. 셀프-레퍼런스(Self-Reference) PML4 엔트리(Entry)와 KUSER_SHARED_DATA를 연산을 통해 PTE 주소를 구할 수 있다.


[그림 30] PTE 오버라이트(Overwrite) 과정

MiGetPteAddress 함수를 통해 PTE 가상 주소를 구하는 코드를 확인할 수 있다.

[그림 30]은 메모리 주소와 PTE 베이스 어드레스(Base Address)를 통해 PTE 주소를 구하는 루틴이다. PTE 베이스 어드레스(Base Address)는 셀프-레퍼런스(Self Reference) PML4E 연산을 통해 구할 수 있다. KUSER_SHARED_DATA의 PTE 주소를 구해서 리드 프리미티브(Read Primitive)를 통해 메모리를 읽어온다. PTE 값을 읽어온 후 NX 비트를 설정한 값을 덮어쓴다.


[표 8] MiGetPteAddress


[그림 31] PTE 주소 계산 코드


[표 9] 변조된 PTE 비교

라이트 프리미티브(Write Primitive)를 통해 KUSER_SHARED_DATA + 0x950 주소에 커널 쉘코드를 삽입한다.


[그림 32] 커널 쉘코드 삽입

KUSER_SHARED_DATA 주소에 삽입한 쉘코드를 실행시키기 위해 라이트 프리미티브(Write Primitive)를 이용해 hal!HalpApicRequestInterrupt 함수 주소를 KUSER_SHARED_DATA + 0x950 주소로 변경한다. 이후, 해당 함수를 호출하게 되면 hal!HalpApicRequestInterrupt 함수가 호출되지 않고 쉘코드가 실행된다.


[그림 33] HalpApicRequestInterrupt 함수 주소 변경

실행된 쉘코드는 다음과 같이 동작한다. 먼저 HalpApicRequestInterrupt를 정상 주소로 복구한다. 이후 유저모드 APC 인젝션 탐지를 우회하기 위해 spoolsv.sys 프로세스로 커널 모드로 APC 큐를 등록해 커널 쉘코드를 실행한다. 추가로 실행되는 커널 쉘코드를 통해 메모리 공간을 할당하고 유저 모드(User Mode) 쉘코드를 복사한다. 이후 유저 모드로 APC 큐를 등록해 유저 쉘코드를 실행한다.


[그림 34] 쉘코드 동작 과정

취약점 패치
CVE-2020-0796 취약점은 2020년 3월 12일 Microsoft 비정기 업데이트를 통해 패치되었다.
패치 된 srv2.sys의 Srv2DecompressData 함수에서 RtlULongAdd, RtlULongSub 함수 및 추가 루틴을 통해 OriginalSize, Offset에 대한 검증 부분이 추가되었다.


[표 10] CVE-2020-0796 패치 내용 확인

위협 정보
레몬덕(Lemonduck) 악성코드는 2019년 말 국내에 유포되었으며, 파워쉘 스크립트를 통해 SMB, RDP, SSH, MSSQL Bruteforce 및 취약점을 통해 악성코드를 전파해 모네로 채굴 악성코드를 유포했다. 2020년 4월, 레몬덕 악성코드에 CVE-2020-0796 취약점을 스캔하고 코드가 발견되었고 이후, 공격코드 부분이 추가되며 악성코드 전파에 사용되고 있다.

악성코드 전파 코드가 존재하는 if.bin 파일을 통해 취약점 공격을 수행한다. 해당 코드에서는 smgh.bin 파일을 다운로드 하고 %TEMP%\smgh.exe 파일을 생성한다.

생성한 smgh.exe 파일은 공개된 CVE-2020-0796 RCE 코드를 수정한 파이썬(python) 코드를 exe로 컴파일한 악성코드 파일이다. 해당 파일을 디컴파일 후 코드를 비교하게 되면 대부분 유사한 코드 부분이 존재한다. 기존 코드에서 ‘-cmd’ 인자값이 추가되고 유저 쉘코드(User Shellcode) 부분이 수정되며 인자값을 통해 임의의 명령어 실행이 가능하다. 최종적으로 쓰레드를 생성해 Winexec 함수를 통해 명령어가 실행된다.

  


[표 11] 공격 코드 비교

레몬덕 악성코드에서 smgh.exe 파일을 통해 CVE-2020-0796 취약점 공격을 수행해 추가 파워쉘 스크립트를 다운로드하고 실행해 악성코드를 전파한다.


[그림 35] CVE-2020-0796 취약점 공격 코드

취약점 공격 탐지
안랩 제품에서는 CVE-2020-0796 취약점을 다음과 같이 탐지하고 있다.
● Microsoft_Windows_SMBv3_Compression_Remote_Code_Execution(CVE-2020-0796)
Microsoft Windows SMBv3 Compression Remote Code Execution 

취약점 대응 방안
CVE-2020-0796 취약점에 대한 패치는 2020년 3월 12일 Microsoft로부터 제공되었으며, 해당 패치를 통해 조치가 가능하다. MS 패치를 통해 조치가 불가능할 경우 다음과 같은 방법을 통해 조치가 가능하다.
- SMBv3 압축 비활성화

SMBv3 서버에서는 아래의 PowerShell 명령을 사용하여 SMB 프로토콜의 압축 기능을 임시로 비활성화 할 수 있다.

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServe r\Parameters" DisableCompression -Type DWORD -Value 1 -Force
- TCP 포트 445 차단

파일 공유가 불필요한 시스템에서는 TCP 포트 445 를 방화벽으로 차단하면 된다.

IoC (Indicators of Compromise)
관련 파일의 MD5는 다음과 같다.


[표 12] MD5
  • AhnLab 로고
  • TI개발팀 이세빈 연구원
  • Facebook에 공유하실 수
    있습니다.

  • Twitter에 공유하실 수
    있습니다.

  • Linked in

    Linked in에 공유하실 수
    있습니다.

  • 붙여넣기

    블로그나 게시판에 붙여넣기 하실
    수 있습니다.