Dreigingsmodellering voor AI-infrastructuur met STRIDE
Systematische dreigingsmodelleringsmethodologie voor AI/ML-systemen met STRIDE, dataflowdiagrammen en aanvalsbomen toegesneden op machine learning-pijplijnen
Overzicht
Dreigingsmodellering is het gestructureerde proces van het identificeren van beveiligingsdreigingen, het begrijpen van hun potentiële impact en het prioriteren van tegenmaatregelen voordat een aanvaller ze misbruikt. Voor AI-infrastructuur is dreigingsmodellering essentieel omdat AI-systemen unieke eigenschappen hebben die traditionele dreigingsmodellen niet weten te vatten: de trainingsdata maakt deel uit van het aanvalsoppervlak, het model zelf kan een doelwit of een wapen zijn, het gedrag van het systeem verandert met elke hertrainingscyclus, en de grens tussen "bedoeld gedrag" en "kwetsbaarheid" is voor lerende systemen vaak onduidelijk.
Microsofts STRIDE-framework — Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service en Elevation of Privilege — biedt een systematische aanpak voor het identificeren van dreigingen die, mits goed aangepast, goed aansluit op AI-infrastructuur. Een naïeve toepassing van STRIDE op AI-systemen mist echter kritieke dreigingen. Datavergiftiging is bijvoorbeeld een vorm van "Tampering" die het trainingsproces als doelwit heeft in plaats van een runtime-invoer, en modelextractie via inferentie-API's is "Information Disclosure" die plaatsvindt via legitiem gebruik van het systeem in plaats van via een kwetsbaarheid in de traditionele zin.
Dit artikel presenteert een uitgebreide dreigingsmodelleringsmethodologie voor AI-infrastructuur die STRIDE uitbreidt met AI-specifieke dreigingscategorieën, laat zien hoe je dataflowdiagrammen maakt voor veelvoorkomende ML-architecturen, en biedt sjablonen en tools voor het uitvoeren en documenteren van dreigingsmodelleringssessies. De methodologie sluit aan op NIST AI RMF, MITRE ATLAS en de OWASP Machine Learning Security Top 10.
STRIDE toegepast op AI-infrastructuur
Spoofing in AI-systemen
Spoofingdreigingen houden in dat een aanvaller zich voordoet als iets of iemand die hij niet is. In AI-infrastructuur neemt spoofing verschillende unieke vormen aan:
| Spoofing-doelwit | AI-specifieke dreiging | Impact |
|---|---|---|
| Databron | Injecteer trainingsdata van een vervalste dataleverancier | Model leert van door aanvaller gecontroleerde data |
| Modelartefact | Vervang het legitieme model door het model van de aanvaller | Inferentie produceert door aanvaller gecontroleerde uitvoer |
| Inferentieclient | Doe je voor als een geautoriseerde client om toegang te krijgen tot modellen | Ongeautoriseerde modeltoegang, potentiële extractie |
| Pijplijnfase | Spoof een component van de trainingspijplijn | Injecteer kwaadaardige stappen in de ML-pijplijn |
| Monitoringsignaal | Vervalste metrics om modeldegradatie te verbergen | Verhult een lopende aanval op het model |
| Featurebron | Spoof feature store-data tijdens inferentie | Manipuleer modelinvoer voor specifieke uitkomsten |
Tampering in AI-systemen
Tampering is het wijzigen van data in transit of in rust. Voor AI-systemen zijn tamperingdreigingen bijzonder ingrijpend omdat ze het geleerde gedrag van het model zelf kunnen beïnvloeden:
- Tampering van trainingsdata: Het wijzigen van trainingsdata om backdoors te injecteren of de modelnauwkeurigheid te verlagen. Dit is de klassieke datavergiftigingsaanval.
- Tampering van modelgewichten: Het direct wijzigen van modelgewichten in opslag om het inferentiegedrag te veranderen. Zelfs kleine verstoringen kunnen gerichte misclassificatie veroorzaken.
- Tampering van features: Het wijzigen van features in de feature store of tijdens het ophalen van features om inferentieresultaten te manipuleren.
- Tampering van de pijplijn: Het wijzigen van trainingspijplijncode, hyperparameters of configuratie om gecompromitteerde modellen te produceren.
- Tampering van gradiënten: Bij federated learning kunnen kwaadwillende deelnemers vergiftigde gradiënten sturen die het globale model bijsturen.
Information Disclosure in AI-systemen
- Modelextractie: Het systematisch bevragen van het model via zijn API om een functioneel equivalente kopie te reconstrueren.
- Extractie van trainingsdata: Het gebruiken van modelmemorisatie om individuele trainingsvoorbeelden te onttrekken via zorgvuldig opgestelde prompts.
- Membership inference: Het bepalen of een specifiek datapunt is gebruikt tijdens de training.
- Architectuuronthulling: Het onttrekken van details over de modelarchitectuur via API-responses, timing-zijkanalen of metadata-endpoints.
- Onthulling van credentials: AI-infrastructuurcomponenten (trainingstaken, serving-endpoints) hebben vaak toegang tot brede cloud-credentials die via SSRF of andere kwetsbaarheden zouden kunnen worden blootgesteld.
Denial of Service in AI-systemen
- Uitputting van inferentieresources: Het maken van invoer die GPU-rekenkracht, geheugen of tijd maximaliseert (bijv. prompts met maximale lengte voor LLM's).
- Verstoring van training: Het monopoliseren van resources van de GPU-scheduler, het corrumperen van trainingsdata om trainingsfouten te veroorzaken, of het laten crashen van trainingstaken.
- Modeldegradatie: Het geleidelijk verslechteren van modelprestaties via data-drift-injectie of strategische ontduiking, waardoor het model onbruikbaar wordt.
- Pijplijn-DoS: Het triggeren van overmatige hertrainingscycli of het overweldigen van het modelregister.
Elevation of Privilege in AI-systemen
- Container-escape vanuit GPU-pods: Het misbruiken van kwetsbaarheden in de container-runtime met de verhoogde privileges die gebruikelijk zijn in GPU-workloads.
- Misbruik van service accounts: Trainingstaken of serving-pods met te brede IAM-rollen die kunnen worden gebruikt om toegang te krijgen tot niet-gerelateerde resources.
- Privilege-escalatie in de pijplijn: Het gebruiken van uitvoeringsmogelijkheden van de pijplijn om willekeurige code uit te voeren met de rechten van het service account van de pijplijn.
AI-dataflowdiagrammen bouwen
Kern-DFD-elementen voor ML-systemen
Dataflowdiagrammen (DFD's) vormen de basis van STRIDE-dreigingsmodellering. Voor AI-systemen moet de DFD zowel de traditionele softwarecomponenten als de ML-specifieke dataflows vastleggen:
"""
AI infrastructure data flow diagram generator.
Creates structured DFD representations for threat modeling
ML systems using STRIDE.
"""
import json
from dataclasses import dataclass, field
from typing import Optional
from enum import Enum
class ElementType(Enum):
PROCESS = "process"
DATA_STORE = "data_store"
EXTERNAL_ENTITY = "external_entity"
DATA_FLOW = "data_flow"
TRUST_BOUNDARY = "trust_boundary"
class TrustZone(Enum):
EXTERNAL = "external" # Internet, eindgebruikers
DMZ = "dmz" # API-gateways, load balancers
INFERENCE = "inference" # Model serving
TRAINING = "training" # Trainingscluster
DATA = "data" # Opslag van trainingsdata
CONTROL = "control" # Pijplijnorkestratie
MONITORING = "monitoring" # Observability
REGISTRY = "registry" # Model-/artefactregister
@dataclass
class DFDElement:
"""An element in the data flow diagram."""
id: str
name: str
element_type: ElementType
trust_zone: TrustZone
description: str
technologies: list[str] = field(default_factory=list)
threats: list[str] = field(default_factory=list)
@dataclass
class DataFlow:
"""A data flow between DFD elements."""
id: str
source_id: str
target_id: str
data_description: str
protocol: str
is_encrypted: bool = False
is_authenticated: bool = False
threats: list[str] = field(default_factory=list)
class AIThreatModel:
"""
Threat model for an AI infrastructure deployment.
"""
def __init__(self, system_name: str, description: str):
self.system_name = system_name
self.description = description
self.elements: dict[str, DFDElement] = {}
self.data_flows: list[DataFlow] = []
self.threats: list[dict] = []
def add_element(self, element: DFDElement) -> None:
"""Add a DFD element."""
self.elements[element.id] = element
def add_data_flow(self, flow: DataFlow) -> None:
"""Add a data flow between elements."""
self.data_flows.append(flow)
def apply_stride(self) -> list[dict]:
"""
Systematically apply STRIDE to all elements and data flows.
Returns identified threats.
"""
threats = []
# Pas STRIDE toe op elk element op basis van type
for elem in self.elements.values():
if elem.element_type == ElementType.PROCESS:
threats.extend(self._stride_process(elem))
elif elem.element_type == ElementType.DATA_STORE:
threats.extend(self._stride_data_store(elem))
elif elem.element_type == ElementType.EXTERNAL_ENTITY:
threats.extend(self._stride_external_entity(elem))
# Pas STRIDE toe op elke data flow
for flow in self.data_flows:
threats.extend(self._stride_data_flow(flow))
# Pas grensoverschrijdende dreigingen toe
threats.extend(self._cross_boundary_threats())
self.threats = threats
return threats
def _stride_process(self, elem: DFDElement) -> list[dict]:
"""Apply all STRIDE categories to a process element."""
threats = []
prefix = f"{elem.name} ({elem.id})"
# Spoofing
threats.append({
"element": elem.id,
"category": "Spoofing",
"threat": (
f"An attacker could impersonate {prefix} to "
f"interact with upstream or downstream components."
),
"ai_specific": "model" in elem.name.lower() or "inference" in elem.name.lower(),
"mitigation": "Implement mutual TLS with workload identity (SPIFFE).",
})
# Tampering
threats.append({
"element": elem.id,
"category": "Tampering",
"threat": (
f"An attacker could modify the behavior of {prefix} "
f"by altering its inputs, configuration, or code."
),
"ai_specific": "training" in elem.name.lower(),
"mitigation": "Sign artifacts, use read-only filesystems, verify inputs.",
})
# Repudiation
threats.append({
"element": elem.id,
"category": "Repudiation",
"threat": (
f"Actions performed by or through {prefix} may not "
f"be properly logged, allowing denial of activity."
),
"ai_specific": False,
"mitigation": "Implement comprehensive audit logging.",
})
# Information Disclosure
if "model" in elem.name.lower() or "inference" in elem.name.lower():
threats.append({
"element": elem.id,
"category": "Information Disclosure",
"threat": (
f"{prefix} could leak model weights, architecture, "
f"or training data through inference API responses, "
f"error messages, or timing side channels."
),
"ai_specific": True,
"mitigation": (
"Implement rate limiting, response filtering, "
"differential privacy, and timing normalization."
),
})
# Denial of Service
threats.append({
"element": elem.id,
"category": "Denial of Service",
"threat": (
f"{prefix} could be overwhelmed by excessive requests "
f"or resource-intensive operations."
),
"ai_specific": "gpu" in elem.description.lower(),
"mitigation": "Implement resource limits, rate limiting, and circuit breakers.",
})
# Elevation of Privilege
threats.append({
"element": elem.id,
"category": "Elevation of Privilege",
"threat": (
f"A vulnerability in {prefix} could allow an attacker "
f"to gain the privileges of its service account."
),
"ai_specific": False,
"mitigation": "Apply least privilege, use non-root containers.",
})
return threats
def _stride_data_store(self, elem: DFDElement) -> list[dict]:
"""Apply applicable STRIDE categories to a data store."""
threats = []
# Tampering (primaire dreiging voor datastores)
threats.append({
"element": elem.id,
"category": "Tampering",
"threat": (
f"Data in {elem.name} could be modified. "
f"{'This directly enables training data poisoning. ' if 'training' in elem.name.lower() or 'data' in elem.name.lower() else ''}"
f"{'Model artifacts could be replaced with malicious versions. ' if 'model' in elem.name.lower() or 'registry' in elem.name.lower() else ''}"
),
"ai_specific": True,
"mitigation": "Enable versioning, access logging, integrity verification.",
})
# Information Disclosure
threats.append({
"element": elem.id,
"category": "Information Disclosure",
"threat": (
f"Unauthorized read access to {elem.name} could "
f"expose {'training data and PII' if 'data' in elem.name.lower() else 'model intellectual property'}."
),
"ai_specific": True,
"mitigation": "Encrypt at rest, enforce IAM policies, audit access.",
})
return threats
def _stride_external_entity(self, elem: DFDElement) -> list[dict]:
"""Spoofing is the primary STRIDE threat for external entities."""
return [{
"element": elem.id,
"category": "Spoofing",
"threat": (
f"An attacker could impersonate {elem.name} to "
f"submit malicious requests or data."
),
"ai_specific": "data" in elem.name.lower(),
"mitigation": "Authenticate all external entities. Validate inputs.",
}]
def _stride_data_flow(self, flow: DataFlow) -> list[dict]:
"""Apply Tampering and Information Disclosure to data flows."""
threats = []
source = self.elements.get(flow.source_id)
target = self.elements.get(flow.target_id)
if not flow.is_encrypted:
threats.append({
"element": flow.id,
"category": "Tampering",
"threat": (
f"Data flow from {source.name if source else flow.source_id} "
f"to {target.name if target else flow.target_id} "
f"({flow.data_description}) is unencrypted. "
f"An attacker could modify data in transit."
),
"ai_specific": "model" in flow.data_description.lower(),
"mitigation": "Enable TLS/mTLS for all data flows.",
})
threats.append({
"element": flow.id,
"category": "Information Disclosure",
"threat": (
f"Unencrypted {flow.data_description} could be "
f"intercepted between {source.name if source else '?'} "
f"and {target.name if target else '?'}."
),
"ai_specific": True,
"mitigation": "Encrypt all data in transit.",
})
if not flow.is_authenticated:
threats.append({
"element": flow.id,
"category": "Spoofing",
"threat": (
f"Data flow to {target.name if target else '?'} "
f"is not authenticated. An attacker could send "
f"forged {flow.data_description}."
),
"ai_specific": "model" in flow.data_description.lower()
or "training" in flow.data_description.lower(),
"mitigation": "Implement mutual authentication.",
})
return threats
def _cross_boundary_threats(self) -> list[dict]:
"""Identify threats at trust boundary crossings."""
threats = []
for flow in self.data_flows:
source = self.elements.get(flow.source_id)
target = self.elements.get(flow.target_id)
if source and target and source.trust_zone != target.trust_zone:
threats.append({
"element": flow.id,
"category": "Trust Boundary Crossing",
"threat": (
f"Data flows from {source.trust_zone.value} zone "
f"({source.name}) to {target.trust_zone.value} zone "
f"({target.name}). Cross-boundary data "
f"({flow.data_description}) requires validation."
),
"ai_specific": True,
"mitigation": (
"Validate all data crossing trust boundaries. "
"Apply defense-in-depth at boundary."
),
})
return threats
def generate_report(self) -> str:
"""Generate a structured threat model report."""
if not self.threats:
self.apply_stride()
ai_threats = [t for t in self.threats if t.get("ai_specific")]
traditional_threats = [t for t in self.threats if not t.get("ai_specific")]
# Tel per categorie
category_counts: dict[str, int] = {}
for t in self.threats:
cat = t["category"]
category_counts[cat] = category_counts.get(cat, 0) + 1
report = {
"system": self.system_name,
"description": self.description,
"summary": {
"total_threats": len(self.threats),
"ai_specific_threats": len(ai_threats),
"traditional_threats": len(traditional_threats),
"by_category": category_counts,
},
"elements": len(self.elements),
"data_flows": len(self.data_flows),
"threats": self.threats,
}
return json.dumps(report, indent=2, default=str)Praktische voorbeelden
Dreigingsmodellering van een LLM-inferentiepijplijn
"""
Complete threat model for an LLM inference pipeline.
Demonstrates applying STRIDE to a realistic architecture.
"""
from typing import Any # Maakt gebruik van de hierboven gedefinieerde klassen
def create_llm_inference_threat_model() -> "AIThreatModel":
"""
Build a threat model for a typical LLM inference pipeline
deployed on Kubernetes with GPU nodes.
"""
tm = AIThreatModel(
system_name="LLM Inference Pipeline",
description=(
"Production LLM inference system serving API requests "
"through a load balancer, with model artifacts stored "
"in S3 and served via vLLM on GPU nodes."
),
)
# Externe entiteiten
tm.add_element(DFDElement(
id="user", name="API Client",
element_type=ElementType.EXTERNAL_ENTITY,
trust_zone=TrustZone.EXTERNAL,
description="External application consuming the LLM API",
technologies=["HTTPS", "REST"],
))
tm.add_element(DFDElement(
id="admin", name="ML Engineer",
element_type=ElementType.EXTERNAL_ENTITY,
trust_zone=TrustZone.EXTERNAL,
description="Engineer managing model deployments",
technologies=["kubectl", "mlflow CLI"],
))
# Processen
tm.add_element(DFDElement(
id="gateway", name="API Gateway",
element_type=ElementType.PROCESS,
trust_zone=TrustZone.DMZ,
description="Authenticates requests, rate limits, routes to inference",
technologies=["Kong", "NGINX"],
))
tm.add_element(DFDElement(
id="vllm", name="vLLM Inference Server",
element_type=ElementType.PROCESS,
trust_zone=TrustZone.INFERENCE,
description="GPU-accelerated LLM inference with PagedAttention",
technologies=["vLLM", "CUDA", "PyTorch"],
))
tm.add_element(DFDElement(
id="pipeline", name="Model Deployment Pipeline",
element_type=ElementType.PROCESS,
trust_zone=TrustZone.CONTROL,
description="Automated pipeline that loads new model versions",
technologies=["Argo CD", "Helm"],
))
# Datastores
tm.add_element(DFDElement(
id="s3_models", name="S3 Model Artifact Store",
element_type=ElementType.DATA_STORE,
trust_zone=TrustZone.REGISTRY,
description="Stores trained model weights and configurations",
technologies=["AWS S3", "SSE-KMS"],
))
tm.add_element(DFDElement(
id="mlflow", name="MLflow Model Registry",
element_type=ElementType.DATA_STORE,
trust_zone=TrustZone.REGISTRY,
description="Tracks model versions and deployment stages",
technologies=["MLflow", "PostgreSQL"],
))
tm.add_element(DFDElement(
id="logs", name="Inference Log Store",
element_type=ElementType.DATA_STORE,
trust_zone=TrustZone.MONITORING,
description="Stores inference requests and responses for monitoring",
technologies=["Elasticsearch", "S3"],
))
# Dataflows
tm.add_data_flow(DataFlow(
id="df1", source_id="user", target_id="gateway",
data_description="Inference requests (prompts)",
protocol="HTTPS",
is_encrypted=True, is_authenticated=True,
))
tm.add_data_flow(DataFlow(
id="df2", source_id="gateway", target_id="vllm",
data_description="Authenticated inference requests",
protocol="HTTP/gRPC",
is_encrypted=False, # Veelvoorkomend gat: intern verkeer onversleuteld
is_authenticated=False,
))
tm.add_data_flow(DataFlow(
id="df3", source_id="s3_models", target_id="vllm",
data_description="Model weights (multi-GB)",
protocol="HTTPS (S3 API)",
is_encrypted=True, is_authenticated=True,
))
tm.add_data_flow(DataFlow(
id="df4", source_id="admin", target_id="mlflow",
data_description="Model stage transitions",
protocol="HTTPS",
is_encrypted=True, is_authenticated=True,
))
tm.add_data_flow(DataFlow(
id="df5", source_id="mlflow", target_id="pipeline",
data_description="Model deployment triggers",
protocol="Webhook HTTP",
is_encrypted=False,
is_authenticated=False,
))
tm.add_data_flow(DataFlow(
id="df6", source_id="vllm", target_id="logs",
data_description="Inference requests and responses",
protocol="HTTP",
is_encrypted=False,
is_authenticated=False,
))
return tm
if __name__ == "__main__":
tm = create_llm_inference_threat_model()
threats = tm.apply_stride()
report = tm.generate_report()
print(report)
print(f"\nTotal threats identified: {len(threats)}")
print(f"AI-specific threats: {sum(1 for t in threats if t.get('ai_specific'))}")Risicoscoring met DREAD aangepast voor AI
DREAD (Damage, Reproducibility, Exploitability, Affected users, Discoverability) kan worden aangepast voor AI-systemen door in elke dimensie rekening te houden met AI-specifieke factoren:
"""
DREAD risk scoring adapted for AI infrastructure threats.
Adds AI-specific weighting factors to standard DREAD scoring.
"""
from dataclasses import dataclass
from typing import Optional
@dataclass
class AIThreatScore:
"""DREAD score for an AI infrastructure threat."""
threat_name: str
atlas_technique: Optional[str]
# Standaard DREAD-dimensies (schaal 1-10)
damage: int # Hoe erg is het als de aanval slaagt?
reproducibility: int # Hoe makkelijk is het te reproduceren?
exploitability: int # Hoe makkelijk is het om de aanval uit te voeren?
affected_users: int # Hoeveel gebruikers worden getroffen?
discoverability: int # Hoe makkelijk is het om de kwetsbaarheid te vinden?
# AI-specifieke aanpassingsfactoren
model_impact: float = 1.0 # Beïnvloedt dit het modelgedrag? (1.0-2.0)
data_sensitivity: float = 1.0 # Is trainings-/inferentiedata gevoelig? (1.0-2.0)
detection_difficulty: float = 1.0 # Hoe moeilijk is het AI-specifieke aspect te detecteren? (1.0-2.0)
@property
def base_dread_score(self) -> float:
"""Calculate standard DREAD score (0-10)."""
return (
self.damage + self.reproducibility + self.exploitability
+ self.affected_users + self.discoverability
) / 5.0
@property
def ai_adjusted_score(self) -> float:
"""
DREAD score adjusted for AI-specific factors.
AI attacks that corrupt model behavior or are hard to
detect get higher priority.
"""
base = self.base_dread_score
ai_multiplier = (
self.model_impact * self.data_sensitivity * self.detection_difficulty
) ** (1/3) # Geometrisch gemiddelde om extreme waarden te voorkomen
return min(10.0, base * ai_multiplier)
@property
def priority(self) -> str:
"""Human-readable priority based on AI-adjusted score."""
score = self.ai_adjusted_score
if score >= 8.0:
return "CRITICAL"
elif score >= 6.0:
return "HIGH"
elif score >= 4.0:
return "MEDIUM"
elif score >= 2.0:
return "LOW"
return "INFO"
# Voorbeeld: Scoor veelvoorkomende dreigingen voor AI-infrastructuur
AI_THREAT_SCORES = [
AIThreatScore(
threat_name="Training data poisoning via S3 write access",
atlas_technique="AML.T0020",
damage=9, reproducibility=8, exploitability=6,
affected_users=10, discoverability=4,
model_impact=2.0, data_sensitivity=1.8, detection_difficulty=1.8,
),
AIThreatScore(
threat_name="Model extraction through inference API",
atlas_technique="AML.T0024",
damage=8, reproducibility=9, exploitability=7,
affected_users=8, discoverability=6,
model_impact=1.5, data_sensitivity=1.3, detection_difficulty=1.5,
),
AIThreatScore(
threat_name="RCE via TorchServe management API",
atlas_technique="AML.T0010",
damage=10, reproducibility=9, exploitability=8,
affected_users=10, discoverability=7,
model_impact=1.0, data_sensitivity=1.0, detection_difficulty=1.0,
),
AIThreatScore(
threat_name="GPU memory side-channel between tenants",
atlas_technique="AML.T0024",
damage=7, reproducibility=5, exploitability=4,
affected_users=6, discoverability=3,
model_impact=1.5, data_sensitivity=1.7, detection_difficulty=2.0,
),
]
def generate_risk_report(threats: list[AIThreatScore]) -> str:
"""Generate a prioritized risk report from scored threats."""
sorted_threats = sorted(
threats, key=lambda t: t.ai_adjusted_score, reverse=True,
)
lines = ["AI Infrastructure Threat Risk Report", "=" * 45, ""]
for t in sorted_threats:
lines.append(
f"[{t.priority}] {t.threat_name}"
)
lines.append(
f" Base DREAD: {t.base_dread_score:.1f} | "
f"AI-Adjusted: {t.ai_adjusted_score:.1f}"
)
if t.atlas_technique:
lines.append(f" ATLAS: {t.atlas_technique}")
lines.append("")
return "\n".join(lines)
if __name__ == "__main__":
print(generate_risk_report(AI_THREAT_SCORES))Facilitatie van een dreigingsmodelleringsworkshop
Het draaien van een effectieve AI-dreigingsmodelleringssessie vereist dat zowel beveiligingsexpertise als ML-engineeringkennis bij elkaar komen. Hier volgt een gestructureerde aanpak voor het faciliteren van deze sessies:
Deelnemers: Betrek minimaal één beveiligingsengineer die bekend is met STRIDE, één ML-engineer die de trainingspijplijn begrijpt, één infrastructuurengineer die het deploymentplatform beheert, en één producteigenaar die de bedrijfsimpact kan inschatten. Betrek voor LLM-systemen iemand die prompt engineering en modelgedrag begrijpt.
Voorbereidend werk: Bereid vóór de sessie een concept-DFD voor op basis van architectuurdocumentatie en interviews. De DFD moet alle dataflows tonen, inclusief de ingestie van trainingsdata, de verplaatsing van modelartefacten, de stroom van inferentieverzoeken en de verzameling van telemetrie. Verspreid de DFD één week voor de sessie onder de deelnemers ter review.
Sessiestructuur (doorgaans 2-4 uur):
- Bekijk en verfijn de DFD (30 minuten)
- Loop door elk element en elke data flow en pas STRIDE toe (90-120 minuten)
- Scoor de geïdentificeerde dreigingen met DREAD of CVSS (30 minuten)
- Identificeer de tegenmaatregelen met de hoogste prioriteit (30 minuten)
Veelvoorkomende blinde vlekken om tijdens de sessie specifiek te onderzoeken:
- "Wat gebeurt er als iemand de trainingsdata wijzigt?" (teams gaan vaak uit van data-integriteit)
- "Wat kan er worden geleerd door het model duizenden keren te bevragen?" (modelextractie)
- "Tot welke credentials heeft een trainingstaak toegang?" (blast radius)
- "Kan een gecompromitteerd model data exfiltreren via zijn uitvoer?" (model als exfiltratiekanaal)
STRIDE-dreigingscatalogus voor AI
De volgende tabel vat de belangrijkste STRIDE-dreigingen samen die specifiek zijn voor AI-infrastructuur, naast traditionele IT-dreigingen:
| STRIDE-categorie | AI-dreiging | ATLAS-techniek | Prioriteit |
|---|---|---|---|
| Spoofing | Doe je voor als databron om vergiftigde data te injecteren | AML.T0020 | Kritiek |
| Spoofing | Vervang modelartefact in register | AML.T0010 | Kritiek |
| Tampering | Wijzig trainingsdata in opslag | AML.T0020 | Kritiek |
| Tampering | Wijzig modelgewichten tijdens overdracht | AML.T0010 | Hoog |
| Tampering | Manipuleer featurewaarden tijdens inferentie | AML.T0043 | Hoog |
| Repudiation | Ontken modeldeployment die een incident veroorzaakte | - | Gemiddeld |
| Info Disclosure | Onttrek model via inferentie-API | AML.T0024 | Hoog |
| Info Disclosure | Onttrek trainingsdata uit model | AML.T0024 | Hoog |
| Info Disclosure | Lek GPU-geheugen tussen tenants | AML.T0024 | Hoog |
| DoS | Resource-uitputting via adversariële prompts | AML.T0029 | Hoog |
| DoS | Verstoring van training via datacorruptie | - | Gemiddeld |
| EoP | Container-escape vanuit geprivilegieerde GPU-pod | - | Kritiek |
| EoP | Pijplijn-RCE via modeldeserialisatie | AML.T0010 | Kritiek |
Verdediging en tegenmaatregelen
Voer dreigingsmodellering vroeg en iteratief uit: Modelleer dreigingen voor AI-systemen tijdens het ontwerp, vóór deployment en na significante architectuurwijzigingen. Betrek ML-engineers bij dreigingsmodelleringssessies — zij begrijpen dataflows en modelgedrag die beveiligingsteams mogelijk missen.
Gebruik STRIDE-per-Element systematisch: Loop door elk DFD-element en elke data flow en pas elke STRIDE-categorie toe. De gestructureerde aanpak voorkomt dat je dreigingen over het hoofd ziet die onwaarschijnlijk lijken maar grote impact hebben.
Prioriteer AI-specifieke dreigingen: Standaard IT-dreigingsmodellering beoordeelt "tampering van datastore" mogelijk als een gemiddeld risico. Voor AI-systemen is tampering van trainingsdata kritiek, omdat het modelgedrag op moeilijk detecteerbare manieren stilletjes kan corrumperen.
Map naar MITRE ATLAS: Kruisverwijs geïdentificeerde dreigingen met ATLAS-technieken om volledigheid te waarborgen en gebruik te maken van de kennis van de community over aanvallen in de praktijk.
Documenteer aannames en vertrouwensgrenzen: Stel expliciet vast wat vertrouwd wordt en wat niet. Veelvoorkomende impliciete aannames in AI-systemen (bijv. "trainingsdata is vertrouwd", "modelartefacten in S3 zijn niet gewijzigd") zijn vaak de oorzaak van beveiligingsgaten.
Bekijk opnieuw na hertraining: Elke hertrainingscyclus van het model introduceert mogelijk nieuwe dreigingen als de trainingsdata, pijplijn of hyperparameters veranderen. Werk het dreigingsmodel dienovereenkomstig bij.
Automatiseer validatie van het dreigingsmodel: Gebruik de gestructureerde uitvoer van het dreigingsmodel om automatisch beveiligingstestcases te genereren. Maak voor elke geïdentificeerde dreiging met een testprocedure een geautomatiseerde test die verifieert of de tegenmaatregel aanwezig en effectief is. Voer deze tests uit als onderdeel van CI/CD en op geplande basis om regressies te detecteren. Hiermee transformeer je het dreigingsmodel van een statisch document in een levende beveiligingsspecificatie die continu wordt gevalideerd tegen het daadwerkelijke systeem.
Neem adversariële ML mee in het dreigingsmodel: Traditioneel STRIDE richt zich op dreigingen op infrastructuurniveau. Neem voor AI-systemen expliciet adversariële ML-aanvallen op zoals ontduiking, vergiftiging en modelinversie in het dreigingsmodel. Deze aanvallen hebben het geleerde gedrag van het model als doelwit in plaats van de infrastructuur, en ze vereisen andere tegenmaatregelen (robuuste training, invoervalidatie, uitvoerverstoring) dan traditionele beveiligingscontroles.
Referenties
- Shostack, A. (2014). "Threat Modeling: Designing for Security." Wiley. ISBN: 978-1118809990.
- MITRE. (2024). "ATLAS: Adversarial Threat Landscape for AI Systems." https://atlas.mitre.org/
- Microsoft. (2024). "Threat Modeling for AI/ML Systems." https://learn.microsoft.com/en-us/security/engineering/threat-modeling-aiml
- NIST. (2023). "AI Risk Management Framework (AI RMF 1.0)." https://airc.nist.gov/AI_RMF_Interactivity/
- OWASP. (2025). "OWASP Machine Learning Security Top 10." https://owasp.org/www-project-machine-learning-security-top-10/