[하루한줄] 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
함수의 인자로 전달되는 buffer
및 buffer_size
는 공격자가 ENIP 프로토콜 메세지를 보내는 것으로 제어 가능하며, 함수는 처리하는 메시지를 로깅하기 위해 1000 bytes 크기의 log_msg
스택 버퍼를 할당합니다.
이후 ENIP 헤더에 포함된 Command Code가 유효한지 검사하는데, 이때 Command Code가 유효하지 않으면 else 분기에서 log_msg
를 에러 메세지로 채우고 이후 메세지 크기인 buffer_size
만큼의 공백문자를 log_msg
버퍼에 저장합니다.
위 과정에서 buffer_size
가 log_msg
버퍼 크기보다 큰지 검사하지 않아 다음 조건에서 Stack Buffer Overflow 트리거가 가능합니다.
- 유효하지 않은 Command Code
- 유효한 캡슐화된 헤더
- 500 bytes 이상의 총 메세지 길이
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.