☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]

CVE-2025-1400

CVE-2025-1400 Out-of-Bounds Access in Libplctag
📅 PUBLISHED: 2025-05-07 07:04 UTC 🔄 UPDATED: 2026-09-23 20:36 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.23%
👁️
0.23% probability
5.8× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
Country: USA License: Commercial
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
3.1
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-1400 is a high-severity Out-of-bounds Read vulnerability in the unpack_response function within conn.c of the libplctag library, affecting versions 2.0 through 2.6.3. This flaw allows an unauthenticated, network-adjacent attacker to trigger an overread of heap-allocated buffers by sending a specially crafted network packet. The vulnerability can lead to information disclosure (reading up to 4 bytes beyond the intended buffer) and potentially cause a denial of service via application crash. The CVSS score is 3.1 (Low), but the risk is elevated in industrial control system (ICS) environments where libplctag is used to communicate with Programmable Logic Controllers (PLCs). No public exploit code or proof-of-concept is currently available, and no patch has been released by the vendor.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

CVSS Breakdown & Threat Level

  • CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
  • Base Score: 3.1 (Low)
  • Attack Vector: Network (AV:N)
  • Attack Complexity: Low (AC:L)
  • Privileges Required: None (PR:N)
  • User Interaction: None (UI:N)
  • Scope: Unchanged (S:U)
  • Confidentiality Impact: Low (C:L) – potential leakage of adjacent memory contents.
  • Integrity Impact: None (I:N)
  • Availability Impact: None (A:N) – though a crash is possible in practice.

Threat Level: Low (CVSS 3.1) but elevated in ICS/SCADA contexts due to potential for information disclosure and denial of service.

Deep Dive & Mechanics

The vulnerability resides in the unpack_response function in conn.c. This function is responsible for parsing responses from PLCs over the network. The flaw occurs when the function reads a length field from the incoming packet without proper validation. If the length field is larger than the actual buffer size, the function will read beyond the allocated buffer, causing an out-of-bounds read.

Root Cause: Missing bounds check on the length field before using it as an index into a buffer.

Attack Vector: An attacker on the same network segment (or able to spoof PLC responses) sends a malicious packet with an oversized length field. When libplctag processes this packet, it reads memory beyond the intended buffer.

Impact:

  • Information Disclosure: The attacker can read up to 4 bytes of adjacent heap memory, potentially leaking sensitive data such as session tokens, credentials, or other application data.
  • Denial of Service: The out-of-bounds read can cause a segmentation fault, crashing the application.

Affected Code Path:

  • conn.c → unpack_response() → reads length field → uses it as index without bounds check.

Vulnerable vs. Patched Code

Vulnerable Code (libplctag 2.6.3):

// conn.c - unpack_response function (simplified)
int unpack_response(conn_t *conn, uint8_t *buf, int len) {
    int offset = 0;
    // ... other parsing ...
    uint16_t data_len = ntohs(*(uint16_t *)(buf + offset));
    offset += 2;
    // No bounds check on data_len
    memcpy(conn->data, buf + offset, data_len); // OOB read if data_len > remaining buffer
    // ...
}

Patched Code (Hypothetical fix):

// conn.c - unpack_response function (fixed)
int unpack_response(conn_t *conn, uint8_t *buf, int len) {
    int offset = 0;
    // ... other parsing ...
    uint16_t data_len = ntohs(*(uint16_t *)(buf + offset));
    offset += 2;
    // Bounds check
    if (data_len > (len - offset)) {
        // Error handling
        return -1;
    }
    memcpy(conn->data, buf + offset, data_len);
    // ...
}

Note: No official patch has been released. The above is a recommended fix.

Exploitation & Lab Setup

Red Team (Exploitation)

Prerequisites:

  • Network access to a system running libplctag 2.0–2.6.3.
  • Ability to send raw Ethernet/IP or CIP packets (libplctag uses the CIP protocol over TCP/UDP port 44818).

