mirror of
https://github.com/mukul975/Anthropic-Cybersecurity-Skills.git
synced 2026-08-03 09:20:18 +03:00
Deterministic audit against vendored MITRE/NIST oracles (ATT&CK v19.1, ATLAS 2026.07, NIST CSF 2.0, D3FEND v1.4.0) found and fixed: - 27 wrong-framework leaks on 12 AI-security skills: ATLAS AML.* IDs were under `mitre_attack` (-> `atlas_techniques`) and AI-RMF GOVERN/MEASURE IDs under `nist_csf` (-> `nist_ai_rmf`). - RS.AN-01 -> RS.AN-03 on 37 forensics/incident-analysis skills (CSF 1.1 ID retired in CSF 2.0; RS.AN-03 is the incident-analysis successor). - PR.DS-06 -> PR.DS-01 on the SLSA/Sigstore provenance skill (CSF 1.1 ID absorbed into PR.DS-01 in CSF 2.0; body prose updated too). - AML.T0104 -> AML.T0010 on 3 software-supply-chain skills (T0104 is "Publish Poisoned AI Agent Tool" -- wrong topic; T0010 "AI Supply Chain Compromise" is correct). CSF/ATLAS replacements verified against NIST CSWP.29, the official CSF 1.1->2.0 transition workbook, and mitre-atlas/atlas-data. Framework-ID gate: 0 defects. Schema: 817/817 pass.
216 lines
10 KiB
Markdown
216 lines
10 KiB
Markdown
---
|
|
name: detecting-data-and-model-poisoning
|
|
description: Identify poisoned training data and backdoored models across the ML pipeline.
|
|
domain: cybersecurity
|
|
subdomain: ai-security
|
|
tags:
|
|
- ai-security
|
|
- data-poisoning
|
|
- model-backdoor
|
|
- ml-supply-chain
|
|
- adversarial-robustness-toolbox
|
|
- activation-clustering
|
|
- spectral-signatures
|
|
- model-integrity
|
|
version: '1.0'
|
|
author: mahipal
|
|
license: Apache-2.0
|
|
nist_ai_rmf:
|
|
- MEASURE-2.7
|
|
atlas_techniques:
|
|
- AML.T0020
|
|
- AML.T0018
|
|
---
|
|
# Detecting Data and Model Poisoning
|
|
|
|
> **Authorized-use-only notice:** This skill includes routines that craft poisoned samples and backdoor triggers for *defensive validation*. Generate and use poisoned data and backdoored models only in isolated test environments you control. Never deploy a backdoored model or distribute poisoned datasets.
|
|
|
|
## Overview
|
|
|
|
Data poisoning and model backdooring attack the *integrity* of an ML system at training time rather than at inference. In **data poisoning** (MITRE ATLAS **AML.T0020 Poison Training Data**), an adversary injects manipulated samples into the training, fine-tuning, or RAG corpus so the resulting model misbehaves — degraded accuracy, targeted misclassification, or an attacker-chosen bias. In **model backdooring** (MITRE ATLAS **AML.T0018 Backdoor ML Model**), the model behaves normally on clean inputs but produces an attacker-chosen output whenever a hidden *trigger* (a pixel patch, a rare token, a phrase) is present. Both are amplified by **ML supply-chain compromise (AML.T0010)**: poisoned public datasets, trojaned pre-trained weights downloaded from a hub, or a malicious model serialization. This is OWASP **LLM04:2025 Data and Model Poisoning**.
|
|
|
|
Detection spans the pipeline. On the *data* side: provenance and integrity checks, statistical outlier and label-flip detection, and de-duplication of suspiciously near-identical samples. On the *model* side: activation-clustering and spectral-signature analysis (which exploit the fact that poisoned samples activate the network differently than clean ones) and trigger reconstruction. On the *supply-chain* side: verifying weights hashes/signatures and refusing unsafe serialization formats (pickle-based `.bin`/`.pt`) in favor of safetensors. This skill implements all three using IBM's **Adversarial Robustness Toolbox (ART)**, **Cleanlab** for label-quality issues, and integrity tooling.
|
|
|
|
## When to Use
|
|
|
|
- Before training/fine-tuning on third-party or user-contributed data.
|
|
- Before deploying a model built on a downloaded pre-trained checkpoint.
|
|
- During an ML supply-chain security review.
|
|
- When investigating anomalous model behavior tied to specific inputs (possible backdoor trigger).
|
|
- As a CI/CD gate that scans datasets and model artifacts before they enter the pipeline.
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.10+ and a virtual environment.
|
|
- Install the tooling:
|
|
|
|
```bash
|
|
python -m venv .venv && source .venv/bin/activate
|
|
|
|
# IBM Adversarial Robustness Toolbox — poisoning detection defenses
|
|
pip install adversarial-robustness-toolbox
|
|
|
|
# Cleanlab — label/data quality issue detection
|
|
pip install cleanlab
|
|
|
|
# Modeling + safe serialization + hashing
|
|
pip install numpy scikit-learn safetensors
|
|
|
|
# (Choose one framework backend ART can wrap)
|
|
pip install tensorflow # or: pip install torch
|
|
```
|
|
|
|
## Objectives
|
|
|
|
- Verify dataset and model-weight provenance and integrity (hashes/signatures, safe formats).
|
|
- Detect label-quality issues and outliers in training data with Cleanlab.
|
|
- Detect poisoned samples in a trained model using ART activation clustering.
|
|
- Confirm findings with ART spectral-signature analysis.
|
|
- Probe a suspect model for backdoor triggers and quantify trigger-induced misclassification.
|
|
- Produce a poisoning-assessment report mapped to ATLAS AML.T0020 / AML.T0018.
|
|
|
|
## MITRE ATT&CK Mapping
|
|
|
|
| ID | Official Name | Relevance |
|
|
|----|---------------|-----------|
|
|
| AML.T0020 | Poison Training Data | Injection of manipulated samples into the training corpus |
|
|
| AML.T0018 | Backdoor ML Model | Trigger-activated hidden behavior in the trained model |
|
|
| AML.T0010 | ML Supply Chain Compromise | Poisoned public datasets / trojaned downloaded weights |
|
|
| AML.T0024 | Exfiltration via ML Inference API | Some poisoning aims to leak data via the model's responses |
|
|
|
|
## Workflow
|
|
|
|
### 1. Verify data and model provenance/integrity
|
|
Refuse artifacts whose hash/signature you cannot verify, and prefer safetensors over pickle-based formats (pickle can execute code on load).
|
|
|
|
```bash
|
|
# Verify a downloaded checkpoint against a published SHA-256
|
|
sha256sum model.safetensors
|
|
# compare to the hub-published digest
|
|
|
|
# Flag unsafe pickle-based weights in a directory
|
|
find ./models -type f \( -name "*.bin" -o -name "*.pt" -o -name "*.pkl" -o -name "*.ckpt" \)
|
|
```
|
|
|
|
```python
|
|
# safe_load.py — load weights without executing pickle
|
|
from safetensors.numpy import load_file
|
|
weights = load_file("model.safetensors") # no arbitrary code execution
|
|
```
|
|
|
|
### 2. Detect label/data-quality issues with Cleanlab
|
|
Cleanlab finds mislabeled, outlier, and near-duplicate samples — common signatures of label-flip poisoning.
|
|
|
|
```python
|
|
# cleanlab_scan.py
|
|
import numpy as np
|
|
from cleanlab.filter import find_label_issues
|
|
|
|
# pred_probs: out-of-sample predicted probabilities (n_samples x n_classes)
|
|
# labels: given integer labels (n_samples,)
|
|
def scan(labels: np.ndarray, pred_probs: np.ndarray):
|
|
issues = find_label_issues(
|
|
labels=labels, pred_probs=pred_probs,
|
|
return_indices_ranked_by="self_confidence",
|
|
)
|
|
print(f"[*] {len(issues)} suspected label issues (potential poisoning)")
|
|
return issues
|
|
```
|
|
|
|
### 3. Detect poisoned samples via ART activation clustering
|
|
ActivationDefence clusters per-class activations; a class whose activations split into two distinct clusters indicates injected (poisoned) samples.
|
|
|
|
```python
|
|
# activation_defence.py
|
|
import numpy as np
|
|
from art.estimators.classification import KerasClassifier
|
|
from art.defences.detector.poison import ActivationDefence
|
|
|
|
def detect(model, x_train, y_train):
|
|
classifier = KerasClassifier(model=model) # wrap your trained model
|
|
defence = ActivationDefence(classifier, x_train, y_train)
|
|
report, is_clean_lst = defence.detect_poison(
|
|
nb_clusters=2, nb_dims=10, reduce="PCA"
|
|
)
|
|
# is_clean_lst[i] == 0 marks a suspected poisoned sample
|
|
poisoned_idx = np.where(np.array(is_clean_lst) == 0)[0]
|
|
print(f"[*] activation clustering flagged {len(poisoned_idx)} samples")
|
|
return poisoned_idx, report
|
|
```
|
|
|
|
### 4. Confirm with ART spectral signatures
|
|
Spectral signatures use the covariance spectrum of feature representations to surface poisoned samples — a strong second signal.
|
|
|
|
```python
|
|
# spectral.py
|
|
import numpy as np
|
|
from art.estimators.classification import KerasClassifier
|
|
from art.defences.detector.poison import SpectralSignatureDefense
|
|
|
|
def detect(model, x_train, y_train, nb_classes):
|
|
classifier = KerasClassifier(model=model)
|
|
defence = SpectralSignatureDefense(
|
|
classifier, x_train, y_train,
|
|
expected_pp_poison=0.05, batch_size=128, eps_multiplier=1.5,
|
|
)
|
|
report, is_clean_lst = defence.detect_poison()
|
|
poisoned_idx = np.where(np.array(is_clean_lst) == 0)[0]
|
|
print(f"[*] spectral signatures flagged {len(poisoned_idx)} samples")
|
|
return poisoned_idx, report
|
|
```
|
|
|
|
### 5. Probe the model for backdoor triggers
|
|
Test whether a candidate trigger flips predictions to an attacker target class far above the clean baseline.
|
|
|
|
```python
|
|
# trigger_probe.py
|
|
import numpy as np
|
|
|
|
def test_trigger(model, x_clean, target_class, apply_trigger):
|
|
"""apply_trigger(x) stamps a candidate trigger (e.g. a corner pixel patch)."""
|
|
clean_preds = model.predict(x_clean).argmax(axis=1)
|
|
x_trig = np.stack([apply_trigger(x.copy()) for x in x_clean])
|
|
trig_preds = model.predict(x_trig).argmax(axis=1)
|
|
asr = float(np.mean(trig_preds == target_class)) # attack success rate
|
|
base = float(np.mean(clean_preds == target_class))
|
|
print(f"[*] target-class rate clean={base:.3f} triggered={asr:.3f}")
|
|
return {"baseline": base, "trigger_success_rate": asr,
|
|
"backdoor_suspected": asr - base > 0.5}
|
|
```
|
|
|
|
### 6. Quarantine, retrain, and report
|
|
Remove flagged samples (intersection of Cleanlab + ART signals is highest-confidence), retrain on the cleaned set, and re-test for the trigger. Document: artifact provenance, samples flagged by each method, trigger ASR before/after, and ATLAS mapping. Recommend dataset provenance controls, signed weights (safetensors + sigstore/cosign), and ongoing pipeline scanning.
|
|
|
|
## Tools and Resources
|
|
|
|
| Tool | Purpose | Source |
|
|
|------|---------|--------|
|
|
| Adversarial Robustness Toolbox | Activation clustering & spectral-signature poisoning defenses | https://github.com/Trusted-AI/adversarial-robustness-toolbox |
|
|
| Cleanlab | Label/data-quality issue detection | https://github.com/cleanlab/cleanlab |
|
|
| safetensors | Safe (non-pickle) weight serialization | https://github.com/huggingface/safetensors |
|
|
| OWASP LLM04:2025 | Data and Model Poisoning reference | https://genai.owasp.org/llmrisk/llm042025-data-and-model-poisoning/ |
|
|
| MITRE ATLAS | AI threat technique taxonomy | https://atlas.mitre.org/ |
|
|
|
|
## Detection Method Reference
|
|
|
|
| Layer | Method | Tool | Signal |
|
|
|-------|--------|------|--------|
|
|
| Supply chain | Hash/signature + safe format | sha256/safetensors | Tampered or unsafe artifact |
|
|
| Data | Label issues / outliers | Cleanlab | Mislabeled / injected samples |
|
|
| Model | Activation clustering | ART ActivationDefence | Per-class activation split |
|
|
| Model | Spectral signatures | ART SpectralSignatureDefense | Outlier covariance spectrum |
|
|
| Model | Trigger probing | custom | High trigger attack-success-rate |
|
|
|
|
## Validation Criteria
|
|
|
|
- [ ] Dataset and weight provenance/integrity verified (hashes, safe format)
|
|
- [ ] Unsafe pickle-based artifacts identified and avoided
|
|
- [ ] Cleanlab label-issue scan run and suspicious samples listed
|
|
- [ ] ART activation clustering executed with flagged sample indices
|
|
- [ ] ART spectral-signature analysis run as confirmation
|
|
- [ ] Backdoor trigger probe quantifies attack-success-rate vs. baseline
|
|
- [ ] Highest-confidence poisoned samples quarantined (multi-method overlap)
|
|
- [ ] Model retrained on cleaned data and re-tested for the trigger
|
|
- [ ] Findings mapped to MITRE ATLAS AML.T0020 / AML.T0018 and OWASP LLM04:2025
|
|
- [ ] Report delivered with remediation (provenance, signed weights, pipeline scanning)
|