Sparkplug B protocol security: what MQTT's SCADA layer protects, and what it doesn't

Last updated:

Key takeaways

  • Sparkplug B does not secure MQTT-based SCADA and IIoT data on its own.
  • No — and the specification is unusually direct about this.
  • None of this is an integrity or authenticity control.
  • Treat Sparkplug B as inheriting the MQTT broker's security, because the specification says exactly that.

Sparkplug B does not secure MQTT-based SCADA and IIoT data on its own. The Eclipse Foundation's Sparkplug specification devotes an entire chapter to security, but states plainly that the chapter "is provided for guidance only and is non-normative" — every authentication, authorization and encryption decision (client credentials, TLS, broker access-control lists) is left to whichever MQTT broker a deployment chooses, not to Sparkplug's own topic-naming and payload rules.

Facts attributed to the Eclipse Sparkplug specification and FAQ, NVD, Inductive Automation's own Trust Center, and NIST SP 800-82 Revision 3 are drawn from each organization's own published PDF, HTML or JSON record, fetched directly. CISA's ICSA-25-352-01 is cited by advisory number as the NVD-listed source of CVE-2025-13911; CISA's own advisory page returned an access error to this fetch and is not quoted directly here.

What does Sparkplug B actually add on top of plain MQTT?

Per the Eclipse Sparkplug project's own FAQ, "Sparkplug is an open software specification that provides MQTT clients the framework to seamlessly integrate data from their applications, sensors, devices, and gateways within the MQTT Infrastructure," and, more precisely, "Sparkplug is simply a specification that defines how best to use MQTT in real-time, mission-critical industrial infrastructures." It does not modify MQTT itself. Instead, the specification (current version 3.0.0, dated 21 October 2022) layers three conventions on top of a standard MQTT broker: a structured topic namespace (spBv1.0/group_id/message_type/edge_node_id/device_id), a Google Protocol Buffers payload format for typed metrics, and a session-state management model built around what the spec calls Birth and Death certificates. The specification's own reference architecture diagram shows why this matters for OT specifically: it places SCADA/IIoT "Primary Application," "MES," "Historian" and "Analytics" host applications side by side on the same MQTT broker, all consuming the identical Sparkplug-formatted data stream from every connected Edge Node.

Does Sparkplug B's own security chapter require anything at all?

No — and the specification is unusually direct about this. Chapter 7, titled simply "Security," opens with: "This chapter is provided for guidance only and is non-normative." Its three subsections each point outward rather than defining a Sparkplug-specific control. Section 7.1 (TLS) explains that "the MQTT specification does not specify any TCP/IP security scheme as it was envisaged that TCP/IP security would (and did) change over time," so Sparkplug "will not specify any TCP/IP specific security requirements" either, offering only non-binding examples of securing a deployment with TLS. Section 7.2 (Authentication) states that "from a pure MQTT client perspective, the client does need to provide a unique Client ID, and an optional username and password" — a description of what MQTT's CONNECT packet already supports, not a new requirement. Section 7.3 (Authorization) notes that "although access control is not mandated in the MQTT specification for use in MQTT Server implementations, Access Control List (ACL) functionality is available for many MQTT Server implementations," and Section 7.4.3 walks through an example ACL for a single Edge Node, concluding that properly scoped ACLs "offer some security in preventing compromised credentials from being able to be used to spoof Edge Nodes, write to other Edge Node outputs, or see all messages flowing through the MQTT Server." Every one of those controls has to be configured on the broker; Sparkplug supplies the worked example, not the enforcement.

Birth and Death certificates: built for reliability, not authenticity

