[하루한줄] CVE-2024-34026: OpenPLC Stack Buffer Overflow 취약점

URL

https://talosintelligence.com/vulnerability_reports/TALOS-2024-2005

Target

  • OpenPLC_v3

Explain

오픈소스 기반의 Programmable Logic Controller(PLC)인 OpenPLC에서 발생하는 Stack Buffer Overflow 취약점에 대한 세부 정보가 공개되었습니다.

OpenPLC는 ENIP(EtherNet/IP) 등의 프로토콜을 지원하며 해당 프로토콜을 통해 전송되는 PCCC(Programmable Controller Communication Commands) 메세지를 지원합니다.

ENIP(EtherNet/IP): Ethernet Industrial Protocol을 의미하며 공통된 산업 프로토콜을 표준 이더넷 기반에서 사용할 수 있도록 개발된 산업 네트워크 프로토콜임.

취약점은 OpenPLC의 ENIP 프로토콜 파서 함수인 processEnipMessage 함수에 존재합니다.

int processEnipMessage(unsigned char *buffer, int buffer_size)
{	
    // initialize logging system
    char log_msg[1000];
    char *p = log_msg;
//...
    if (header.command[0] == 0x6f)	// Send RR Data
    {
        ...
    }
    else
    {
        p += sprintf(p, "Unknown EtherNet/IP request: ");
        for (int i = 0; i < buffer_size; i++)
        {
            p += sprintf(p, "%02x ", (unsigned char)buffer[i]);
        }
        p += sprintf(p, "\n");
        log(log_msg);

        return -1;
    }

processEnipMessage 함수의 인자로 전달되는 bufferbuffer_size는 공격자가 ENIP 프로토콜 메세지를 보내는 것으로 제어 가능하며, 함수는 처리하는 메시지를 로깅하기 위해 1000 bytes 크기의 log_msg 스택 버퍼를 할당합니다.

이후 ENIP 헤더에 포함된 Command Code가 유효한지 검사하는데, 이때 Command Code가 유효하지 않으면 else 분기에서 log_msg 를 에러 메세지로 채우고 이후 메세지 크기인 buffer_size만큼의 공백문자를 log_msg 버퍼에 저장합니다.

위 과정에서 buffer_sizelog_msg 버퍼 크기보다 큰지 검사하지 않아 다음 조건에서 Stack Buffer Overflow 트리거가 가능합니다.

  • 유효하지 않은 Command Code
  • 유효한 캡슐화된 헤더
  • 500 bytes 이상의 총 메세지 길이