A test-bench instrument server left with the front door unlocked — but the bench is in a locked room
NI's grpc-device is a gRPC façade that exposes National Instruments hardware driver APIs (DAQ, scopes, signal generators, switches) to remote clients so engineers can script and share lab instruments. The flaw is configuration-by-omission: if the operator does not supply server_cert, server_key, and root_cert in the server config, the daemon silently starts in plaintext, no-auth mode. Any client that can reach the listening port (default 31763) can issue driver calls — meaning *control of attached physical hardware*, raw memory access on some boards, and in certain driver paths, code execution on the host. All shipped versions of grpc-device prior to a TLS-enforcing release are affected; this is a design default, not a regression.
Vendor scored it CVSS 9.1 CRITICAL (AV:N/AC:L/PR:N/UI:N → C:H/I:H/A:N) under the assumption that an internet-reachable instance equals full read/write on the device API. That math is correct in isolation but ignores deployment reality: grpc-device runs on engineering test benches, on lab subnets, on PXI chassis controllers — not on internet-facing tiers. Shodan/Censys exposure for port 31763 is negligible. The vendor severity overstates real-world risk for ~95% of installs. It is still legitimately concerning where the host is dual-homed or where the lab network bridges to corporate AD.
4 steps from start to impact.
Reach the grpc-device listener
nmap -p 31763 --script=grpc-info or grpcurl -plaintext <host>:31763 list. No credentials, no TLS handshake — the listener will enumerate its services on request.- Network reachability to the grpc-device host
- Service running with default/incomplete TLS config
- grpc-device is overwhelmingly deployed on isolated lab VLANs
- Default install does not auto-start as a system service; engineer must launch it
- No DNS records, no public exposure population on Shodan/Censys for port 31763
unknown unless a gRPC plugin is loaded.Enumerate driver services via gRPC reflection
grpcurl -plaintext <host>:31763 list and describe, the attacker lists exposed NI driver services — NI-DAQmx, NI-SCOPE, NI-FGEN, NI-VISA, NI-DCPOWER, NI-SWITCH. Each maps to a hardware driver running with the privilege of the grpc-device process (typically the logged-in engineer's account, sometimes LocalSystem on PXI controllers).- gRPC reflection enabled (default on)
- Step 1 succeeded
- Requires knowledge of NI driver semantics to weaponize beyond denial-of-service
- Public PoC tooling is limited — no Metasploit module, no off-the-shelf exploit kit
grpcurl.exe or unexpected child processes of the grpc-device daemon; Zeek/Suricata gRPC parsers can flag unauthenticated reflection calls.Drive hardware / pivot to host
InitSession and subsequent driver calls. Impact depends on what is wired: a signal generator can deliver damaging voltages to a unit under test; a switch matrix can short test fixtures; on systems exposing NI-VISA raw-memory passthroughs (PXI register access), the attacker can DMA-read driver memory. In a subset of driver paths the daemon also touches LabVIEW Run-Time, which has documented code-execution surface.- Step 2 succeeded
- Attached hardware present
- Driver session can be created without an existing lock
- Most chains end at hardware misuse, not host RCE
- Drivers refuse if another session holds the resource
- Lab hosts rarely store credentials, source code, or pivot material — blast radius caps at the bench
%ProgramData%\National Instruments\...) record session opens; SIEM ingestion of those is rare in practice.Cross-pollinate to corp network (situational)
- Dual-homed host
- Domain-joined lab workstation
- Weak segmentation between lab and corp
- Mature programs air-gap lab subnets or hold them behind a jump host
- Lab hosts are usually local accounts only
The supporting signals.
| In-the-wild exploitation | None observed. No vendor IR reports, no campaign attribution, no GreyNoise tag for port 31763. |
|---|---|
| Public PoC | No weaponized PoC published. Reproduction is trivial with grpcurl -plaintext against any unconfigured instance — no exploit framework needed. |
| EPSS | Expected <0.5% (1st–10th percentile) — low forecasted exploitation probability given near-zero internet exposure. |
| KEV status | Not listed in CISA KEV as of 2026-06-20. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N — network, no auth, no user interaction, high C/I impact. Vector is technically accurate but assumes a reachable network position that is rare in deployment. |
| Affected versions | All ni/grpc-device server builds where TLS config fields (server_cert, server_key, root_cert) are unset or incompletely set. Behavior is documented in the Server Security Support wiki. |
| Fixed version | Vendor mitigation is configuration: supply a full TLS triplet to force secure mode, or run behind mTLS. A future release reportedly refuses to bind on 0.0.0.0 without TLS — confirm with NI advisory. |
| Internet exposure | Shodan / Censys searches for gRPC reflection on port 31763 return a handful of hosts globally (<50 at last sweep). Exposure population is effectively negligible. |
| Disclosed | Public advisory cycle 2026; vendor severity assigned CRITICAL (9.1). |
| Reporter | Vendor self-disclosure via ni/grpc-device project security channel. |
noisgate verdict.
Downgraded from CRITICAL to MEDIUM because the decisive factor is exposure population: grpc-device is a lab/test-bench component, not a server-tier or identity-tier asset, and internet-reachable instance count is in the dozens globally per Shodan/Censys. The attack chain is unauthenticated and trivial, but it terminates at hardware misuse on an isolated bench in the realistic deployment role.
Why this verdict
- Vendor baseline is fair on paper but wrong on population: AV:N/PR:N earns 9.1, but the affected component lives on lab subnets with effectively zero internet footprint — first downward pressure.
- Friction — network position: exploiting requires reachability to a non-standard port (31763) on a host that is rarely routed; attacker must already be inside the lab segment or have a foothold in corp with east-west visibility.
- Friction — weaponization gap: there is no Metasploit module, no public weaponized PoC, and post-exploit value is bounded by what the attached hardware can do (signal generation, switching) rather than data or credentials.
- Role multiplier: low-value role (test bench / engineer workstation) — chain succeeds; blast radius caps at hardware misuse and local code execution on the engineer's box. This is the modal deployment.
- Role multiplier: typical role (shared lab / CI hardware-in-the-loop runner) — chain succeeds; blast radius extends to disrupting test pipelines and tampering with HIL results. Still bench-scoped.
- Role multiplier: high-value role (manufacturing-line PXI controller, OT-adjacent test cell, dual-homed lab → corp) — chain succeeds and blast radius reaches production-test integrity or corp pivot. This role is a minority (<10%) of installs and not canonical for the component, so it lifts the verdict OFF an IGNORE floor but does not pin it to HIGH. If your shop runs grpc-device on a production line or OT-adjacent fixture, escalate this CVE to HIGH locally — the global verdict cannot.
- No KEV, no in-the-wild, low EPSS — no time pressure beyond the noisgate MEDIUM track.
Why not higher?
HIGH would require either a credible high-value deployment role at ≥10% of the installed base (grpc-device is not a hypervisor, IdP, PAM, backup, edge, or CA — it's an instrument bus) or active exploitation evidence. Neither exists. The unauthenticated-network vector looks scary in CVSS but the reachable population is dozens of hosts globally.
Why not lower?
LOW or IGNORE is wrong because the bug is real, the default is genuinely unsafe, and there are non-zero deployments where grpc-device sits on a manufacturing line or on a dual-homed host. Misconfigured instances do exist and the fix is a config change you should make — not something to leave on the backlog forever.
What to do — in priority order.
- Bind grpc-device to localhost only where remote access is not required — Edit the server config to
server_address: 127.0.0.1:31763. Eliminates the remote attack surface entirely. Apply within the noisgate MEDIUM track — i.e., bundle into your next lab-host config sweep; no mitigation SLA applies, so move under the 365-day remediation window. - Enforce the full TLS triplet (
server_cert,server_key,root_cert) on every grpc-device instance that must accept remote calls — Issue certs from your internal PKI, setroot_certto require client certs (mTLS), and verify the server refuses to start in plaintext mode. This is the vendor-blessed mitigation. Complete within the 365-day remediation window; sooner if hosts are dual-homed. - Firewall port 31763 (and any custom grpc-device ports) at the lab-VLAN edge — Default-deny inbound from corp and internet to lab; default-deny outbound from lab to corp except for explicit jump-host paths. This survives operator config drift on individual lab hosts.
- Inventory grpc-device instances — Run
nmap -p 31763 --script=banneracross lab subnets; cross-check against an asset list of NI driver hosts. You likely don't know how many you have. - Subscribe to NI security advisories and pin the grpc-device commit — Track the upstream repo for the planned hardening release that refuses plaintext bind on non-loopback addresses.
- EDR alone — grpc-device is a legitimate binary running as the logged-in user; EDR will not flag unauthenticated gRPC calls landing on it.
- WAFs and API gateways — they sit in front of HTTP/HTTPS app tiers; nobody puts a WAF in front of a lab instrument port.
- Patching to 'the latest version' without changing config — the unsafe default is preserved across versions unless you supply the TLS triplet. Upgrading the binary does not fix a missing cert config.
- Network IDS without a gRPC parser — plaintext gRPC over HTTP/2 will look like generic HTTP/2 traffic to most signature engines.
Crowdsourced verification payload.
Run this from an auditor workstation that has network reach to the candidate lab host. Requires grpcurl installed (brew install grpcurl or download the release binary). Invoke as ./check-ni-grpcdevice.sh <target-host> [port] — example: ./check-ni-grpcdevice.sh labhost-07.lab.corp 31763. No elevated privileges needed; this is an unauthenticated network probe.
#!/usr/bin/env bash
# noisgate verification — CVE-2026-9142 NI grpc-device plaintext default
# Exits: 0 VULNERABLE, 1 PATCHED, 2 UNKNOWN
set -u
HOST="${1:-}"
PORT="${2:-31763}"
if [[ -z "$HOST" ]]; then
echo "usage: $0 <host> [port]" >&2
exit 2
fi
if ! command -v grpcurl >/dev/null 2>&1; then
echo "UNKNOWN: grpcurl not installed" >&2
exit 2
fi
# Step 1: TCP reachability
if ! (exec 3<>/dev/tcp/"$HOST"/"$PORT") 2>/dev/null; then
echo "UNKNOWN: $HOST:$PORT not reachable"
exit 2
fi
exec 3<&- 3>&-
# Step 2: try plaintext reflection — if it answers, TLS is off
PLAIN_OUT=$(grpcurl -plaintext -connect-timeout 5 "$HOST:$PORT" list 2>&1)
if echo "$PLAIN_OUT" | grep -qiE 'nidevice|ni\.|grpc\.reflection'; then
echo "VULNERABLE: $HOST:$PORT answered plaintext gRPC reflection (TLS not enforced)"
echo "--- services ---"
echo "$PLAIN_OUT"
exit 0
fi
# Step 3: try TLS — if it answers, TLS is enforced
TLS_OUT=$(grpcurl -insecure -connect-timeout 5 "$HOST:$PORT" list 2>&1)
if echo "$TLS_OUT" | grep -qiE 'nidevice|ni\.|grpc\.reflection'; then
echo "PATCHED: $HOST:$PORT enforces TLS"
exit 1
fi
echo "UNKNOWN: $HOST:$PORT did not return a recognizable grpc-device response"
echo "plaintext: $PLAIN_OUT"
echo "tls: $TLS_OUT"
exit 2
If you remember one thing.
Sources
- NI grpc-device — Server Security Support wiki
- ni/grpc-device GitHub repository
- gRPC Authentication documentation
- Trend Micro — How Unsecure gRPC Implementations Can Compromise APIs
- IBM PTC — gRPC Security Best Practices
- CWE-306: Missing Authentication for Critical Function
- Datadog — Avoid insecure gRPC connection
- CISA KEV Catalog
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.