Ernstscoring van AI-incidenten
Frameworks en methodologieën voor het scoren van de ernst van AI-beveiligingsincidenten, met integratie van NIST AI RMF, MITRE ATLAS en traditionele CVSS-benaderingen.
Overzicht
Wanneer zich een AI-beveiligingsincident voordoet, is een van de eerste beslissingen die het responsteam moet nemen, hoe ernstig het is. Deze bepaling stuurt alles wat daarna komt aan: hoeveel responders worden gemobiliseerd, welke belanghebbenden worden geïnformeerd, welke communicatie wordt verstuurd en hoe snel de organisatie handelt. De ernstscoring in beide richtingen verkeerd inschatten is kostbaar -- te hoog scoren verspilt middelen en veroorzaakt alertmoeheid, terwijl te laag scoren ervoor kan zorgen dat een kritiek incident ongecontroleerd escaleert.
Traditionele frameworks voor ernstscoring zoals CVSS (Common Vulnerability Scoring System) waren ontworpen voor softwarekwetsbaarheden in deterministische systemen. AI-incidenten introduceren dimensies die deze frameworks niet vastleggen: de probabilistische aard van modelgedrag, de moeilijkheid om de blast radius te bepalen wanneer een model diverse use cases bedient, het potentieel voor contaminatie van trainingsdata om vertraagde en wijdverbreide effecten te hebben, en de reputatieschade die uniek is voor AI-systemen die schadelijke of gênante outputs produceren.
Dit artikel presenteert een voor AI aangepast framework voor ernstscoring dat voortbouwt op gevestigde standaarden -- NIST AI RMF, MITRE ATLAS, OWASP LLM Top 10 en CVSS -- en tegelijkertijd dimensies toevoegt die specifiek zijn voor AI-beveiligingsincidenten. Het doel is om incidentresponsteams een herhaalbare, verdedigbare methodologie voor ernstclassificatie te bieden.
Beperkingen van traditionele scoring voor AI-incidenten
CVSS-lacunes
Het Common Vulnerability Scoring System (CVSS v4.0) evalueert kwetsbaarheden langs dimensies waaronder aanvalsvector, aanvalscomplexiteit, vereiste privileges, gebruikersinteractie en impact op vertrouwelijkheid, integriteit en beschikbaarheid. Hoewel deze dimensies relevant zijn voor AI-systemen, mist CVSS verschillende AI-specifieke factoren:
| CVSS-dimensie | AI-lacune |
|---|---|
| Aanvalsvector | Maakt geen onderscheid tussen aanvallen op promptniveau, trainingsniveau en infrastructuurniveau |
| Aanvalscomplexiteit | Kan de stochastische aard van AI-exploits die probabilistisch slagen niet vastleggen |
| Vereiste privileges | Geen concept van "modeltoegangsniveaus" (API-gebruiker vs. fine-tuningtoegang vs. toegang tot trainingspipeline) |
| Gebruikersinteractie | Modelleert geen indirecte prompt-injectie waarbij de "gebruiker" zich van niets bewust is |
| Impact op vertrouwelijkheid | Legt extractie van trainingsdata of diefstal van modelgewichten niet vast |
| Impact op integriteit | Maakt geen onderscheid tussen voorbijgaande outputmanipulatie en persistente modelcorruptie |
| Impact op beschikbaarheid | Legt modeldegradatie (gedeeltelijk verlies van beschikbaarheid) niet vast |
NIST AI RMF-context
Het NIST AI Risk Management Framework (AI RMF 1.0, gepubliceerd in januari 2023) biedt een bredere structuur voor risicomanagement via zijn vier kernfuncties: Govern, Map, Measure en Manage. De Measure-functie is het meest relevant voor ernstscoring, aangezien deze de beoordeling van AI-risico's omvat, waaronder:
- Waarschijnlijkheid en ernst van mogelijke schade
- Breedte van de impact (aantal getroffen individuen of systemen)
- Of schade omkeerbaar of onomkeerbaar is
- Of het AI-systeem in een veiligheidskritieke context opereert
Ons framework voor ernstscoring operationaliseert deze NIST-principes in een kwantitatieve scoringsmethodologie.
Het AI Incident Severity Framework (AISF)
Scorecomponenten
Het AISF produceert een samengestelde ernstscore van 0,0 tot 10,0 door zeven dimensies te evalueren, elk gescoord van 0,0 tot 10,0 en gecombineerd met configureerbare gewichten.
"""
AI Incident Severity Framework (AISF) scoring implementation.
Produces a composite severity score for AI security incidents
based on seven weighted dimensions.
"""
from dataclasses import dataclass
from enum import Enum
class SeverityLevel(Enum):
INFORMATIONAL = "informational" # 0.0 - 1.9
LOW = "low" # 2.0 - 3.9
MEDIUM = "medium" # 4.0 - 5.9
HIGH = "high" # 6.0 - 7.9
CRITICAL = "critical" # 8.0 - 10.0
@dataclass
class AISFDimension:
"""Eén dimensie van de AISF-ernstscore."""
name: str
score: float # 0.0 to 10.0
weight: float # relative weight in composite
rationale: str # explanation for the score
@dataclass
class AISFScore:
"""Volledige AISF-ernstbeoordeling."""
dimensions: list[AISFDimension]
composite_score: float
severity_level: SeverityLevel
summary: str
def classify_severity(score: float) -> SeverityLevel:
if score < 2.0:
return SeverityLevel.INFORMATIONAL
if score < 4.0:
return SeverityLevel.LOW
if score < 6.0:
return SeverityLevel.MEDIUM
if score < 8.0:
return SeverityLevel.HIGH
return SeverityLevel.CRITICAL
def compute_aisf_score(dimensions: list[AISFDimension]) -> AISFScore:
"""
Bereken de samengestelde AISF-score uit de individuele dimensiescores.
Gebruikt gewogen gemiddelde met normalisatie.
"""
total_weight = sum(d.weight for d in dimensions)
if total_weight == 0:
raise ValueError("Total weight must be positive")
composite = sum(d.score * d.weight for d in dimensions) / total_weight
composite = round(min(max(composite, 0.0), 10.0), 1)
return AISFScore(
dimensions=dimensions,
composite_score=composite,
severity_level=classify_severity(composite),
summary=_generate_summary(dimensions, composite),
)
def _generate_summary(dimensions: list[AISFDimension], composite: float) -> str:
top_dims = sorted(dimensions, key=lambda d: d.score, reverse=True)[:3]
drivers = ", ".join(f"{d.name} ({d.score})" for d in top_dims)
level = classify_severity(composite)
return f"Composite score {composite}/10.0 ({level.value}). Primary drivers: {drivers}."Dimensie 1: Aanvalsverfijning (gewicht: 0,10)
Meet de technische verfijning die nodig is om de aanval uit te voeren. Hogere verfijning duidt op een capabelere dreigingsactor en mogelijk een gerichtere aanval.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Triviaal, geen gespecialiseerde kennis | Een bekende jailbreak-prompt kopiëren en plakken |
| 3-4 | Basis, gebruikt publiek beschikbare tools | Een kant-en-klare adversariële aanvalsbibliotheek gebruiken |
| 5-6 | Matig, vereist domeinexpertise | Gerichte prompt-injecties opstellen voor een specifieke applicatie |
| 7-8 | Geavanceerd, vereist ML-onderzoeksvaardigheden | Nieuwe adversariële perturbaties of backdoor-triggers ontwikkelen |
| 9-10 | Expert, niveau van een natiestaat | Aanvallen tijdens training die compromittering van de toeleveringsketen vereisen |
Dimensie 2: Blootstelling van gevoelige data (gewicht: 0,20)
Meet de gevoeligheid van data die werd blootgesteld, geëxtraheerd of gecompromitteerd. Dit is vaak de zwaarst gewogen dimensie, omdat datablootstelling de impact op regelgevings-, juridisch en reputatiegebied bepaalt.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Publieke of niet-gevoelige data | Model onthult informatie die al in publieke trainingsdata staat |
| 3-4 | Interne maar niet-gereguleerde data | Model lekt interne projectnamen of niet-gevoelige configuraties |
| 5-6 | Gereguleerde persoonsgegevens (PII) | Modelextractie van gebruikersdata uit de trainingsset |
| 7-8 | Zeer gevoelige persoons- of financiële data | Trainingsdata met BSN's, medische dossiers, financiële data |
| 9-10 | Nationale veiligheid of veiligheidskritieke data | Blootstelling van geclassificeerde informatie, compromittering van veiligheidssysteem |
Dimensie 3: Impact op modelintegriteit (gewicht: 0,20)
Meet in welke mate de integriteit van het model is gecompromitteerd -- of er nog op vertrouwd kan worden dat het correcte, veilige outputs produceert.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Geen modelwijziging, voorbijgaand outputprobleem | Eenmalige afwijkende reactie, geen persistent effect |
| 3-4 | Tijdelijke gedragsmodificatie | Jailbreak die slechts voor één sessie werkt |
| 5-6 | Persistente maar omkeerbare modificatie | Gecompromitteerde systeemprompt die hersteld kan worden |
| 7-8 | Modificatie op gewichtsniveau gedetecteerd | Ongeautoriseerde fine-tuning die modelgewichten heeft gewijzigd |
| 9-10 | Onomkeerbare of wijdverbreide corruptie | Backdoor in basismodelgewichten, datavergiftiging die het foundation model aantast |
Dimensie 4: Blast radius (gewicht: 0,15)
Meet hoeveel gebruikers, systemen of downstream-applicaties worden getroffen.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Eén gebruiker of sessie | Eén gebruiker vond een jailbreak |
| 3-4 | Kleine groep gebruikers | Bug die een specifieke tenant treft |
| 5-6 | Aanzienlijke gebruikerspopulatie | Kwetsbaarheid in een functie die door duizenden wordt gebruikt |
| 7-8 | Organisatiebrede impact | Gecompromitteerd model dat alle interne applicaties bedient |
| 9-10 | Cross-organisatorische of publieke impact | Vergiftigd foundation model gedistribueerd naar meerdere organisaties |
Dimensie 5: Omkeerbaarheid (gewicht: 0,15)
Meet hoe gemakkelijk de effecten van het incident kunnen worden teruggedraaid.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Onmiddellijk omkeerbaar | Herstart de service, wis de cache |
| 3-4 | Omkeerbaar met matige inspanning | Opnieuw deployen vanaf een bekend-goed checkpoint |
| 5-6 | Omkeerbaar met aanzienlijke inspanning | Modelcomponent opnieuw trainen, getroffen gebruikers informeren |
| 7-8 | Gedeeltelijk onomkeerbaar | Geëxtraheerde data kan niet "ongeëxtraheerd" worden |
| 9-10 | Volledig onomkeerbaar | Modelgewichten publiek gelekt, datalek van trainingsdata |
Dimensie 6: Blootstelling op regelgevings- en juridisch gebied (gewicht: 0,10)
Meet de implicaties van het incident op het gebied van regelgeving, recht en compliance.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Geen regelgevingsimplicaties | Interne tool, geen gereguleerde data |
| 3-4 | Kleine compliance-overwegingen | Logging-lacune die gedocumenteerd zou moeten worden |
| 5-6 | Meldingsplichtig onder bestaande kaders | AVG-melding van datalek kan vereist zijn |
| 7-8 | Significante regelgevingsactie waarschijnlijk | Schending van een AI-systeem met hoog risico onder de EU AI Act |
| 9-10 | Grote handhavingsactie verwacht | Potentieel voor collectieve rechtszaak, regelgevingsonderzoek |
Dimensie 7: Reputatie-impact (gewicht: 0,10)
Meet de potentiële reputatieschade als het incident openbaar wordt.
| Score | Beschrijving | Voorbeeld |
|---|---|---|
| 1-2 | Geen externe zichtbaarheid | Intern incident, geen gebruikersimpact |
| 3-4 | Klein, beperkt tot getroffen gebruikers | Bug die enkele gebruikers opmerkten |
| 5-6 | Matig, aandacht uit de branche waarschijnlijk | Beveiligingsonderzoekers publiceren mogelijk hun bevindingen |
| 7-8 | Significante mediadekking verwacht | Berichtgeving in de reguliere tech-pers |
| 9-10 | Grote publieke controverse | Voorpaginanieuws, parlementair toezicht |
Scoring in de praktijk
Voorbeeld: Data-exfiltratie via prompt-injectie
def score_prompt_injection_exfiltration() -> AISFScore:
"""
Example: Score a prompt injection incident where an attacker
used indirect prompt injection via a RAG document to extract
other users' conversation data from a customer support chatbot.
"""
dimensions = [
AISFDimension(
name="Attack Sophistication",
score=5.0,
weight=0.10,
rationale="Targeted indirect prompt injection requiring knowledge "
"of the RAG pipeline and output format",
),
AISFDimension(
name="Data Sensitivity",
score=7.0,
weight=0.20,
rationale="Customer support conversations contain PII including "
"names, email addresses, and account details",
),
AISFDimension(
name="Model Integrity",
score=3.0,
weight=0.20,
rationale="Model itself was not modified; attack exploited the "
"application architecture",
),
AISFDimension(
name="Blast Radius",
score=6.0,
weight=0.15,
rationale="Approximately 2,000 customer conversations were "
"potentially accessible through the vulnerability",
),
AISFDimension(
name="Reversibility",
score=8.0,
weight=0.15,
rationale="Extracted data cannot be recalled; affected customers "
"must be notified",
),
AISFDimension(
name="Regulatory Exposure",
score=7.0,
weight=0.10,
rationale="PII exposure triggers GDPR Article 33 notification "
"requirement (72-hour window)",
),
AISFDimension(
name="Reputational Impact",
score=6.0,
weight=0.10,
rationale="Customer trust impact; potential media coverage of "
"AI chatbot leaking customer data",
),
]
return compute_aisf_score(dimensions)
# Voer het voorbeeld uit
result = score_prompt_injection_exfiltration()
# Verwachte samengestelde score: ongeveer 5.8 (MEDIUM-HIGH)
print(f"Severity: {result.severity_level.value}")
print(f"Score: {result.composite_score}")
print(f"Summary: {result.summary}")Voorbeeld: Ontdekking van een modelbackdoor
def score_model_backdoor_discovery() -> AISFScore:
"""
Example: Score the discovery of a backdoor in a third-party
model that was deployed in a financial fraud detection system.
The backdoor causes the model to classify certain fraudulent
transactions as legitimate when a specific pattern is present.
"""
dimensions = [
AISFDimension(
name="Attack Sophistication",
score=9.0,
weight=0.10,
rationale="Training-time backdoor attack requiring access to the "
"model training pipeline or supply chain",
),
AISFDimension(
name="Data Sensitivity",
score=8.0,
weight=0.20,
rationale="Financial transaction data with PII and account details; "
"fraudulent transactions enabled by the backdoor",
),
AISFDimension(
name="Model Integrity",
score=9.0,
weight=0.20,
rationale="Model weights contain a persistent backdoor; the model "
"cannot be trusted for any predictions",
),
AISFDimension(
name="Blast Radius",
score=8.0,
weight=0.15,
rationale="All transactions processed by this model since "
"deployment are potentially affected",
),
AISFDimension(
name="Reversibility",
score=6.0,
weight=0.15,
rationale="Model can be replaced, but all historical predictions "
"must be re-evaluated; financial losses may not be recoverable",
),
AISFDimension(
name="Regulatory Exposure",
score=8.0,
weight=0.10,
rationale="Financial services regulation requires reporting; "
"potential regulatory action for inadequate model validation",
),
AISFDimension(
name="Reputational Impact",
score=7.0,
weight=0.10,
rationale="Trust in AI-based fraud detection undermined; "
"customers affected by enabled fraud",
),
]
return compute_aisf_score(dimensions)Ernstscoring integreren in IR-workflows
Geautomatiseerde initiële scoring
Voor organisaties die grote volumes AI-gerelateerde waarschuwingen verwerken, kan geautomatiseerde initiële scoring incidenten triëren vóór menselijke beoordeling. De geautomatiseerde scorer gebruikt waarneembare metrieken om een voorlopige score te produceren.
def automated_initial_score(alert: dict) -> AISFScore:
"""
Produce an automated preliminary severity score from alert data.
This is intended for initial triage only. Human review is required
for any incident scoring MEDIUM or above.
Expected alert fields:
- alert_type: str (e.g., "prompt_injection", "model_drift", "data_leak")
- users_affected: int
- data_classification: str ("public", "internal", "confidential", "restricted")
- model_modified: bool
- reversible: bool
- external_visibility: bool
"""
# Map dataclassificatie naar gevoeligheidsscore
sensitivity_map = {
"public": 1.0,
"internal": 3.0,
"confidential": 6.0,
"restricted": 9.0,
}
# Map aantal gebruikers naar blast-radius-score
users = alert.get("users_affected", 0)
if users <= 1:
blast_score = 2.0
elif users <= 100:
blast_score = 4.0
elif users <= 10000:
blast_score = 6.0
elif users <= 1000000:
blast_score = 8.0
else:
blast_score = 10.0
dimensions = [
AISFDimension("Attack Sophistication", 5.0, 0.10, "Default pending investigation"),
AISFDimension(
"Data Sensitivity",
sensitivity_map.get(alert.get("data_classification", "internal"), 5.0),
0.20,
f"Data classification: {alert.get('data_classification', 'unknown')}",
),
AISFDimension(
"Model Integrity",
8.0 if alert.get("model_modified") else 3.0,
0.20,
"Model modification detected" if alert.get("model_modified") else "No model modification",
),
AISFDimension("Blast Radius", blast_score, 0.15, f"{users} users affected"),
AISFDimension(
"Reversibility",
3.0 if alert.get("reversible") else 7.0,
0.15,
"Reversible" if alert.get("reversible") else "Not easily reversible",
),
AISFDimension("Regulatory Exposure", 5.0, 0.10, "Default pending legal review"),
AISFDimension(
"Reputational Impact",
7.0 if alert.get("external_visibility") else 3.0,
0.10,
"Externally visible" if alert.get("external_visibility") else "Internal only",
),
]
return compute_aisf_score(dimensions)Escalatiematrix
Koppel AISF-ernstniveaus aan organisatorische responsacties:
| Ernst | Responstijd | Notificatie | Bezetting | Briefing voor het management |
|---|---|---|---|---|
| Informatief | Volgende werkdag | Ticket aangemaakt | Beoordeling door dienstdoende | Nee |
| Laag | 8 uur | Teamleider geïnformeerd | Toegewezen analist | Nee |
| Gemiddeld | 4 uur | IR-team geactiveerd | Toegewijd team | Dagelijkse samenvatting |
| Hoog | 1 uur | CISO geïnformeerd | Volledig IR-team | Onmiddellijk |
| Kritiek | 15 minuten | Directie en bestuur | Alle hens, externe ondersteuning | Continu |
Bijhouden van score-evolutie
Ernstscores moeten opnieuw worden beoordeeld naarmate het onderzoek vordert en nieuwe informatie naar voren komt. Houd scorewijzigingen in de tijd bij om te documenteren hoe het begrip van het team van het incident zich ontwikkelde.
from datetime import datetime
@dataclass
class ScoreRevision:
"""Een momentopname van een ernstscore-revisie."""
timestamp: str
score: AISFScore
analyst: str
reason: str
def track_severity_evolution(
revisions: list[ScoreRevision],
) -> dict:
"""
Analyseer hoe de ernstscore evolueerde tijdens het onderzoek.
Significante scorewijzigingen geven aan dat initiële aannames
werden herzien naarmate nieuw bewijs naar voren kwam.
"""
if not revisions:
return {"error": "No revisions to analyze"}
scores = [r.score.composite_score for r in revisions]
return {
"initial_score": scores[0],
"final_score": scores[-1],
"peak_score": max(scores),
"score_delta": scores[-1] - scores[0],
"revision_count": len(revisions),
"escalations": sum(
1 for i in range(1, len(scores)) if scores[i] > scores[i-1]
),
"deescalations": sum(
1 for i in range(1, len(scores)) if scores[i] < scores[i-1]
),
}Koppeling aan bestaande frameworks
MITRE ATLAS-integratie
ATLAS-technieken kunnen de dimensie Aanvalsverfijning informeren. Koppel waargenomen technieken aan hun complexiteit:
- Initial Access-technieken (AML.TA0000): Over het algemeen lagere verfijning (2-5)
- ML Attack Staging (AML.TA0001): Matige verfijning (4-7)
- ML Model Access (AML.TA0003): Varieert sterk afhankelijk van de methode (3-9)
OWASP LLM Top 10-integratie
De OWASP LLM Top 10 (editie 2025) biedt risicobeoordelingen die de AISF-scoring kunnen kalibreren. Zo draagt LLM01 (Prompt Injection) in OWASP een inherent hoge impactbeoordeling, die tot uiting moet komen in de dimensies Modelintegriteit en Datagevoeligheid van AISF.
EU AI Act-risicocategorieën
Voor organisaties die opereren onder de EU AI Act moet ernstscoring ook worden gekoppeld aan de risicocategorieën van de Act (onaanvaardbaar, hoog risico, beperkt risico, minimaal risico). Incidenten met AI-systemen met hoog risico krijgen in het AISF-framework automatisch een minimumernst van GEMIDDELD.
Referenties
- NIST. (2023). Artificial Intelligence Risk Management Framework (AI RMF 1.0). NIST AI 100-1. https://doi.org/10.6028/NIST.AI.100-1
- FIRST. (2024). Common Vulnerability Scoring System v4.0 Specification. https://www.first.org/cvss/v4.0/specification-document
- MITRE ATLAS. (2024). Adversarial Threat Landscape for Artificial Intelligence Systems. https://atlas.mitre.org/
- OWASP. (2025). OWASP Top 10 for Large Language Model Applications. https://owasp.org/www-project-top-10-for-large-language-model-applications/