Help us improve
Share bugs, ideas, or general feedback.
From totally-integrated-claude
Analyzes PLC code (SCL, ST, LAD, FBD, SimaticML XML) for security and quality issues, producing a severity-ranked findings report. Useful for automation engineers reviewing exported or pasted PLC code.
npx claudepluginhub czarnak/totally-integrated-claude --plugin totally-integrated-claudeHow this skill is triggered — by the user, by Claude, or both
Slash command
/totally-integrated-claude:plc-code-analysisThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Perform structured, multi-perspective security and quality analysis of PLC code,
Statically reviews exported IEC 61131-3 PLC programs (Ladder, ST, FBD, SFC) for safety-critical defects like E-stop issues, unresolved latches, forced I/O, and interlock bypass risks in OT/ICS environments.
Analyzes PLC firmware for security vulnerabilities including hardcoded credentials, backdoors, memory corruption, and tampering. Covers extraction, static/dynamic analysis, and baseline comparison for Siemens S7, Allen-Bradley, and Schneider Modicon.
Analyzes PLC firmware for security vulnerabilities including hardcoded credentials, backdoors, memory corruption, and tampering. Covers extraction, static/dynamic analysis, and baseline comparison for Siemens S7, Allen-Bradley, and Schneider Modicon.
Share bugs, ideas, or general feedback.
Perform structured, multi-perspective security and quality analysis of PLC code, producing a severity-ranked findings report. Acts as an automated "second pair of eyes" for automation engineers.
This skill is NOT routed by tia-openness-roadmap. It has its own trigger patterns and
operates independently. The Openness roadmap handles engineering automation (create, modify,
import/export via API). This skill handles analysis and review of existing code.
The skill CAN consume code retrieved via MCP tools or Python/C# Openness exports, but it does not depend on them.
Claude receives PLC code in one of three ways. Identify which applies before starting analysis.
The user pastes or uploads .scl, .st, or plain-text PLC code. This is the simplest case.
Parse directly as text. Look for FUNCTION_BLOCK, FUNCTION, ORGANIZATION_BLOCK, DATA_BLOCK
headers to identify block boundaries.
The user provides .xml files exported from TIA Portal. These follow the SimaticML schema.
Key navigation points:
<SW.Blocks.FB>, <SW.Blocks.FC>, <SW.Blocks.OB>, <SW.Blocks.DB> — block type<Interface> → <Section Name="Input|Output|InOut|Static|Temp|Constant"> — variable declarations<ObjectList> → <CompileUnit> — individual networks<FlgNet> inside CompileUnit — LAD/FBD network logic as a directed graph<Access> elements — variable references with scope and UID<Part> elements — instructions (contacts, coils, function calls)<Wire> elements — connections between parts (data/signal flow)<StructuredText> — inline SCL within LAD/FBD networks<Comment> — block and network comments (valuable for process context)BlockType, Number, Programming language,
MemoryLayout (Optimized/Standard), HeaderAuthor, HeaderVersionFor LAD/FBD analysis, reconstruct the logic flow from the <FlgNet> graph:
Parts are nodes, Wires are edges. Follow Powerrail → Contact chain → Coil/Function to
understand each network's behavior.
If the TIA Portal MCP server is available, context retrieval is required before issuing security findings. Use the current Totally Integrated Claude MCP tools:
browse_project_tree — map PLCs, block folders, block names, and execution entry pointsget_block_content — retrieve SIMATIC SD YAML for each block under reviewlist_tag_tables — retrieve PLC tags, user constants, and externally writable namesread_cross_references — inspect call paths, unused blocks, and variable referencesread_hardware_config — retrieve CPU, network, IP, subnet, and interface settingscompile_check — record compile errors/warnings when the user asks for remediationLegacy source documents may name equivalent operations as GetBlocksWithHierarchy,
ExportBlock, GetBlockInfo, GetTypes / GetTypeInfo, or GetHardwareConfig.
Treat those as conceptual aliases, not callable tool names.
If MCP is unavailable or a required context item cannot be retrieved, continue only as a limited review. The final report must include a context manifest and mark affected findings as inference-based where missing declarations, UDTs, call paths, tag tables, or hardware mapping prevent confirmation.
The analysis is performed in sequential passes. Each pass loads one reference file, analyzes the code through that specific lens, and produces findings.
Critical instruction: After each pass, Claude summarizes the findings from that pass in a compact internal list before loading the next reference. This prevents token pressure from accumulating raw analysis across all passes.
| Pass | Reference file | Focus |
|---|---|---|
| 1 | references/process-architect.md | Physical plausibility and process context |
| 2 | references/security-practices.md | Top 20 Secure PLC Coding Practices + communication hardening |
| 3 | references/threat-mapping.md | MITRE ATT&CK for ICS technique identification |
| 4 | references/compiler-critic.md | Siemens platform bugs, CWE memory safety, safety boundary |
| 5 | references/hardware-reviewer.md | Hardware config, access settings, network security |
Pass order rationale: Process context comes first because understanding what the code physically controls determines the severity of all subsequent findings. A missing range check on a status indicator is Low; the same flaw on a chemical dosing pump is Critical.
Before starting the passes, build a compact context manifest:
For each pass:
After all passes, run a final verification synthesis:
compile_check, simulation, or safety reviewIf no hardware configuration data is available (user only provided code, no HW config, no MCP access), the Hardware Reviewer pass still runs but produces a single finding:
#### [INFO] Hardware configuration not available
- **Category:** HW-REVIEW
- **Description:** No hardware configuration data was provided or retrievable.
The following checks could not be performed: PUT/GET access status, web server
settings, communication protocol security, access level configuration,
protection level status.
- **Evidence:** No `read_hardware_config` result or hardware export was available.
- **Inference level:** Confirmed limitation
- **Verification required:** Provide hardware export or enable MCP hardware retrieval.
- **Remediation:** Provide hardware configuration export or enable MCP server
access for a complete security assessment.
After all passes complete, merge findings, deduplicate (same issue found by multiple passes gets the highest severity assigned and cross-references both categories), and sort by severity.
## PLC Code Analysis Report
**Analyzed:** [block names / file names]
**Input format:** SCL / SimaticML XML (LAD) / SimaticML XML (FBD)
**Analysis date:** [date]
**Passes completed:** Process Architect, Security Practices, Threat Mapping,
Compiler Critic, Hardware Reviewer, Verification Synthesis
### Context Manifest
| Context item | Status | Source |
|--------------|--------|--------|
| Block logic | Provided / Retrieved / Missing | Paste / file / `get_block_content` |
| Variable declarations | Complete / Partial / Missing | block interface / XML / YAML |
| UDT and array definitions | Complete / Partial / Missing | source / `get_block_content` |
| Call tree and cross references | Complete / Partial / Missing | `browse_project_tree` / `read_cross_references` |
| Tag tables and external inputs | Complete / Partial / Missing | `list_tag_tables` |
| Hardware and network config | Complete / Partial / Missing | `read_hardware_config` / export |
| Compile baseline | Clean / Warnings / Errors / Not run | `compile_check` / not available |
### Summary
| Severity | Count |
|----------|-------|
| CRITICAL | N |
| HIGH | N |
| MEDIUM | N |
| LOW | N |
| INFO | N |
### Findings
#### [CRITICAL] Finding title
- **Category:** TOP20-P08 / CWE-787 / T0836 / HW-PUTGET (one or more)
- **Location:** FB_MixerControl, Line 47 / Network 3
- **Evidence:** Direct source evidence or retrieved MCP context supporting the finding
- **Inference level:** Confirmed / Probable / Suspicious / Context-limited
- **Confidence:** High / Medium / Low
- **Description:** Clear explanation of the issue
- **Impact:** What could happen if this is exploited or left unaddressed
- **Remediation:** Specific, actionable fix with code example where applicable
- **Verification required:** compile_check / simulation / safety review / hardware review
- **References:** Relevant standard or practice citation
---
[... next finding ...]
| Severity | Criteria |
|---|---|
| CRITICAL | Direct risk to physical safety, process integrity, or enables remote code execution. Immediate action required. |
| HIGH | Significant security gap exploitable by network-level attacker, or logic flaw affecting process control under fault conditions. |
| MEDIUM | Violation of secure coding practice that increases attack surface or reduces defense-in-depth, but requires additional conditions to exploit. |
| LOW | Code quality or style issue that indirectly weakens security posture. Best-practice deviation without immediate risk. |
| INFO | Observation, recommendation, or note about missing context that prevented a complete check. |
Claude must NOT:
Claude MUST: