Team82 로고 Claroty
블로그로 돌아가기

지멘스 SIMATIC 에너지 매니저의 고전적인 역직렬화 취약점 악용하기

/

경영진 요약

  • Team82는 지멘스의 SIMATIC 에너지 매니저(EnMPro) 제품에서 발견된 역직렬화 취약점을 Siemens에 공개했습니다.

  • 취약점인 CVE-2022-23450은 CVSS v3 점수 10.0으로 가장 높은 심각도 점수를 받았으며, 취약점의 심각성을 고려하여 Team82는 사용자에게 업데이트할 시간을 주기 위해 지금까지 기술적 세부 정보 공개를 연기하기로 결정했습니다.

  • 이 취약점을 성공적으로 익스플로잇한 공격자는 원격으로 코드를 실행하고 EnMPro 서버를 완전히 제어할 수 있습니다.

  • EnMPro는 플랜트 내에서 에너지 소비량과 프로세스 내 에너지 흐름을 관리 및 시각화하고, 에너지 효율성을 비교하고, 에너지 관리 계획을 수립하는 데 사용되는 소프트웨어입니다.

  • 지멘스는 V7.3까지의 모든 버전에 이 취약점이 포함되어 있으므로 사용자에게 V7.3 업데이트 1 이상으로 업데이트할 것을 촉구합니다.

  • 자세한 내용은 지멘스의 보안 권고 사항을 참조하세요 .

소개

많은 사람들이 역직렬화 취약점은 과거의 일이라고 생각하지만, 여전히 인기 있는 애플리케이션에 영향을 미치는 역직렬화 취약점은 가끔씩 나타나고 있습니다. 이러한 취약점은 객체를 인메모리 표현에서 원격으로 전송할 수 있는 이진 형식으로 변환하는 프로세스인 객체 직렬화/역직렬화의 안전하지 않은 프로세스에서 비롯됩니다(역직렬화의 경우 그 반대). 그러나 서버가 역직렬화 프로세스 중에 사용자가 만들 수 있는 클래스 유형을 올바르게 제한하지 않으면 이를 악용하여 완전한 원격 코드 실행(RCE) 취약점으로 악용할 수 있습니다.

Team82는 지멘스의 SIMATIC 에너지 매니저(EnMPro) 소프트웨어 제품군에서 이러한 취약점 중 하나를 발견하고 EnMPro 통신 프로토콜에서 발견한 역직렬화 취약점을 악용하는 CVE-2022-23450 (CVSS 10.0)에 대한 개념 증명 공격을 개발했습니다. 이 결함으로 인해 공격자는 인증 흐름이 시작되기 전에 악성 페이로드를 전송할 수 있습니다. 

저희는 이 취약점을 비공개로 공개했으며, 지멘스는 V7.3 업데이트 1 및 이후 버전에서 해당 취약점을 패치했습니다. V7.3까지의 모든 버전에는 이 취약점이 포함되어 있습니다. 이 취약점을 성공적으로 익스플로잇하는 공격자는 EnMPro 서버를 완전히 제어할 수 있습니다. 

지멘스 SIMATIC 에너지 매니저란?

지멘스 SIMATIC 에너지 매니저(EnMPRO)는 공장 내에서 에너지 흐름과 소비량을 관리 및 시각화하고, 에너지 효율성을 비교하고, 그에 따른 에너지 계획을 수립하는 데 사용되는 소프트웨어입니다.

에너지 사용량과 소비량을 보여주는 EnMPRO 애플리케이션의 스크린샷입니다.

그 이면에서 EnMPRO는 .NET 서비스( BDataWIndowsService), 포트에서 수신 대기 중인 .NET 실행 파일로 구성된 TCP/4444. 이 실행 파일은 EnMPRO 서버의 핵심 기능 대부분을 처리하며, 클라이언트가 전용 메시징 프로토콜을 사용하여 원격으로 서버에 연결할 수 있도록 합니다. 클라이언트는 이 프로토콜을 사용하여 서버의 데이터 검색 또는 변경, 다양한 함수 호출, 그래픽 인터페이스 또는 주기적 절차 생성 등 서버의 다양한 기능을 호출할 수 있습니다.

EnMPro를 조사하는 동안 EnMPro의 웹 서버와 데스크톱 애플리케이션에서 몇 가지 중요한 취약점을 발견할 수 있었습니다. 이러한 취약점이 악용될 경우 악의적인 공격자가 EnMPro를 실행하는 서버를 손상시키고 모든 권한을 획득할 수 있습니다. 이 블로그에서는 연구 프로세스를 설명하고 가장 심각한 취약점인 CVE-2022-23450에 대한 몇 가지 기술적 세부 정보를 제공합니다.

프로토콜 리버스 엔지니어링

원격 사용자가 메인 EnMPRO 서버와 상호 작용할 수 있도록 하기 위해 지멘스는 TCP/4444를 통해 매우 간단한 네트워크 프로토콜을 생성하여 데스크톱 애플리케이션(클라이언트 UI DocLiber.exe)를 사용하여 메인 서버의 애플리케이션(BDataWindowsService.exe). 

서버의 바이너리를 리버스 엔지니어링하고 네트워크 통신의 정적 덤프를 살펴보면서 프로토콜의 메시지와 기능을 이해하고 최종적으로 재구성하려고 노력했습니다. 사용자가 클라이언트를 통해 호출할 수 있는 다양한 기능을 살펴보고 패킷이 어떻게 변화하는지 관찰하면서 메시지의 다양한 필드를 더 잘 이해하려고 노력했습니다. 짧은 프로토콜별 핸드셰이크와 세션 생성 후 대부분의 EnMPro 메시지는 다음과 같은 구조를 구현한다는 사실을 발견했습니다:

EnMPRO 데스크톱 애플리케이션 DocLiber에서 보내는 일반적인 네트워크 메시지의 스크린샷입니다.

서로 다른 색상으로 표시한 패킷의 네 부분을 각각 분석해 보겠습니다:

  • 패킷 크기: 각 패킷의 처음 4바이트는 패킷의 크기(패킷 크기 헤더 제외)로, 리틀 엔디안 바이트 순서로 전송됩니다. 이 패킷에서는 패킷 크기가 0x01B2임을 알 수 있습니다.

  • 패킷 플래그: 패킷 크기 다음 4바이트는 이 패킷에 대한 다양한 플래그를 지정하는 비트맵입니다. 플래그에는 패킷이 압축되었는지(GZIP 사용), 패킷이 청크되었는지 등을 나타내는 표시기가 포함됩니다.

  • 패킷 유형: 패킷의 다음 바이트는 패킷의 유형을 나타냅니다. 이 바이트는 열거형이며 메시지 유형과 메시지 내부에 어떤 필드/멤버를 전송할지 결정합니다. 메시지 유형이 정의됩니다:

Remotinglib.dll 내에 정의된 FastSerializationMessageMode Enum을 사용합니다.

패킷 유형을 읽은 후 서버/클라이언트는 올바른 메시지 유형 역직렬화기를 사용하여 메시지를 구성하려고 시도합니다.

  • 메시지 내용: 올바른 메시지 파서를 사용하여 읽고 파싱할 실제 메시지 데이터입니다. 메시지에는 이 특정 메시지 유형에서 사용하는 다양한 필드/멤버가 포함됩니다.

패킷 유형 열거 형을 보자마자( FastSerializationMessageMode), 한 가지 메시지 유형이 눈에 띄었습니다:  끄기_유즈바이너리포맷터. BinaryFormatter라는 단어가 포함된 이름과 열거형 이름에 직렬화라는 단어가 포함되어 있다는 사실에서 잠재적인 취약점을 발견했습니다.

C#/.NET에서는 바이너리포맷터 클래스는 객체 직렬화 및 역직렬화에 사용되며, 이는 기본적으로 바이트 스트림에서 인메모리 클래스 인스턴스를 생성하거나 그 반대로 생성하는 프로세스입니다. 그러나 Microsoft는 문서에서 다음과 같이 경고합니다. 바이너리포맷터 클래스는 본질적으로 안전하지 않으므로 완전히 필수적인 경우가 아니라면 사용해서는 안 됩니다.

이 클래스의 MSDN 페이지에 있는 BinaryFormatter 클래스에 대한 경고입니다.

그리고 바이너리포맷터 클래스는 특히 사용자 입력에서 오는 객체를 역직렬화하는 데 사용해서는 안 되며, 원격 공격자가 코드 실행을 쉽게 달성할 수 있기 때문입니다. 그 이유는 바이너리포맷터 직렬화기는 역직렬화하는 클래스 유형을 위생 처리하지 않으며, 대신 임의의 클래스를 생성할 수 있습니다. 

커뮤니티에서 연구하고 발견한 가젯(생성 시 코드 실행 등 의도하지 않은 부작용을 일으킬 수 있는 클래스)이라는 클래스를 사용하여 원격 코드 실행을 달성할 수 있었습니다. 저희는 직렬화된 클래스를 역직렬화할 때마다 임의의 코드가 실행되는 악의적인 직렬화 클래스를 만들 수 있었습니다( ysoserial.net 도구 사용).

역직렬화될 때 코드 실행(이 경우 mspaint 열기)을 초래하는 악성 클래스를 생성하기 위해 ysoserial.net을 사용합니다.

그런 다음 EnMPRO 서버와의 세션을 시작하는 간단한 클라이언트를 만든 다음 직렬화된 악성 클래스를 서버로 전송하여 역직렬화합니다.

개념 증명 익스플로잇의 결과입니다:

악성 페이로드가 사용되어 BDataWindowsService 서비스 아래에 mspaint 프로세스가 생성됩니다.

이 특정 사례에서는 인증 전에도 서버가 패킷을 역직렬화하도록 강제할 수 있었기 때문에 이 원격 코드 실행 취약점을 통해 인증 검사를 우회할 필요가 없습니다.

주요 내용

지멘스는 플랜트에서 공정 내 에너지 소비를 모니터링하는 데 사용되는 SIMATIC 에너지 매니저(EnMPro) 제품의 중요한 원격 코드 실행 취약점을 수정했습니다. 

이 취약점은 EnMPro의 .NET 사용에서 발견되는 전형적인 역직렬화 버그입니다. 바이너리포맷터 클래스입니다. 바이너리포맷터는 특히 사용자 입력에서 오는 객체를 역직렬화하는 데 사용해서는 안 된다고 Microsoft는 말합니다. 이를 사용하면 원격 공격자가 원하는 코드를 실행하여 이러한 서버를 완전히 제어할 수 있는 위험에 노출될 수 있습니다.

개념 증명 익스플로잇은 서버와 세션을 시작한 후 서버에서 역직렬화된 악성 직렬화 클래스를 전송하여 임의의 원격 코드 실행을 초래합니다. 이 공격은 사전 인증을 통해 수행되므로 공격자는 서버에 대한 사전 발판을 확보할 필요가 없습니다. 

이 취약점은 CVSS v3 점수 10.0으로 평가되었으며, EnMPro V7.3 업데이트 1 이상에서 해결되었습니다. 이전 버전은 모두 이 취약점을 가지고 있습니다.  

인정

Team82는 이번 공개를 통해 이 중요한 취약점을 적시에 해결하기 위해 협력해 준 지멘스에 감사의 뜻을 전합니다.

최신 소식 받기

Team82 뉴스레터 받기

관련 취약점 공개

Claroty
LinkedIn Twitter YouTube Facebook