Chapter 6 — Internet exposure of building systems
Lesson map
Lesson 06 published. Map, example, EX026.
flowchart TD
N0["Learning outcomes"]
N1["6.1 How it happens"]
N2["6.2 Checking exposure"]
N3["6.3 Reading the result"]
N4["6.4 Responding"]
N5["6.5 Preventing recurrence"]
N6["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Worked example"]
EX --> Q["Exercise EX026"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["6.1 How it happens"]
N2["6.2 Checking exposure"]
N3["6.3 Reading the result"]
N4["6.4 Responding"]
N5["6.5 Preventing recurrence"]
N6["Synthesis"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX026"]
[Learning outcomes]
|
v
[6.1 How it happens]
|
v
[6.2 Checking exposure]
|
v
[6.3 Reading the result]
|
v
[6.4 Responding]
|
v
[6.5 Preventing recurrence]
|
v
[Synthesis]
|
v
[Worked example] --> [Exercise EX026]
Learning outcomes
You will (1) explain why building interfaces end up on the internet; (2) compare an exposure export with an approved list; and (3) respond to an unapproved exposure.
6.1 How it happens
A contractor opens a port so they can reach the BMS web page from home; a lift company adds a router; a firewall rule from a project is never removed. MITRE ATT&CK for ICS lists T0883 Internet Accessible Device for exactly this situation, and CISA advisories repeatedly urge removing control system interfaces from direct internet access.
At Millbrook a rule added in 2023 for chiller commissioning exposed BACnet and the BMS web login directly to the internet, and nobody removed it after the project. Every opening of this kind starts with a reasonable request for convenience. The task is to give contractors a supported route so they do not need to ask for ports.
6.2 Checking exposure
The hospital's network team, or an authorised service, produces a list of the hospital's public addresses and open services. The analyst compares it with the approved list — normally only the remote access gateway.
"""Lab 6: compare a synthetic external-exposure export with approved internet-facing services."""
approved = {("203.0.113.10", 443)}
found = [("203.0.113.10", 443, "VPN gateway"), ("203.0.113.24", 47808, "BACnet/IP"),
("203.0.113.24", 80, "BMS web login")]
for ip, port, svc in found:
print(f"{ip}:{port:<6} {svc:14} {'approved' if (ip, port) in approved else 'NOT APPROVED - report'}")
print("unapproved:", sum((ip, port) not in approved for ip, port, _ in found))
Run with python3 lab_exposure.py. Verified output:
203.0.113.10:443 VPN gateway approved
203.0.113.24:47808 BACnet/IP NOT APPROVED - report
203.0.113.24:80 BMS web login NOT APPROVED - report
unapproved: 2
Get the export from the people who own the addresses, and do not probe hospital addresses yourself unless the network team has authorised it. The approved list should be short and should name an owner for each entry. Lab 6 compares Millbrook's export with an approved list containing only the VPN gateway.
6.3 Reading the result
The VPN gateway on 203.0.113.10 port 443 is approved. Address 203.0.113.24 exposes BACnet/IP on 47808 and a BMS web login on 80. Both are unapproved: anyone on the internet could attempt to read or command controllers, or guess the web password.
The exposure matters more because of what sits behind it. BACnet accepts commands from anyone who can reach it, so this is not only a data leak but a route to theatre air and chiller settings. That combination places it at the top of the analyst's report to the network team and estates.
6.4 Responding
Report at once to the network team and estates; ask the network owner to close the exposure through emergency change; check logs for connections from outside; find who opened it and why, and give them a supported route instead.
Keep the export, the times and the log extracts with the report, because they show how long the exposure lasted and whether anyone used it. At Millbrook the firewall logs showed many outside attempts to reach port 47808 over recent months. That finding is passed to estates to check controller settings and trend logs for changes in the same period.
6.5 Preventing recurrence
Add a monthly exposure check to the network team's calendar, require an end date on every firewall rule opened for a project, and make contractors request remote access through the gateway process rather than asking for ports.
Each measure closes one cause. The monthly check catches what slips through; end dates make project rules expire; the gateway process gives contractors a route that does not need open ports. Track the monthly check in the register with the date and result, so a missed month is visible.
Worked example (synthetic Millbrook)
The network team traces 203.0.113.24 to a firewall rule added in 2023 for a chiller commissioning project. They remove it within the hour; firewall logs show many external connection attempts to port 47808 over recent months. The contractor is given gateway accounts instead.
Synthetic case — Millbrook. The addresses are from the documentation range 203.0.113.0/24 and the events are invented.
Errors and limits
Exposure lists are snapshots; repeat monthly. Only test addresses your organisation owns, through authorised means.
Exercises
- EX026 — How exposure happens. Describe two ways a BMS interface becomes internet-reachable. Rubric: 3 = two concrete routes (contractor port, leftover rule, vendor router); 2 = one; 1 = vague; 0 = none.
- EX027 — Third finding. If the export also found 203.0.113.10 port 22, what would the lab print for it and the total? Rubric: 3 = NOT APPROVED line and "unapproved: 3"; 2 = one; 1 = approved; 0 = none.
- EX028 — Technique name. Which ATT&CK for ICS technique describes the 203.0.113.24 situation? Rubric: 3 = T0883 Internet Accessible Device; 2 = name only; 1 = wrong; 0 = none.
- EX029 — Response steps. List the response steps after finding an unapproved exposure. Rubric: 3 = report, emergency close via owner, check logs, find cause, provide safe alternative; 2 = three; 1 = one; 0 = none.
- EX030 — Testing boundary. Why does Aisha not test other hospitals' addresses "for comparison"? Rubric: 3 = not authorised, potentially illegal, could disrupt; 2 = one; 1 = fine; 0 = none.
Synthesis
Only the gateway faces the internet; anything else found is reported, closed and replaced with a supported route.
Continue studying — chapter 06 of 12
← Chapter 05 (draft) · Course chapter index · Chapter 07 (draft) →