← Back to Feed CACHED · 2026-06-30 20:09:41 · CACHE_KEY CVE-2026-12819
CVE-2026-12819 · CWE-306 · Disclosed 2026-06-30

Delta Electronics DVP12SE PLC exposes a Modbus TCP service over a specified port without authentication or…

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A factory-floor controller answering every Modbus command on the wire with no questions asked

The Delta Electronics DVP12SE programmable logic controller listens on Modbus TCP (default port 502) and accepts function codes — read coils, write single register, write multiple registers, force coil — from any client that can reach the port. There is no challenge, no key, no session binding, no source-IP gate. Affected firmware spans the DVP12SE series shipped under default configuration; Delta's advisory and CISA ICS-CERT treat the entire DVP-SE family configuration as in-scope until a firmware build that introduces ACLs or an auth proxy is deployed.

There is no published CVSS yet, which is the entire reason this needs an honest reassessment. Vendor labeling for legacy PLCs tends to under-call this class because *'Modbus has no auth by design'* is treated as a known limitation, not a vuln. That framing is wrong for a defender — when an attacker can flip a coil, the impact is physical actuation, and CWE-306 on an OT controller is not the same risk as CWE-306 on a webhook receiver.

"Unauthenticated Modbus on a PLC is a safety problem, not a CVSS problem — floor is HIGH because the role is OT control."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Reach TCP/502 on the PLC

Attacker needs a route to the controller's Modbus listener. In a properly architected Purdue Level 2 network the PLC sits behind an OT DMZ, but flat networks, exposed engineering workstations, and dual-homed HMIs collapse that boundary. Internet-exposed cases are rare but non-zero — Shodan consistently indexes thousands of Modbus endpoints globally.
Conditions required:
  • Routable path to PLC IP
  • TCP/502 reachable (no firewall ACL)
Where this breaks in practice:
  • Most production OT networks are air-gapped or behind a data diode/firewall
  • Engineering VLANs typically blocked from corporate
Detection/coverage: Nessus / Tenable.ot / Claroty / Dragos / Nozomi flag exposed Modbus immediately; Shodan module modbus enumerates externally.
STEP 02

Fingerprint the device

Attacker sends Modbus function code 0x2B/0x0E (Read Device Identification) to confirm Delta DVP12SE and firmware band. Open-source tools — modbus-cli, pymodbus, Metasploit auxiliary/scanner/scada/modbusclient, Smod — all do this in one command.
Conditions required:
  • TCP session established on 502
Where this breaks in practice:
  • Some PLCs disable device-ID responses, but DVP-SE answers by default
Detection/coverage: OT IDS rulesets (Snort/Suricata ICS rules, Zeek modbus.log) log function code 0x2B trivially.
STEP 03

Enumerate coils and holding registers

Function codes 0x01 (Read Coils) and 0x03 (Read Holding Registers) disclose the current process state — valve positions, setpoints, alarm thresholds. The attacker now has a process map without ever logging in.
Conditions required:
  • Modbus session
  • Knowledge of register map (often public for Delta DVP)
Where this breaks in practice:
  • Register semantics are program-specific; mapping them to physical effect takes engineering knowledge
Detection/coverage: Volume of read requests stands out in baseline OT telemetry.
STEP 04

Write to control registers — physical impact

Function codes 0x05 (Write Single Coil), 0x06 (Write Single Register), 0x0F/0x10 (Write Multiple) mutate live process variables. This is the Triton/TRISIS / Industroyer failure mode — actuator state change, set-point override, safety-interlock bypass. Tooling: pymodbus, modpoll, custom scapy. Impact depends on what the PLC drives; on a press, conveyor, or chemical dosing skid it is a safety event.
Conditions required:
  • Write function codes not filtered upstream
  • PLC in RUN mode
Where this breaks in practice:
  • Hardware key-switch in RUN-only mode blocks program changes but NOT register writes
  • Mechanical interlocks may catch the dangerous state
Detection/coverage: Any write to a PLC from a non-engineering-workstation source IP should fire in Claroty CTD / Nozomi Guardian / Dragos Platform.
STEP 05

Denial of control

Even without writes, a flood of malformed Modbus PDUs or stop/program-mode requests can crash the CPU or force a fault, halting the controlled process. For a continuous process (water, power, gas) this is the operational impact.
Conditions required:
  • Network throughput to PLC
Where this breaks in practice:
  • Watchdogs and redundant PLCs limit some scenarios
