[하루한줄] CVE-2021–42321: Some notes about Microsoft Exchange Deserialization RCE

URL

Some notes about Microsoft Exchange Deserialization RCE (CVE-2021–42321)

Target

Microsoft Exchange Server 2016 CU 21,22

Microsoft Exchange Server 2019 CU 10,11

Explain

Microsoft Exchange Server에서 deserialization에 의한 원격 코드 실행 취약점이 발견되었습니다.

serialization과 deserialization 작업에 사용되는 type을 제어하기 위해 SerializationBinder값이 사용됩니다. 하지만 이 값이 ExchangeBinaryFormatterFactory에 제대로 전달되지 않아 취약점이 발생합니다. SerializationBinder값이 ExchangeBinaryFormatterFactory.CreateBinaryFormatter()에 전달되지 않는다면 deserialization의 type을 검사하기 위해 ChainedSerializationBinder 값을 대신 사용하게 됩니다. ChainedSerializationBinder 값은 다음과 같이 초기화 되어있습니다.

  • strictMode = false
  • allow = System.DelegateSerializationHolder
  • allowedGenerics = null

위 사진은 ChainedSerializationBinder.ValidateTypeToDeserialize()의 코드입니다.

해당 함수가 실행될 때 BlockedDeserializationException이 발생하면 catch문에서 flag값을 검사하고 True일 때만 다시 throw합니다. 문제는 해당 flag 값이 ChainedSerializationBinder 에서 전달 받은 strictMode이기 때문에 항상 False이고 예외처리가 발생하지 않습니다.