[하루한줄] CVE-2025-26858: Socomec 사의 DIRIS Digiware M-70에서 발생한 overflow로 인한 DoS 취약점
URL
Target
- DIRIS Digiware M-70 1.6.9
Explain
DIRIS Digiware M-50/M-70 게이트웨이는 산업용 전력 모니터링 시스템의 액세스 포인트 역할을 수행하며, 전기 설비 내 장치들에 전원을 공급하고 통신 연결을 제공합니다.
CVE-2025-26858은 502번 포트의 Modbus TCP 서버로 전송된 패킷을 처리할 때 발생했습니다.
uint32_t modbusServerProcessData(int32_t connNbr, int32_t sock_id, int32_t rx_buf, int32_t rx_len)
[...]
uint32_t r0_6 = (uint32_t)*(uint16_t*)(rx_len - (uint32_t)i + rx_buf + 4); // [1]
packet_length = byte_swap(r0_6);
[...]
if (packet_length < rx_len) // [2]
{
[...]
target_object = getNextItemInList(&data_2001242c[connNbr].head, sock_id); //[3]
[...]
if (target_object)
{
target_object->len = packet_length + 6; // [4]
[...]
Mem_Copy(&*(uint32_t*)((char*)target_object->rx_buf + 0),
rx_len - (uint32_t)i + rx_buf, (uint32_t)target_object->len); // [5]
modbusServerProcessData 함수는 [1]에서 Modbus Application Protocol 헤더로부터 Length 필드 값을 추출한 뒤 [2]에서 수신된 데이터의 크기보다 작은지 검증합니다.
하지만, [2]번 검증 로직은 [4] 값 증가를 검증하지 않아 oveflow가 발생했습니다.
공격자가 src buffer의 최대 크기(0x105) - 1을 패킷 길이로 설정하면 [2] 검사를 통과한 뒤 [4]를 통해 memcpy size는 0x10a가 됩니다.
따라서, memcpy 실행 시 src buffer에서 5byte를 더 read 하게 되고 문제는 dst buffer의 크기가 0x100이므로 0x10byte 만큼 overflow가 발생하게 됩니다.
struct target_object [2]
{
[0]
{
void* nextPtr = 0xd0b20fd8;
void* prevPtr = 0x2001243c;
uint8_t rx_buf [0x100];
uint16_t len;
uint16_t field_10a;
};
[1]
{
void* nextPtr = 0x00000041;
void* prevPtr = 0x20010000;
uint8_t rx_buf [0x100];
uint16_t len;
uint16_t field_10a;
};
}
공격자 3개의 패킷을 통해 아래와 같이 DoS를 트리거 할 수 있습니다.
첫 번째 패킷을 통해 target_object[1]→nextPtr 값을 0x00000041로 overwrite 합니다.
두 번째 패킷은 [3] getNextItemInList을 통해 target_object[1]을 가져오고 rx_buf에 데이터를 write 합니다.
세 번째 패킷은 [3] getNextItemInList 을 통해 다음 객체를 찾을 때 target_object[1].nextPtr 값(0x00000041) 참조하며 DoS가 트리거 됩니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.