Talos Vulnerability Report

TALOS-2026-2379

GeoVision GV-I/O Box 4E libNetSetObj.so OS command injection vulnerabilities

June 23, 2026
CVE Number

CVE-2026-12486,CVE-2026-12849,CVE-2026-12850,CVE-2026-12851

Summary

Multiple exploitable OS command injection vulnerabilities exist in the libNetSetObj.so functionality of GV-I/O Box 4E (version(s): 2.09). A specially crafted network packet can lead to command execution. An attacker can send a network request to trigger these vulnerabilities.

Confirmed Vulnerable Versions

The versions below were either tested or verified to be vulnerable by Talos or confirmed to be vulnerable by the vendor.

GV-I/O Box 4E (version(s): 2.09)

Product URLs

GV-I/O Box 4E - https://www.geovision.com.tw/product/GV-IO%20Box%204E

CVSSv3 Score

9.1 - CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H

CWE

CWE-78 - Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’)

Details

GV-I/O Box 4E is a smart embedded device with 4 input and 4 relays output that can be controlled over Ethernet and RS-485.

CVE-2026-12486 - CNetSetObj::m_F_n_Set_IP_Addr command injection

The following function takes a string as an ip address, performs no sanitization and calls system. This is a classic command injection vulnerability. The function is reachable from both the network-exposed DVRSearch service and the Network.cgi endpoint.

int __fastcall CNetSetObj::m_F_n_Set_IP_Addr(const char **this, char *ip_addr)
{
  bool v2; // zf
  char v4[72]; // [sp+0h] [bp-48h] BYREF

  v2 = *this == 0;
  if ( *this )
    v2 = ip_addr == 0;
  if ( v2 )
    return 0;
  sprintf(v4, "/sbin/ifconfig %s %s", *this, ip_addr);  // attacker controlled ip address 
  system(v4);
  return 1;
}

CVE-2026-12849 - CNetSetObj::m_F_n_Set_Net_Mask command injection

The following function takes a string as a net mask address, performs no sanitization on it and calls system. This is a classic command injection vulnerability. The function is reachable from both the network-exposed DVRSearch service and the Network.cgi endpoint.

int __fastcall CNetSetObj::m_F_n_Set_Net_Mask(const char **this, char *netmask_addr)
{
  bool v2; // zf
  char v4[72]; // [sp+0h] [bp-48h] BYREF

  v2 = *this == 0;
  if ( *this )
    v2 = netmask_addr == 0;
  if ( v2 )
    return 0;
  sprintf(v4, "/sbin/ifconfig %s netmask %s", *this, netmask_addr);  // attacker controlled netmask_addr
  system(v4);
  return 1;
}

CVE-2026-12850 - CNetSetObj::m_F_n_Set_Gate_way command injection

The following function takes a string as a gatewy address, performs no sanitization on it and calls system. This is a classic command injection vulnerability. The function is reachable from both the network-exposed DVRSearch service and the Network.cgi endpoint.

int __fastcall CNetSetObj::m_F_n_Set_Gate_way(const char **this, char *gw, char *dev)
{
  char s[324]; // [sp+4h] [bp-144h] BYREF

  if ( !dev && !*this || !gw )
    return 0;
  system("/sbin/route del -net 224.0.0.0 netmask 224.0.0.0");
  system("/sbin/route del default ");
  if ( dev )
    sprintf(s, "/sbin/route add default gw %s dev %s", gw, dev); //attacker controlled gw string
  else
    sprintf(s, "/sbin/route add default gw %s dev %s", gw, *this); //attacker controlled gw string
  system(s);
  sprintf(s, "/sbin/route add -net 224.0.0.0 netmask 224.0.0.0 gw %s dev %s", gw, *this); //attacker controlled gw string
  system(s);
  return 1;
  }

CVE-2026-12851 - CNetSetObj::m_F_n_Set_DNS_Addr command injection

The following function can take up to two addresses, performs no sanitization and then calls system. This is a classic command injection vulnerability. The function is reachable from both the network-exposed DVRSearch service and the Network.cgi endpoint.

int __fastcall CNetSetObj::m_F_n_Set_DNS_Addr(CNetSetObj *this, char *dns1, char *dns2)
{
  int result; // r0
  char v5[80]; // [sp+0h] [bp-50h] BYREF

  if ( !dns1 )
    result = 0;
  if ( dns1 )
  {
    sprintf(v5, "/bin/echo nameserver %s > /etc/resolv.conf", dns1);  // attacker controlled dns1 field
    system(v5);
    if ( dns2 )
    {
      sprintf(v5, "/bin/echo nameserver %s >> /etc/resolv.conf", dns2);
      system(v5);
    }
    return 1;
  }
  return result;
}

Timeline

2026-04-21 - Initial Vendor Contact
2026-04-21 - Vendor Disclosure
2026-04-28 - Vendor Patch Release

Credit

Philippe Laulheret of Cisco Talos