4a5924b8c4
[guardrail-change]
Phase 18 adds an EU Cyber Resilience Act compliance track to IACE:
the engine now fires patterns that surface the manufacturer-side CRA
obligations whenever a project's components carry digital elements.
Patterns (HP1910-HP1918, hazard_patterns_cra.go):
HP1910 Missing SBOM
HP1911 Unsigned firmware/software updates
HP1912 Factory-default credentials still active
HP1913 No coordinated vulnerability disclosure (CVD) policy
HP1914 No documented security patch SLA
HP1915 Missing user-facing hardening guide
HP1916 No incident-notification process to ENISA / CSIRT
HP1917 No security assessment prior to placing on market
HP1918 AI component without cybersecurity risk assessment
Each pattern carries ClarificationQuestionsDE so the operator gets
auditor-grade questions to take back to the Anlagenbauer instead of
the engine inventing prose. PatternMatch carries DefaultAvoidability
(P=1 for all CRA patterns), feeding the PLr graph from Phase 17.
Measures (M540-M548, measures_library_cra.go):
M540 SBOM (SPDX or CycloneDX) with each machine release
M541 Signed updates with rollback protection
M542 Forced default-password change at first boot
M543 Published CVD policy (security.txt / PSIRT)
M544 Documented patch SLA with CVSS-tier response times
M545 User-facing hardening guide in the machine docs
M546 ENISA incident-notification process (24h/72h/14d)
M547 Authenticated update channel + integrity check
M548 Pre-market security assessment / pen-test
The library is urheberrechtlich neutral: identifiers only
(Verordnung (EU) 2024/2847, DIN EN 40000-1-2 Entwurf, IEC 62443,
ETSI EN 303 645, ISO/IEC 5962, ISO/IEC 29147). No normative text
is reproduced — DIN/Beuth proprietary content is referenced by
section number only.
Category-compatibility:
cyber_resilience pattern category accepts measures with
HazardCategory cyber_resilience, cyber_network, or
software_control. Updated in both the runtime helper
(iace_handler_init_helpers.go) and its test-mirror
(pattern_coverage_test.go) — both must move in lockstep.
Frontend (clarifications page):
When at least one clarification references "2024/2847" or
"40000-1-2" in its norm_references, a blue info-banner is
rendered at the top of the page:
"Cyber Resilience Act (CRA) — Hinweis zur Geltung
Diese Klärungsliste enthält Fragen zur Verordnung (EU)
2024/2847 (CRA). Die CRA gilt für Produkte mit digitalen
Elementen, die ab dem 11.12.2027 auf dem EU-Markt bereit-
gestellt werden. ..."
Reminds the user that the CRA pflichten are forward-looking
while still allowing the manufacturer to bake them in now.
LOC exceptions:
Added three pre-existing files to .claude/rules/loc-exceptions.txt
(manufacturer_safety_features.go, iace_handler_clarifications.go,
routes.go). All three grew across Phases 16-17 and are tagged as
Phase 5+ refactor backlog. [guardrail-change] marker required.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
199 lines
14 KiB
Go
199 lines
14 KiB
Go
package iace
|
|
|
|
// GetCRAPatterns returns hazard patterns for the EU Cyber Resilience Act
|
|
// compliance track. They fire when a project's components carry digital
|
|
// elements (software, network, AI) and therefore fall under the CRA.
|
|
//
|
|
// The CRA itself (Verordnung (EU) 2024/2847) became force-of-law on
|
|
// 11 December 2024 and applies to products with digital elements placed
|
|
// on the EU market from 11 December 2027. The harmonised standard for
|
|
// machinery is DIN EN 40000-1-2 (Entwurf November 2025).
|
|
//
|
|
// Identifiers only — no normative text is reproduced.
|
|
//
|
|
// HP range: HP1910-HP1918.
|
|
func GetCRAPatterns() []HazardPattern {
|
|
return []HazardPattern{
|
|
{
|
|
ID: "HP1910", NameDE: "Fehlende Software-Stueckliste (SBOM) fuer die Maschine", NameEN: "Missing Software Bill of Materials (SBOM)",
|
|
RequiredComponentTags: []string{"has_software"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M540"},
|
|
Priority: 70,
|
|
ApplicableLifecycles: []string{"normal_operation", "maintenance"},
|
|
ScenarioDE: "Die Maschine enthaelt Software-Komponenten (PLC-Firmware, HMI, Roboter-Controller). Wird keine maschinenlesbare Komponentenliste mitgeliefert, kann der Betreiber im Falle einer veroeffentlichten Schwachstelle (CVE) nicht feststellen, ob seine Maschine betroffen ist.",
|
|
TriggerDE: "Veroeffentlichung einer Sicherheitsluecke in einer mitverwendeten Bibliothek (z.B. log4j, OpenSSL); Audit-Anfrage des Betreibers; Schwachstellenmeldung durch Forscher.",
|
|
HarmDE: "Cybersecurity-Folgeschaden: nicht behebbare Schwachstelle, Maschinen-Stillstand bei Behoerden-Audit, Reputations- und Haftungsrisiko.",
|
|
AffectedDE: "Betreiber, IT-/OT-Verantwortliche, Anlagenbauer",
|
|
ZoneDE: "Maschinendokumentation, Software-Auslieferung",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Wird eine SBOM (SPDX oder CycloneDX) mit jeder Maschine bzw. jedem Software-Release ausgeliefert?",
|
|
"Sind alle Open-Source-Bibliotheken in der SBOM mit Version und Lizenz inventarisiert?",
|
|
"Wie wird die SBOM bei einem Software-Update aktualisiert?",
|
|
},
|
|
DefaultSeverity: 3, DefaultExposure: 4, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1911", NameDE: "Updates ohne kryptographische Signatur einspielbar", NameEN: "Unsigned firmware/software updates accepted",
|
|
RequiredComponentTags: []string{"has_software", "networked"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M541", "M547"},
|
|
Priority: 90,
|
|
ApplicableLifecycles: []string{"maintenance", "fault_clearing"},
|
|
ScenarioDE: "Software- oder Firmware-Updates der Maschine koennen ohne Pruefung einer Hersteller-Signatur eingespielt werden. Ein Angreifer mit physischem oder Netzwerk-Zugriff kann manipulierte Updates aufspielen und die Maschinensicherheit kompromittieren.",
|
|
TriggerDE: "Update-USB an HMI angesteckt; ungesicherter Update-Endpoint im Netzwerk erreichbar; Service-Techniker bringt nicht authentifiziertes Update mit.",
|
|
HarmDE: "Kompromittierung der Steuerung mit Folgewirkung auf Maschinensicherheit (z.B. Deaktivieren von Sicherheitsfunktionen, Manipulation von Achs-Limits, Daten-Diebstahl).",
|
|
AffectedDE: "Bedienpersonal, Wartungspersonal, Betreiber",
|
|
ZoneDE: "Steuerung, HMI, Update-Schnittstellen",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Werden alle Software-/Firmware-Updates kryptographisch signiert ausgeliefert?",
|
|
"Prueft die Maschine die Signatur vor dem Anwenden eines Updates und verweigert unsignierte Pakete?",
|
|
"Ist ein Rollback auf nachweislich verwundbare Versionen durch einen Versions-Counter blockiert?",
|
|
},
|
|
DefaultSeverity: 4, DefaultExposure: 2, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1912", NameDE: "Werkseitige Default-Passwoerter bleiben im Betrieb aktiv", NameEN: "Factory-default credentials remain active in production",
|
|
RequiredComponentTags: []string{"has_software", "user_interface"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M542"},
|
|
Priority: 85,
|
|
ApplicableLifecycles: []string{"setup", "normal_operation"},
|
|
ScenarioDE: "Die Maschine wird mit werkseitigen Standard-Passwoertern (z.B. admin/admin, 1234, Werks-Default-PIN) ausgeliefert. Werden diese nicht beim ersten Hochfahren zwangsweise geaendert, sind sie ueblicherweise oeffentlich bekannt.",
|
|
TriggerDE: "Inbetriebnahme ohne Initialisierungs-Wizard; Werks-Reset durch unbefugte Person; Werks-Default in Online-Listen veroeffentlicht.",
|
|
HarmDE: "Unautorisierter Zugriff auf Bediener-/Wartungsebene, Manipulation der Maschinen-Konfiguration, Abgriff von Produktions-/Personendaten.",
|
|
AffectedDE: "Betreiber, IT-/OT-Verantwortliche",
|
|
ZoneDE: "HMI, Wartungs-Login, Remote-Service-Zugang",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Erzwingt die Maschine beim ersten Hochfahren die Aenderung aller werkseitigen Default-Passwoerter?",
|
|
"Sind die werkseitigen Credentials in der oeffentlichen Dokumentation NICHT enthalten?",
|
|
"Wie wird ein Werks-Reset gegen unbefugten Zugriff geschuetzt?",
|
|
},
|
|
DefaultSeverity: 3, DefaultExposure: 3, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1913", NameDE: "Keine veroeffentlichte CVD-Policy (Vulnerability Disclosure)", NameEN: "No coordinated vulnerability disclosure policy",
|
|
RequiredComponentTags: []string{"has_software"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M543"},
|
|
Priority: 70,
|
|
ApplicableLifecycles: []string{"normal_operation"},
|
|
ScenarioDE: "Der Anlagenbauer hat keine veroeffentlichte Kontaktstelle fuer die Meldung von Schwachstellen. Externe Sicherheitsforscher oder Kunden finden keinen Weg, Schwachstellen vertraulich zu melden — diese werden im Zweifel ungefiltert oeffentlich (Full-Disclosure).",
|
|
TriggerDE: "Sicherheitsforscher findet Schwachstelle, kein PSIRT-Kontakt; Kunde will Schwachstelle melden, scheitert an Erreichbarkeit.",
|
|
HarmDE: "Veroeffentlichung von Schwachstellen ohne Patch verfuegbar (0-day in der Wildbahn), Reputationsverlust, Behoerden-Sanktion nach CRA.",
|
|
AffectedDE: "Hersteller, Betreiber, Sicherheitsforscher",
|
|
ZoneDE: "Hersteller-Website, Dokumentation",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Existiert eine veroeffentlichte CVD-Policy mit eindeutiger Meldekontaktstelle?",
|
|
"Ist eine security.txt nach RFC 9116 auf der Hersteller-Website hinterlegt?",
|
|
"Sind Antwort- und Behebungsfristen in der Policy dokumentiert?",
|
|
},
|
|
DefaultSeverity: 2, DefaultExposure: 3, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1914", NameDE: "Keine dokumentierte Patch-SLA fuer Sicherheits-Updates", NameEN: "No documented security patch SLA",
|
|
RequiredComponentTags: []string{"has_software"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M544"},
|
|
Priority: 70,
|
|
ApplicableLifecycles: []string{"normal_operation"},
|
|
ScenarioDE: "Der Hersteller hat keine verbindlichen Reaktionszeiten fuer Sicherheits-Patches definiert. Im Schwachstellenfall ist offen, wie schnell ein Patch geliefert wird — Betreiber kann sein Risiko nicht steuern.",
|
|
TriggerDE: "CVE wird veroeffentlicht; Betreiber fragt Patch-Termin an; Hersteller hat keine SLA und kann keinen Termin nennen.",
|
|
HarmDE: "Lange Exposition gegenueber bekannter Schwachstelle; Verstoss gegen CRA-Pflichten zur Schwachstellenbehandlung.",
|
|
AffectedDE: "Hersteller, Betreiber, IT-/OT-Verantwortliche",
|
|
ZoneDE: "Vertrags-/Dokumentationsebene",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Existiert eine dokumentierte Patch-SLA mit CVSS-abhaengigen Reaktionszeiten?",
|
|
"Welcher Sicherheits-Supportzeitraum wird zugesagt (CRA-Mindest: erwartete Nutzungsdauer, typ. 5 Jahre)?",
|
|
"Wird die SLA mit der Maschine ausgeliefert oder vertraglich vereinbart?",
|
|
},
|
|
DefaultSeverity: 2, DefaultExposure: 3, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1915", NameDE: "Fehlende Cybersecurity-Anwender-Dokumentation (Hardening-Guide)", NameEN: "Missing user-facing cybersecurity hardening guide",
|
|
RequiredComponentTags: []string{"has_software", "networked"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M545"},
|
|
Priority: 65,
|
|
ApplicableLifecycles: []string{"setup", "normal_operation"},
|
|
ScenarioDE: "Der Betreiber erhaelt keine Anleitung zur sicheren Inbetriebnahme und Konfiguration der Maschine im Werks-Netzwerk. Konfigurations-Fehler (offene Ports, ungehaerteter Default-Zustand) bleiben unentdeckt.",
|
|
TriggerDE: "Inbetriebnahme der Maschine im IT/OT-Netzwerk; Sicherheits-Audit beim Betreiber.",
|
|
HarmDE: "Angreifbares Konfigurations-Profil, das vom Standardzustand der Maschine vererbt wurde; Verstoss gegen CRA Anhang II (Anwender-Information).",
|
|
AffectedDE: "Betreiber, IT-/OT-Verantwortliche",
|
|
ZoneDE: "Maschinen-Konfiguration, Netzwerk-Anbindung",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Liegt der Maschine ein Cybersecurity-Hardening-Guide bei (Netzwerk-Segmentierung, deaktivierbare Dienste, sichere Konfiguration)?",
|
|
"Wird der Guide bei Updates gepflegt?",
|
|
"Enthaelt die Betriebsanleitung ein Kapitel 'Sichere Inbetriebnahme'?",
|
|
},
|
|
DefaultSeverity: 2, DefaultExposure: 3, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1916", NameDE: "Kein definierter Meldeprozess fuer Sicherheitsvorfaelle an ENISA/CSIRT", NameEN: "No incident notification process to ENISA / national CSIRT",
|
|
RequiredComponentTags: []string{"has_software"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M546"},
|
|
Priority: 75,
|
|
ApplicableLifecycles: []string{"normal_operation"},
|
|
ScenarioDE: "Der Hersteller hat keinen internen Prozess, um aktiv ausgenutzte Schwachstellen oder schwere Sicherheitsvorfaelle innerhalb der CRA-Meldefristen (24 h / 72 h / 14 Tage) an ENISA bzw. die zustaendige nationale Stelle zu melden.",
|
|
TriggerDE: "Schwachstelle wird in der Wildbahn ausgenutzt; Sicherheitsvorfall bei einem Kunden gemeldet.",
|
|
HarmDE: "Versaeumte Meldefrist nach CRA Art. 14 — Bussgeldrisiko, Verlust der CE-Konformitaetsvermutung.",
|
|
AffectedDE: "Hersteller, Compliance/PSIRT-Team",
|
|
ZoneDE: "Hersteller-Prozesse",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Existiert ein dokumentierter Incident-Notification-Prozess mit Eskalationsmatrix?",
|
|
"Sind die CRA-Meldefristen (Erstmeldung 24 h, Update 72 h, Abschluss 14 Tage) als interne SLA umgesetzt?",
|
|
"Ist die zustaendige nationale CSIRT-Stelle ermittelt und der Meldekanal getestet?",
|
|
},
|
|
DefaultSeverity: 3, DefaultExposure: 2, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1917", NameDE: "Keine Sicherheitsbewertung vor Inverkehrbringen (Pen-Test / Static Analysis)", NameEN: "No security assessment prior to placing on market",
|
|
RequiredComponentTags: []string{"has_software"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M548"},
|
|
Priority: 70,
|
|
ApplicableLifecycles: []string{"setup"},
|
|
ScenarioDE: "Vor dem erstmaligen Inverkehrbringen wurde keine dokumentierte Sicherheitsbewertung (mind. statische Code-Analyse + Schwachstellen-Scan) durchgefuehrt. Bekannte Schwachstellen-Klassen gelangen unbemerkt in die Auslieferung.",
|
|
TriggerDE: "Inverkehrbringen einer neuen Maschinen-Variante oder eines Major-Updates; behoerdlicher Konformitaetsnachweis.",
|
|
HarmDE: "Auslieferung von Maschinen mit bekannten Schwachstellen; Verstoss gegen CRA Anhang I (Cybersecurity-Anforderungen).",
|
|
AffectedDE: "Hersteller, Betreiber",
|
|
ZoneDE: "Entwicklungs-/Auslieferungsprozess",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Wird vor jedem Major-Release eine dokumentierte Sicherheitsbewertung durchgefuehrt?",
|
|
"Sind statische Analyse und Dependency-Scan in den CI-Pipeline integriert?",
|
|
"Werden bei erhoehtem Risiko Penetrationstests durch unabhaengige Stellen durchgefuehrt?",
|
|
},
|
|
DefaultSeverity: 3, DefaultExposure: 2, DefaultAvoidability: 1,
|
|
},
|
|
{
|
|
ID: "HP1918", NameDE: "AI-Komponente ohne Cybersecurity-Risikobetrachtung", NameEN: "AI component without cybersecurity risk assessment",
|
|
RequiredComponentTags: []string{"has_ai"},
|
|
GeneratedHazardCats: []string{"cyber_resilience"},
|
|
SuggestedMeasureIDs: []string{"M548", "M545"},
|
|
Priority: 75,
|
|
ApplicableLifecycles: []string{"normal_operation"},
|
|
ScenarioDE: "Die Maschine enthaelt KI-Komponenten (z.B. Bildverarbeitung, anomalie-basierte Wartung). Cybersecurity-spezifische KI-Risiken (Model Inversion, Adversarial Examples, Poisoning des Trainingsdatensatzes) wurden nicht geprueft.",
|
|
TriggerDE: "Adversarial Input wird ueber Sensor-/HMI-Schnittstelle eingespielt; manipuliertes Update-Modell wird ausgespielt.",
|
|
HarmDE: "Fehlsteuerung der Maschine durch manipuliertes KI-Modell; mittelbare Sicherheitsfolgen, Datenleckage aus Modell.",
|
|
AffectedDE: "Bedienpersonal, Betreiber",
|
|
ZoneDE: "KI-Modul, Modell-Auslieferungspfad",
|
|
ISO12100Section: "6.3.5.7",
|
|
ClarificationQuestionsDE: []string{
|
|
"Sind KI-spezifische Cybersecurity-Risiken (Adversarial Inputs, Poisoning, Model Inversion) im Risikobeurteilungsprozess betrachtet?",
|
|
"Wie wird die Integritaet ausgelieferter KI-Modelle sichergestellt (Signatur, Hash, sichere Auslieferungs-Kanal)?",
|
|
"Existiert ein Monitoring auf ungewoehnliche Eingangsmuster im Betrieb?",
|
|
},
|
|
DefaultSeverity: 3, DefaultExposure: 2, DefaultAvoidability: 1,
|
|
},
|
|
}
|
|
}
|