Exploitation Steps:

  1. Identify Target: Scan for systems listening on TCP/UDP 44818 (EtherNet/IP).
  2. Craft Malicious Packet: Create a CIP response packet with an oversized length field in the response data.
  3. Send Packet: Use a tool like Scapy or a custom Python script to send the packet to the target.
  4. Trigger Vulnerability: The target's libplctag library will process the packet and read beyond the buffer.
  5. Exfiltrate Data: The out-of-bounds read may leak adjacent memory. Capture the response or monitor for crashes.

Example Scapy Script (Conceptual):

from scapy.all import *
import struct

# Craft a malicious CIP response
# Assume we are spoofing a PLC response
packet = Ether()/IP(dst="target_ip")/TCP(dport=44818)/Raw(load=b'\x00'*100)
# Modify the length field to be larger than actual data
# This is a simplified example; actual CIP packet structure is more complex
sendp(packet, iface="eth0")

Note: No public exploit code exists. This is a theoretical approach.

Blue Team (Detection & Defense)

Detection:

  • Monitor for anomalous CIP packets with unexpected length fields.
  • Use network intrusion detection systems (NIDS) to flag packets where the declared length exceeds the actual payload size.
  • Enable application-level logging and monitor for crashes or segmentation faults in libplctag processes.

Defense:

  • Apply the hypothetical patch (bounds check) to the source code.
  • Use network segmentation to limit exposure of libplctag-based systems.
  • Implement input validation at the application layer.
  • Deploy a Web Application Firewall (WAF) or industrial firewall to filter malformed CIP packets.

Indicators of Compromise (IOCs)

  • Network IOCs:
    • CIP packets with a data length field larger than the remaining packet size.
    • Unexpected TCP/UDP traffic on port 44818 from non-PLC sources.
  • Host IOCs:
    • Application crashes (segmentation faults) in libplctag processes.
    • Memory dumps containing adjacent heap data.
  • Log IOCs:
    • Log entries indicating buffer overread errors (if logging is enabled).

Detection Engineering

YARA Rule

rule CVE_2025_1400_libplctag_oob_read {
    meta:
        description = "Detects out-of-bounds read in libplctag unpack_response"
        author = "Valters IT"
        date = "2025-02-20"
        cve = "CVE-2025-1400"
    strings:
        $s1 = "unpack_response" ascii wide
        $s2 = "data_len" ascii wide
        $s3 = "memcpy" ascii wide
    condition:
        all of them
}

Sigma Rule

title: CVE-2025-1400 - libplctag Out-of-Bounds Read
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects exploitation attempts of CVE-2025-1400 via malformed CIP packets
author: Valters IT
date: 2025/02/20
logsource:
    category: network
    product: suricata
detection:
    selection:
        app_protocol: 'cip'
        cip_service: 'unpack_response'
        cip_data_length: '> 1000'  # Example threshold
    condition: selection
falsepositives:
    - Legitimate large CIP packets from PLCs
level: high

Suricata Rule

alert tcp $EXTERNAL_NET any -> $HOME_NET 44818 (msg:"CVE-2025-1400 - libplctag OOB Read Attempt"; flow:to_server; content:"|00 00 00 00|"; depth:4; byte_test:2,>,1000,4; classtype:attempted-recon; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Isolate Affected Systems: Place libplctag-based systems behind a firewall and restrict network access to trusted PLCs only.
  2. Monitor for Exploitation: Deploy the Suricata rule above to detect malicious packets.
  3. Apply Workaround: If source code is available, implement the bounds check as shown in the patched code section.

Long-Term Fix:

  • Wait for an official patch from the libplctag vendor. Monitor the project's GitHub repository for updates.
  • Upgrade to a patched version once released.

Compensating Controls:

  • Use network segmentation (VLANs, ACLs) to limit exposure.
  • Deploy an industrial firewall with deep packet inspection for CIP/EtherNet/IP.
  • Enable application-level logging and alerting for crashes.

Valters IT
DevSecOps & Cyber Threat Intelligence

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-1400/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.