Socomec DIRIS Digiware M-70 Modbus TCP 服务器缓冲区溢出导致的 DoS 漏洞分析
好的,我现在要帮用户总结这篇文章的内容。用户的要求是用中文,控制在100字以内,不需要特定的开头,直接写描述即可。 首先,我需要仔细阅读并理解文章内容。文章主要讲的是DIRIS Digiware M-70设备中的一个漏洞,CVE-2025-26858。这个漏洞出现在Modbus TCP服务器处理数据时,具体是在modbusServerProcessData函数中。 接下来,文章详细描述了漏洞的原因:函数在处理接收到的数据包时,没有正确验证数据长度,导致缓冲区溢出。攻击者可以通过构造特定的三个数据包来触发拒绝服务(DoS)攻击。 然后,我需要将这些关键点浓缩到100字以内。重点包括设备型号、漏洞编号、漏洞位置、原因以及攻击后果。 最后,确保语言简洁明了,符合用户的要求。 </think> DIRIS Digiware M-70设备中发现CVE-2025-26858漏洞,源于Modbus TCP服务器处理数据时未正确验证数据长度,导致缓冲区溢出。攻击者通过构造特定数据包可触发拒绝服务攻击。 2025-12-6 17:0:0 Author: hackyboiz.github.io(查看原文) 阅读量:0 收藏

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가 트리거 됩니다.


文章来源: https://hackyboiz.github.io/2025/12/06/ogu123/cve-2025-26858/
如有侵权请联系:admin#unsafe.sh