Sparkplug's most distinctive feature is what the spec calls Continuous Session Awareness — a way for a Host Application to always know whether an Edge Node is online, which legacy poll/response SCADA protocols handled by simply asking again. Sparkplug instead uses the MQTT "Will Message" feature so that a Death Certificate is delivered even if a client disconnects ungracefully. The specification requires that "Birth Certificates MUST be the first MQTT messages published by any Edge Node or any Host Application," using the NBIRTH topic verb for an Edge Node coming online and NDEATH (registered as the MQTT Will) for it going offline. Each NBIRTH includes a bdSeq number that "MUST start at zero and increment by one on every new MQTT CONNECT packet," letting a Host Application match a later NDEATH back to the NBIRTH session it belongs to. Every subsequent NDATA message then carries its own sequence number, which "MUST have a value of one greater than the previous MQTT message from the Edge Node... unless the previous MQTT message contained a value of 255," in which case it resets to 0 — a simple rolling counter a Host Application uses to detect a gap or an out-of-order delivery.

None of this is an integrity or authenticity control. A bdSeq or sequence number only tells a subscriber that a message arrived in the expected order relative to the last one it saw from that same authenticated connection; it says nothing about who actually holds that connection. Any MQTT client authorized to publish on a Group ID and Edge Node ID's topics — whether the genuine device or an attacker using its credentials — can publish a perfectly well-formed NBIRTH, NDATA or forged NDEATH, sequence numbers included, and every downstream Host Application, Historian or Analytics consumer will treat it as legitimate.

A documented example: a scored vulnerability in the platform that receives every Birth certificate

Inductive Automation's Ignition is one of the most widely deployed SCADA/IIoT platforms shipping native Sparkplug B and MQTT modules for the Primary Host Application role the specification describes — the single application an Edge Node waits for before publishing its NBIRTH and DBIRTH messages. NVD's record for CVE-2025-13911 (CISA ICSA-25-352-01, CVSS v3.1 base score 6.4, CWE-250 Execution with Unnecessary Privileges) describes the flaw: "Ignition by Inductive Automation with default OS service account settings may expose elevated code execution risk via gateway backup restore. An authenticated Gateway Administrator can import a malicious .gwbk file containing crafted resources, scripts, or modules, resulting in code execution with system-level privileges on Windows (NT AUTHORITY\SYSTEM) or root/elevated privileges on Linux." Inductive Automation's own Trust Center confirms the mechanism in its own words: "The default Ignition installation on Windows grants greater operating system permissions than is needed in most cases. An Ignition administrator importing malicious project resources could lead to a system level compromise or other significant effects." The same Trust Center page states the vendor's disclosure posture plainly: "Inductive Automation already operates a coordinated vulnerability disclosure program. We coordinate directly with CISA. Our findings are formally scored and cataloged in the NIST National Vulnerability Database for the broader security community."

This is a privilege-escalation flaw in the host platform's default Windows service-account permissions, reachable only by an already-authenticated Gateway Administrator — not a break of Sparkplug's topic namespace, payload format, or Birth/Death mechanism, and the two should not be confused. What it does illustrate is that the Primary Host Application a Sparkplug deployment designates — the one piece of infrastructure every Edge Node's Birth and Death certificate is specifically addressed to — is itself a high-value target that needs the same hardening discipline as any other privileged OT server, independent of whatever ACL scoping is applied to the Sparkplug topics it consumes.

Why this matters more as Sparkplug B feeds AI-driven OT analytics

Sparkplug's own reference architecture diagram lists an "Analytics (Sparkplug)" application sitting on the identical MQTT broker as MES, Historian and SCADA host applications — the specification was built so that every consumer, human-facing or automated, reads the same typed metric stream from the same Edge Nodes. That design is exactly why Sparkplug B has become a common data backbone feeding predictive-maintenance and anomaly-detection models in IIoT: the Birth certificate's typed, self-describing metric list and the NDATA stream's change-only reporting give a model-training or inference pipeline a structured, low-noise feed without a separate historian export step. But because Chapter 7 leaves every authentication and authorization decision to the broker, an Analytics consumer has no Sparkplug-level way to know whether an NBIRTH or NDATA message it is about to train on, or act on, came from the genuine Edge Node or from a client that obtained valid broker credentials — a gap that matters more, not less, once the consumer on the other end is a model making an unattended decision rather than a person reading a dashboard. The fix is the same one the specification already names: broker-side authentication, TLS, and ACLs scoped per Edge Node, because nothing in the Sparkplug payload itself will ever flag a well-formed but illegitimate message as suspicious.

