Skip to content
GitHubOpen source
Product
Docs
Solutions
IndustriesAll industries
CompareCompare all AI data-leak tools
Benchmarks
GitHubApache-2.0

Secure LLM use in energy and utilities: keep OT details and customer data out of AI prompts

Shadow is for electricity, gas, water and renewable energy companies whose engineering, operations, customer service and IT teams use large language models. It runs on your own machines, replaces OT hostnames, IP and MAC addresses, credentials, site codenames and customer identifiers with fakes before a request reaches the AI provider, and restores them in the answer. For critical infrastructure, the point is simple: the provider should not learn your network layout, your credentials or your customers.

What data leaks into AI tools in energy and utilities

Section titled “What data leaks into AI tools in energy and utilities”
WorkflowWhat typically ends up in the prompt
OT and SCADA troubleshootingRTU and PLC configs, historian queries, alarm logs, device hostnames, IP ranges, service accounts
IT and security operationsFirewall rules, VPN configs, incident timelines, usernames
Engineering studies and reportsSubstation and plant names, project codenames, contractor names
Customer service and billingCustomer names, service addresses, phone numbers, IBANs, payment arrangements, vulnerability flags
Regulatory filings and correspondenceSite names, incident details, staff names
Field work ordersAddresses, access codes, site contacts

Several of these sit inside regulated categories, such as BES Cyber System Information in North America, and almost all are useful reconnaissance for an attacker.

Shadow decrypts only known AI hosts and tunnels every other connection untouched, so it never inspects SCADA, historian or business traffic. For AI requests, it masks values with fakes from a persistent persona and keeps the mapping in an encrypted local vault.

DataHow Shadow handles it
OT and IT hostnameshostname detector; internal_domains covers every subdomain; .internal, .corp, .lan, .local always count as internal
IPv4, IPv6, MAC addressesip and mac detectors, replaced with valid-looking addresses
API keys, tokens, PEM keys, password= assignmentssecret detector; redact with [policy.always]
Substation, plant and project namesDictionary terms
Contractors and partnersorg: terms
Customer names, emails, phones, addressesBuilt-in detectors; report intent tokens for bulk exports
IBANs and card numbersChecksum-validated detectors with checksum-valid fakes
organization = ["Riverside Energy Ltd"]
terms = [
"term:Hollow Creek Substation", "term:Project Beacon",
"org:Contoso Grid Services",
"hostname:hmi-hc-01", "hostname:hist-core-02",
]
internal_domains = ["riverside.example", "ot.riverside.internal"]
[policy.always]
secret = "redact" # never send credentials in any form
[proxy]
upstream_proxy = "http://egress.riverside.internal:3128"
[files]
images = "block" # no OCR: one-line diagrams and HMI screenshots are not masked
RequirementHow Shadow helps
NERC CIP-011 (information protection for BCSI)Masks hostnames, IPs and credentials in AI requests and runs inside your environment. It does not identify BCSI for you or replace your information protection programme
NIS2 (energy, drinking water, wastewater)Supports supply-chain security and data-handling measures for AI services: infrastructure details stay local
TSA security directives, national critical infrastructure guidanceKeeps network details out of third-party services; no telemetry or outbound connections of its own
GDPR Art. 5(1)(c), 25 and 32Minimises and pseudonymises customer data before it reaches the provider. Pseudonymised data remains personal data for you (Recital 26)
ISO/IEC 27001, ISO/IEC 27019, IEC 62443 programmesA documented technical control for AI data flows

What the engineer sends (all data fictional):

Why does polling fail? RTU hc-rtu-03.ot.riverside.internal at 172.16.40.12,
master hmi-hc-01, DNP3 outstation 10, token: api_key=rv-ot-88213

What the provider sees (your fakes will differ):

Why does polling fail? RTU xinghe-srv-07.xinghe.cn at 172.16.91.204,
master xinghe-srv-11, DNP3 outstation 10, token: [REDACTED_SECRET]

The protocol details stay, so the model can still diagnose the problem, and the answer comes back with your real hostnames and IP.

A customer service agent asks to draft a letter to Sarah Murphy at 21 Mill Lane, phone 555-0142, IBAN DE89 3704 0044 0532 0130 00, about her new payment plan. Sarah is the recipient, so her name, address, phone and IBAN pass through as written and each keep is logged; the model writes to the right customer. Anything after “about”, such as a colleague’s name or a meter account holder, is masked and restored in the letter. Set [policy.act] targets = "surrogate" to send a stand-in customer and a mod-97-valid fake IBAN instead, restored in the letter.

An analyst pastes a CSV of 900 work orders and asks for a summary. The rows of personal data make it a report, so Shadow turns customer names, phones and addresses into typed tokens; site terms become consistent fakes. The summary by cause and region is restored locally.

PatternWhen to use it
Endpoint install on IT and engineering workstations: shadow install --applyAPI-backed assistants, scripts and chat clients. Keep AI tools off OT-network hosts entirely if policy requires
Gateway for internal tools, with upstream_proxyCustomer service and engineering assistants you build, using approved egress
Sidecar in KubernetesShared AI services; a NetworkPolicy so only the sidecar reaches providers. See Docker and Kubernetes
Hardened server installSystemd unit with NoNewPrivileges and ProtectSystem=strict, dedicated user, data directory restricted to it

Shadow has no central admin console. Distribute configuration with your existing tooling. Logs show intent and counts per request, never values; an optional local audit log is on the roadmap.

Frequently asked questions

Can utility engineers use AI assistants on SCADA or OT configurations?

Shadow replaces internal hostnames, IP and MAC addresses and recognised secrets with fakes before a config leaves the machine, so the provider does not learn your addressing scheme or credentials. Device models, protocols and logic remain visible. Whether OT configurations may go to an external AI service at all is a decision for your security and compliance teams.

Does Shadow help with NERC CIP-011 BES Cyber System Information?

It can reduce the BCSI in an AI request by masking hostnames, IPs and credentials, and it runs entirely on infrastructure you control. It is not a CIP-011 information protection programme and does not decide whether information is BCSI. Treat it as one technical control.

Should secrets be faked or redacted?

For operational technology, redact. Set [policy.always] secret = "redact" and recognised keys, tokens and password assignments leave as [REDACTED_SECRET], which cannot be reversed. The default fake has the same shape as a real secret, which is convenient for code but gives a weaker guarantee.

Can Shadow send AI traffic through our approved egress?

Yes. Set [proxy] upstream_proxy to an http://, socks5:// or socks5h:// relay and intercepted AI traffic leaves through it. Shadow sends nothing else: no telemetry, no account, no update checks.

Does Shadow mask customer billing data?

Yes for detected identifiers: names, emails, phone numbers, street addresses in English and German styles, IBANs and card numbers. Meter and account numbers are not detected by the built-in detectors; use the NER sidecar, terms or a custom Rust detector.