[하루한줄] CVE-2022-21969: Microsoft Exchange Deserialization RCE

URL

Searching for Deserialization Protection Bypasses in Microsoft Exchange (CVE-2022–21969)

Target

  • Microsoft Exchange Server
    • 2013 Cumulative Update 23
    • 2016 Cumulative Update 21, 22
    • 2019 Cumulative Update 10, 11

Explain

Microsoft에서 개발한 메시징, 협업 소프트웨어 제품인 Microsoft Exchange Server에서 deserialization을 통한 원격 코드 실행(Remote code execution) 취약점이 발견되었습니다. 이전에 발견된 동일한 취약점 CVE-2021-42321에서 추가된 보호 기법을 우회하여 rpc 명령어를 통해 원격 코드 실행이 가능합니다.

Microsoft Exchange는 Microsoft.Exchange.Rpc.ExchangeCertificates.ExchangeCertificateRpcServer 클래스에서 /rpc에서 호출 가능한 함수 프로토 타입을 정의합니다. 그 후 byte[] inputBlob을 통해 Microsoft.Exchange.Servicelets.ExchangeCertificate.ExchangeCertificatesServerHelper에서 구현된 다음 Microsoft.Exchange.Management.SystemConfigurationTasks.ExchangeCertificateRpc 생성자가 호출됩니다.

ExchangeCertificateRpc에서 DeserializeObject(inputBlob, false) 메서드를 호출하는데, 해당 메서드는 SerializationBinder와 같은 보호 조치 없이 BinaryFormatter를 deserialization 합니다. 이를 통해 ysoserial.NET에서 생성된 페이로드를 사용하여 원격 코드 실행이 가능합니다.

하지만 CVE-2021-42321을 우회하여 악성 페이로드를 deserialization 하기 위해서는 다음의 조건이 필요합니다.

  1. strictModeFalse로 설정
  2. 페이로드 오브젝트의 어셈블리 이름은 ysoserial.NET에서 제공하는 어셈블리 이름과 일치하지 않아야 함
    • Microsoft.Exchange.Diagnostics.ChainedSerializationBinder.GlobalIDisallowedTypesForDeserialization에 ysoserial.NET에서 제공하는 deserialization gadget을 종료하는 deny list가 존재합니다.

strictMode의 기본 값을 False로 설정한 후, 위의 ysoserial.NET에서 제공하는 gadget의 일부가 오타로 인해 deny list에 감지되지 않습니다. 이를 통해 CVE-2021-42321에서 추가된 보호 기법을 우회하여 deserialization을 통한 원격 코드 실행이 가능합니다.