A workable starting point

  1. Treat Sparkplug B as inheriting the MQTT broker's security, because the specification says exactly thatChapter 7 is explicitly non-normative; there is no Sparkplug-level control to fall back on if the broker is left open.
  2. Confirm TLS is actually enforced on the broker, not just configured as an option, and that every Edge Node connects over it.
  3. Give every Edge Node its own MQTT client credentialsNever share one credential set across a device fleet — a single compromised credential otherwise exposes every Edge Node using it.
  4. Scope broker ACLs per Edge Node, following the specification's own Section 7.4.3 pattern: restrict each client to publishing only its own NBIRTH/NDATA/NDEATH/DBIRTH/DDATA/DDEATH topics and subscribing only to the NCMD/DCMD topics addressed to it.
  5. Patch and harden the Host Application platform itselfwith the same rigor as any privileged OT server — CVE-2025-13911 shows the application receiving every Birth and Death certificate on the bus is a target in its own right, independent of Sparkplug's own design.
  6. If Sparkplug data feeds an analytics or ML pipeline, verify the broker-level controls above before trusting the feed— the pipeline has no independent way to detect a spoofed Edge Node once the data leaves the broker.

A passive capture of MQTT/Sparkplug traffic on a device's network segment is a practical way to check which Edge Node IDs, Group IDs and topics are actually in use, and whether TLS is genuinely in effect, without waiting for an incident to find out the hard way: SoftWSP's OT Snapshot identifies the protocols and connections a device actually uses from that capture and flags patterns such as unencrypted MQTT/Sparkplug traffic or overly broad topic access, with an engineer reviewing every finding and the AI-assisted report citing the specific traffic each finding is based on — see OT Snapshot.

This guide draws on the Eclipse Sparkplug specification version 3.0.0 and its published FAQ fetched directly, NVD's record for CVE-2025-13911, Inductive Automation's own Trust Center advisory page, and NIST SP 800-82 Revision 3, all fetched directly. CISA's ICSA-25-352-01 advisory page is cited by number as the advisory NVD lists for this CVE; it returned an access error to this fetch and no text from it is quoted above. This guide is general information, not a substitute for the Sparkplug specification itself, a current CISA/NVD advisory search for a specific product and firmware version, or an engineer's assessment of a specific network.

Sources

  1. Eclipse Foundation: Sparkplug Specification Version 3.0.0 (21 October 2022) — Chapter 2 (Principles of Operation) and Chapter 7 (Security)
  2. Eclipse Sparkplug: Frequently Asked Questions (what Sparkplug is, the Sparkplug Compatible program)
  3. NVD: CVE-2025-13911 — Inductive Automation Ignition gateway-backup-restore privilege issue (CVSS v3.1 6.4, CWE-250)
  4. Inductive Automation Trust Center: Security Advisories (vendor description of CVE-2025-13911 and coordinated disclosure with CISA)
  5. CISA ICS Advisory ICSA-25-352-01: Inductive Automation Ignition (Update A)
  6. NIST Special Publication 800-82 Revision 3, Guide to Operational Technology (OT) Security (September 2023) — defense-in-depth and legacy OT equipment risk

Frequently asked questions

Does Sparkplug B add its own authentication or encryption on top of MQTT?

No. The Eclipse Sparkplug specification devotes Chapter 7 to security, but opens that chapter with a direct disclaimer: "This chapter is provided for guidance only and is non-normative." Its three subsections describe what to rely on instead, all of it external to Sparkplug itself: Section 7.1 (TLS) states "the MQTT specification does not specify any TCP/IP security scheme as it was envisaged that TCP/IP security would (and did) change over time"; Section 7.2 (Authentication) notes only that "from a pure MQTT client perspective, the client does need to provide a unique Client ID, and an optional username and password"; Section 7.3 (Authorization) observes that "although access control is not mandated in the MQTT specification for use in MQTT Server implementations, Access Control List (ACL) functionality is available for many MQTT Server implementations." Every one of those mechanisms is a property of the MQTT broker a deployment chooses, not of the Sparkplug topic namespace, payload format, or Birth/Death session-state model the specification actually defines.