Detection/coverage: Process anomaly (drop-out) detected by historian / SCADA; network IDS sees malformed PDU volume.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo confirmed campaign tied to this CVE, but the technique class (unauth Modbus write) is canonical — used in Industroyer, Triton, and Volt Typhoon OT reconnaissance reporting (CISA AA24-038A).
Public PoCTrivialpymodbus, modbus-cli, metasploit auxiliary/scanner/scada/modbusclient, smod. No exploit dev required; this is a one-liner.
EPSS0.0031 (~0.3%) — low, reflecting that EPSS undercounts ICS where most assets are not internet-reachable.
KEV statusNot listed as of 2026-07-01.
CVSS vectorNot published by Delta or CISA at disclosure. ICS-aware reassessment is roughly AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H if the PLC is on a reachable network — a true ~9.x. Friction (network reachability) is what pulls this back.
Affected versionsDelta Electronics DVP12SE series PLC, Modbus TCP service, default configuration. Confirm exact firmware band against the Delta PSIRT bulletin.
Fixed versionDelta has historically shipped firmware updates that add IP allowlisting rather than authentication. Track Delta PSIRT for the DVP-SE firmware build that adds an ACL feature, and disable Modbus TCP entirely if unused.
Exposure (Shodan/Censys)Shodan port:502 product:Delta returns small-hundreds of public hits globally — most DVP-SE deployments are NOT internet-exposed, but flat OT networks are common internally.
Disclosure date2026-06-30 (CISA ICS-CERT advisory expected within the next bulletin cycle).
CWECWE-306: Missing Authentication for Critical Function — the protocol-by-design framing does NOT excuse the controller role.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to HIGH (8.2/10)

The single decisive factor is the role multiplier: the affected component is a PLC, which by definition occupies a high-value OT control role where the chain ends in physical actuation or safety impact. Public internet exposure is rare, but inside any flat OT network the attack is one Modbus write away, which sets the floor at HIGH.

HIGH technical mechanics (Modbus has no auth — this is verifiable in 30 seconds with pymodbus)
MEDIUM internal blast radius (depends on customer network architecture — Purdue segmentation status)
LOW external exposure population (Shodan undercounts behind NAT/cell modems)

Why this verdict

  • Role multiplier — canonical OT controller: DVP12SE is a PLC driving physical actuators; the chain succeeds with outcome 'physical process manipulation / safety event' in 100% of deployments where the attacker can reach port 502. Per the role-multiplier rule the floor is CRITICAL for the canonical OT-control role, but exposure friction pulls the practical verdict to HIGH.
  • Friction — reachability is the gate: Public Shodan exposure is well under 1% of installed base. Real risk lives on the internal/OT side where segmentation is the only control. This is the single biggest downward adjustment.
  • Friction — exploitation is trivial when reachable: No skill barrier. Pymodbus one-liner. EPSS 0.0031 reflects exposure, not difficulty.
  • No vendor baseline: Assessed, not upgraded/downgraded. CISA ICS advisories typically rate this class CVSS v3.1 9.8 or v4 8.7; our 8.2 reflects exposure friction discount.
  • Not KEV-listed, no observed targeted campaign yet — keeps it out of immediate-emergency tier.

Why not higher?

Not CRITICAL because the vast majority of DVP12SE units are not reachable from an untrusted network — they sit behind OT firewalls, data diodes, or are simply not routed. CRITICAL is reserved for cases where the chain lands on >1% of the installed base without prior compromise, and DVP-SE public exposure is below that threshold per Shodan/Censys footprint scans.

Why not lower?

Not MEDIUM because the affected component is an OT controller: when the chain does land (insider, vendor laptop, IT→OT pivot, USB-borne implant beaconing out), the impact is physical actuation or safety. The role-multiplier hard rule forbids dropping below HIGH for a PLC with unauth write primitives, regardless of how narrow exposure is.

05 · Compensating Control

