The family, and what it does not cover¶
Twelve machines, ten industrial domains, one attack. This page is the family portrait, and it exists so the three benchmarks that have not had a lesson of their own are still accounted for.
The whole set¶
| domain | benchmark | what must never happen | lesson |
|---|---|---|---|
| manufacturing | g_conveyor_interlock |
belt runs with the E-stop pressed | 2.1 |
| chemical_batch | g_batch_reactor |
feed opens under overpressure | 2.2 |
| traffic | g_traffic_light |
two conflicting greens | 2.3 |
| elevator | g_elevator_door |
car moves with the door open | 2.4 |
| hvac | g_hvac_fan_delay |
heating and cooling drive together | 2.5 |
| power_substation | g_busbar_interlock |
two feeders parallel the bus | 2.6 |
| power_substation | g_substation_breaker |
breaker closes into a fault | 2.6 |
| power_substation | g_transformer_protect |
transformer energizes hot | 2.6 |
| building_automation | g_building_lighting |
master-off fails to win | 2.7 |
| chemical_batch | g_batch_mixer |
mixer runs with the lid open | this page |
| packaging | g_packaging_filler |
fill valve opens on a full bottle | this page |
| motor_control | g_motor_interlock |
both contactors close | this page |
The last three are the same construction and need no separate walk-through. The mixer guards a person reaching into a vessel. The filler guards a bottle that is already full, so the cost is product on the floor rather than a hand in a machine. The motor interlock is the reversing starter from lesson 1.3, carried into this part as a catalog benchmark with its own clean and bombed pair.
Every one of the twelve is validation_status: validated, every one has a clean variant
and a seeded variant, and every one is refuted by both ESBMC builds.
What is identical across all twelve¶
A parallel branch, conducting exactly when the protective contact would have opened, gated on an input that no normal operation asserts. Trigger, payload, dormancy, in four elements.
Nothing about the plant appears in that shape. Swap the variable names and the busbar becomes the conveyor. That is what makes it worth studying as a family rather than as twelve incidents: an attacker who has this pattern does not need to understand your process, only to find the contact that stands between a command and the thing it must not do.
What changes across the twelve¶
Who gets hurt, and how fast. The conveyor and the mixer injure whoever is at the machine, immediately. The reactor and the transformer damage plant over minutes. The filler spills product. The lighting circuit costs energy and a complaint.
Whether the mitigations still work. The reactor's vent keeps venting and the substation's lockout keeps locking out, so the HMI looks correct while the attack runs. That was the subject of 2.2 and it recurs everywhere the plant has more than one protection.
Whether the branch is even wrong. 2.7 is the same edit as a legitimate maintenance override, and only the property decides.
Whether a tool can see it. 2.4 has the same hazard as a chart, where a one-letter change to an action qualifier is invisible to ESBMC because the SFC body is never read.
What this part does not cover¶
Every trigger here is an input pattern. Assert maint with the right conditions and the
payload fires in the same scan.
That is one shape out of several. A trigger can be a counter that reaches a threshold after fifty scans, so nothing happens during commissioning and everything happens in week three. It can be a comparison against a sensor value that only occurs at a particular tank level. It can be a loop that stops terminating, so the payload is not a wrong output but a controller that never completes a scan at all.
The suite has all of those. Thirty benchmarks carry the llb tag, and the twelve
here are the simplest twelve. The eight g_tank_* programs never terminate,
tank_overflow and sensor_forge arm on a fifty-scan fuse, and counter_scalability
sweeps a threshold up to 32767 to find where bounded checking gives out.
Those are organized by attack rather than by plant, which is the next part.
The one thing to carry forward¶
A property caught every bomb in this part, and no property was longer than a line. None of them required understanding the attack, or anticipating the attacker, or knowing that an attacker existed. They required knowing what the machine must never do.
That is a much easier thing to write down, and it is the only thing that scales: there are more ways to attack a program than anyone can enumerate, and one way for a conveyor to be unsafe.