What are Sparkplug B's Birth and Death certificates, and do they protect against a forged message?

They solve a reliability problem, not a security one. Per the specification, "Birth Certificates MUST be the first MQTT messages published by any Edge Node or any Host Application," using the NBIRTH topic verb, and registering a Death Certificate (NDEATH) as the MQTT CONNECT packet's own Will Message so subscribers learn a node went offline even after an ungraceful disconnect. Each NBIRTH carries a bdSeq number that "MUST start at zero and increment by one on every new MQTT CONNECT packet," and every subsequent NDATA message carries its own sequence number that "MUST have a value of one greater than the previous MQTT message from the Edge Node" (wrapping from 255 back to 0). Host applications use these numbers to detect a dropped or out-of-order message — not to verify who sent it. Nothing in the bdSeq or sequence-number mechanism is cryptographically signed: any MQTT client holding valid broker credentials for that topic can publish a well-formed NBIRTH, NDATA, or NDEATH with the correct sequence number, and a subscriber has no spec-level way to tell it apart from the genuine Edge Node.

Has a product that implements the Sparkplug B host-application role had a disclosed, scored vulnerability?

Yes — in the platform, not in the Sparkplug specification itself. Inductive Automation's Ignition, one of the most widely deployed SCADA/IIoT platforms that ships native Sparkplug B/MQTT modules for the Primary Host Application role the specification describes, carries CVE-2025-13911 (CISA ICSA-25-352-01, CVSS v3.1 base score 6.4, CWE-250 Execution with Unnecessary Privileges). NVD's own record describes it: "Ignition by Inductive Automation with default OS service account settings may expose elevated code execution risk via gateway backup restore. An authenticated Gateway Administrator can import a malicious .gwbk file containing crafted resources, scripts, or modules, resulting in code execution with system-level privileges on Windows (NT AUTHORITY\\SYSTEM) or root/elevated privileges on Linux." Inductive Automation's own Trust Center confirms the same root cause in its own words: "The default Ignition installation on Windows grants greater operating system permissions than is needed in most cases. An Ignition administrator importing malicious project resources could lead to a system level compromise or other significant effects." Reaching that flaw requires an already-authenticated Gateway Administrator account, so it is a privilege-escalation issue in the host platform's default OS permissions, not a break of Sparkplug's topic namespace, payload format, or Birth/Death mechanism — but it lands on exactly the Primary Host Application role that receives and trusts every NBIRTH and NDATA message on the bus.

What should a device maker or integrator using Sparkplug B check first?

Treat Sparkplug B's security posture as entirely a function of the underlying MQTT broker, because that is exactly what the specification itself says to do. Configure TLS on the broker and confirm it is actually enforced, not merely available, since Sparkplug inherits whichever transport the broker was given. Issue every Edge Node its own MQTT client credentials — never share one set across a fleet — and scope broker ACLs per the specification's own worked example in Section 7.4.3, which restricts a client to publishing only its own `NBIRTH`/`NDATA`/`NDEATH`/`DBIRTH`/`DDATA`/`DDEATH` topics and subscribing only to the `NCMD`/`DCMD` topics addressed to it; the spec states this "offer[s] some security in preventing compromised credentials from being able to be used to spoof Edge Nodes, write to other Edge Node outputs, or see all messages flowing through the MQTT Server." Patch and harden the Host Application platform itself (Ignition or any other SCADA/MQTT engine) with the same discipline as any other privileged server, since CVE-2025-13911 shows the platform receiving every Birth and Death certificate on the bus is a target in its own right. And because NIST SP 800-82 Revision 3 observes that OT assets "often have long life cycles" and that equipment running outdated security capabilities "is at greater risk of attacks," do not assume a Sparkplug-speaking Edge Node will ever receive a security-relevant firmware update — segment the MQTT broker and its network path the same way you would any other OT-critical server.

In this cluster

Sparkplug B protocol security: what MQTT's SCADA layer protects, and what it doesn't