What to do — in priority order.

  1. Enforce strict network segmentation between IT and OT (Purdue Level 3.5 DMZ) — The only durable control. Place DVP12SE on a dedicated control VLAN, deny all inbound except from named engineering workstations. Deploy within 30 days per the noisgate mitigation SLA for HIGH.
  2. Block TCP/502 at the OT firewall except from explicit engineering source IPs — Use an allowlist of HMI/engineering-workstation IPs. Drop everything else. Deploy as a firewall rule today; verify with nmap -p502 from a non-allowlisted host within 30 days.
  3. Deploy OT-aware monitoring (Claroty / Nozomi / Dragos / Tenable.ot) — Alert on any Modbus write function code (0x05, 0x06, 0x0F, 0x10) from a non-engineering source, and on any new client touching port 502. Stand up within 30 days.
  4. Disable Modbus TCP on the PLC if not in use — If the controller is read only by a single SCADA poll, consider serial-only or proxy through a Modbus gateway that enforces ACLs.
  5. Put the PLC keyswitch in RUN (not REMOTE/PROGRAM) where possible — Blocks program download/upload; does NOT block register writes but raises the bar against persistence.
  6. Plan firmware tracking via Delta PSIRT — Apply the Delta firmware update that introduces ACL/auth features as soon as it ships — within 180 days per the noisgate remediation SLA for HIGH.
What doesn't work
  • EDR on the PLC — PLCs do not run EDR. This is OT, not IT.
  • Patching the corporate fleet — the vuln is in the controller firmware and protocol exposure, not in any Windows component.
  • TLS / VPN to the HMI — does not stop a malicious engineering workstation or insider with valid network position.
  • Modbus 'security' add-on (MBAPS / port 802) — DVP12SE does not support it; assuming you'll just 'switch ports' is wrong.
06 · Verification

Crowdsourced verification payload.

Run this from an auditor workstation on the OT engineering VLAN (NOT from the corporate network — you should not have a route from there). Requires pip install pymodbus==3.6.*. Invoke as python check_dvp12se.py 10.20.30.41. No PLC credentials needed (that is the point). Read-only — issues only Read Device Identification and Read Holding Registers; does NOT write.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/usr/bin/env python3
# noisgate verification: CVE-2026-12819 Delta DVP12SE unauth Modbus TCP
# Read-only probe. Exits 2=VULNERABLE, 0=PATCHED/UNREACHABLE, 1=UNKNOWN.
import sys, socket
try:
    from pymodbus.client import ModbusTcpClient
except ImportError:
    print('UNKNOWN: pip install pymodbus==3.6.*')
    sys.exit(1)

def probe(host, port=502, timeout=4):
    # 1. TCP reachability
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(timeout)
    try:
        s.connect((host, port))
    except Exception as e:
        print(f'PATCHED-OR-UNREACHABLE: {host}:{port} not reachable ({e})')
        return 0
    finally:
        s.close()

    # 2. Modbus session + unauth read
    c = ModbusTcpClient(host, port=port, timeout=timeout)
    if not c.connect():
        print('UNKNOWN: TCP open but Modbus handshake failed')
        return 1
    try:
        # Read 1 holding register at address 0 without any credentials
        rr = c.read_holding_registers(address=0, count=1, slave=1)
        if rr is None or rr.isError():
            print('UNKNOWN: Modbus reply error (could be slave-ID mismatch; try --slave)')
            return 1
        print(f'VULNERABLE: {host}:{port} accepted unauthenticated Modbus read. Reg0={rr.registers}')
        return 2
    finally:
        c.close()

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('usage: check_dvp12se.py <ip> [port]')
        sys.exit(1)
    host = sys.argv[1]
    port = int(sys.argv[2]) if len(sys.argv) > 2 else 502
    sys.exit(probe(host, port))
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: pull every DVP12SE (and every Modbus-speaking Delta controller) out of your CMDB, then run the verification script from your OT auditor host against each one. Anything that answers with a read is in scope. Per the noisgate mitigation SLA for HIGH, you have ≤ 30 days to land the firewall allowlist on TCP/502 (engineering workstations only) and stand up OT-aware monitoring for Modbus write function codes — this is the control that actually reduces risk, because firmware-level auth from Delta does not yet exist for this family. Per the noisgate remediation SLA you have ≤ 180 days to apply Delta's forthcoming ACL-enabled firmware once it ships and to validate segmentation against your Purdue model. Do NOT wait for a CVSS score from the vendor before acting — the protocol design is the bug, and a pymodbus one-liner is the exploit.

Sources

  1. CISA ICS Advisories index (Delta Electronics)
  2. Delta Electronics PSIRT
  3. CWE-306: Missing Authentication for Critical Function
  4. pymodbus (toolchain for verification & PoC)
  5. Metasploit modbusclient auxiliary scanner
  6. CISA AA24-038A — Volt Typhoon OT targeting
  7. Shodan Modbus search
  8. FIRST EPSS
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.