diff --git a/docs/guide/plc.md b/docs/guide/plc.md index fb65bc8..cf0a7fd 100644 --- a/docs/guide/plc.md +++ b/docs/guide/plc.md @@ -11,6 +11,72 @@ the control application *and* the device it runs on. | A device firmware image | Firmware SBOM / CVE (opt-in) | | A reachable endpoint (WebVisu, OPC UA) | DAST / pentest (opt-in) | +## Anatomy: a soft PLC is a SoC + Linux + runtime + +A CODESYS controller is **not** a monolithic appliance like a classic Siemens +S7. It is **PC-based ("soft") control** — commodity silicon running a +general-purpose Linux, with a **software PLC runtime** as just another process: + +| Classic PLC (e.g. Siemens S7) | Soft PLC (CODESYS-on-Yocto, OpenPLC-on-Raspbian) | +| --- | --- | +| Proprietary hardware + firmware | Commodity SoC (x86 / ARM) | +| Proprietary OS | General-purpose Linux (a **Yocto** image, or Raspbian) | +| Proprietary runtime | Software runtime (**CODESYS Control**, or OpenPLC) | +| STEP7 / TIA project | IEC 61131-3 control app (ST / LD / FBD / SFC) | + +Because of this, the device is built along **two independent tracks**, by +different people, on different timelines, and shipped separately. It also +inherits the **entire Linux / IT attack surface on top of** the OT / control +one — which is exactly why a PLC/SPS target is treated as a **composite**: +Certifai ingests one artifact per layer and scans each with the right pipeline. + +```mermaid +flowchart TB + subgraph TA["Track A · Device platform — built by the hardware OEM / vendor"] + direction LR + A1["Yocto / OpenEmbedded
BSP + RT kernel"] --> A2["Bake in the CODESYS
Control for Linux runtime"] --> A3["bitbake → device image
.wic / .tar + manifest"] + end + subgraph TB2["Track B · Control application — built by the machine builder / customer"] + direction LR + B1["CODESYS IDE
ST / LD / FBD / SFC + WebVisu"] --> B2["Reference CODESYS +
vendor libraries"] --> B3["Compile → download
to device (gateway 11740)"] + end + + A3 --> DEV(["Running soft-PLC device
SoC + Linux + runtime + control app
Modbus · OPC UA · EtherNet/IP · WebVisu"]) + B3 --> DEV + + subgraph CERT["What Certifai scans — one layer per artifact"] + direction LR + S1["Firmware layer
FirmwareStatic · SBOM · CVE"] + S2["Control-logic layer
PLC SAST — ST + FBD/LD"] + S3["Control-app SBOM
libraries + runtime → CVE"] + S4["Running layer
ICS probe · DAST (WebVisu)"] + end + + A3 -. firmware image .-> S1 + B1 -. PLCopen XML / ST via git .-> S2 + B2 -. projectarchive (zip) .-> S3 + DEV -. live URL / provisioned .-> S4 + + classDef yocto fill:#fde68a,stroke:#b45309,color:#111 + classDef codesys fill:#bfdbfe,stroke:#1d4ed8,color:#111 + classDef dev fill:#e9d5ff,stroke:#7e22ce,color:#111 + classDef cert fill:#bbf7d0,stroke:#15803d,color:#111 + class A1,A2,A3 yocto + class B1,B2,B3 codesys + class DEV dev + class S1,S2,S3,S4 cert +``` + +::: tip Where Yocto fits +Yocto is **Track A** — the *build system* for the device platform. It produces +the Linux image and bakes in the CODESYS runtime, so it is the **firmware +layer**, entirely separate from the control application. Hand it to Certifai as +its own **firmware image** artifact (scanned by the firmware pipeline, not the +PLC pipeline). The device OS need not be Yocto — Raspbian/Debian/Buildroot, or +even an RTOS / bare-metal, are all possible — but Yocto is the common, +product-grade industrial choice. +::: + ## Two ways to deliver the project You can either **upload** the project when onboarding, or point Certifai at a