Deep Supply Chain Analysis
Uitgebreide analyse van de dependencyboom van de AI-supplychain, met aandacht voor modelgewichten, tokenizers, datasets, bibliotheken en infrastructuurcomponenten, inclusief auditmethodologie.
Deep Supply Chain Analysis
De AI-supplychain is dieper en minder zichtbaar dan traditionele software-supplychains. Een productie-AI-systeem is afhankelijk van modelgewichten (ondoorzichtige binaire blobs), tokenizerconfiguraties (uitvoerbare codepaden), trainingsdatasets (op schaal niet te auditen), orkestratiebibliotheken (snelle releases met minimale review) en infrastructuurcomponenten (GPU-drivers, container runtimes, serving-frameworks). Het compromitteren van één enkele laag kan het hele systeem ondermijnen.
De AI-dependencyboom
Een typisch productie-AI-systeem heeft zes dependency-lagen, elk met verschillende vertrouwensaannames en aanvalsvectoren.
| Laag | Componenten | Vertrouwensaanname | Primaire aanvalsvector |
|---|---|---|---|
| Modelgewichten | Voorgetrainde modellen, gefinetunede checkpoints, adaptergewichten | Gewichten zijn veilig om te laden | Pickle-RCE, getrojaniseerde gewichten, backdoor-insertie |
| Tokenizers | Vocabulairebestanden, tokenizerconfiguraties, custom tokenizercode | Tokenizers verwerken alleen tekst | Uitvoering van custom tokenizercode, vocabulairemanipulatie |
| Datasets | Trainingsdata, evaluatiebenchmarks, RAG-corpora | Data is schoon en representatief | Datavergiftiging, benchmarkmanipulatie, corpusinjectie |
| Bibliotheken | ML-frameworks, orkestratiebibliotheken, utility-pakketten | Bibliotheken zijn goedaardig en correct | Dependency confusion, typosquatting, kwaadaardige updates |
| Infrastructuur | GPU-drivers, container runtimes, serving-frameworks | Infrastructuur is correct geconfigureerd | Driver-exploits, container escape, misconfiguraties |
| Configuratie | Hyperparameters, deployment-configuraties, feature flags | Configuraties zijn gereviewd en correct | Config-injectie, secretblootstelling, drift |
Analyse van modelgewichten
Verificatie van herkomst
Verifieer de bronrepository
Bevestig dat het model is gedownload van de officiële repository. Controleer de verificatiebadge van de HuggingFace-organisatie, de commitgeschiedenis en de model card. Let op getyposquatte repositorynamen.
Controleer het bestandsformaat
Verifieer dat de gewichten het safetensors-formaat gebruiken in plaats van pickle-gebaseerde formaten (.pt, .bin, .pkl). Als er pickle-bestanden aanwezig zijn, moeten ze worden geaudit voordat ze worden geladen.
Valideer checksums
Vergelijk de SHA-256-hashes van de gedownloade bestanden met de gepubliceerde checksums. Verifieer voor HuggingFace-modellen tegen de commit-hash in de model card.
Scan op custom code
Controleer op custom modeling-code (
modeling_*.py,configuration_*.py). Alstrust_remote_code=Truevereist is, audit dan elk custom bestand voordat je laadt.Test op backdoors
Voer gedragstests uit met bekende triggerpatronen. Een backdoored model produceert afwijkende outputs bij trigger-inputs, terwijl het zich anders normaal gedraagt.
Beoordeling van gewichtsintegriteit
| Controle | Wat het detecteert | Hoe |
|---|---|---|
| Validatie van bestandsformaat | Pickle-gebaseerde RCE-payloads | Controleer de magic bytes van het bestand; safetensors begint met { (JSON-header) |
| Statistische analyse | Afwijkende gewichtsverdelingen die op manipulatie wijzen | Vergelijk gewichtsstatistieken met een referentiemodel |
| Hashing op laagniveau | Gerichte gewichtsmodificaties (backdoor-insertie) | Hash individuele lagen en vergelijk over checkpoints heen |
| Gedragstesten | Backdoor-triggers | Test met bekende triggerpatronen, meet outputdivergentie |
Tokenizerbeveiliging
Tokenizers worden vaak over het hoofd gezien in beveiligingsaudits omdat ze worden gezien als eenvoudige tekstverwerkers. In werkelijkheid kunnen tokenizerconfiguraties uitvoerbare code bevatten, en kunnen vocabulairemanipulaties het modelgedrag subtiel veranderen.
| Risico | Beschrijving | Impact |
|---|---|---|
| Custom tokenizercode | tokenizer.py of tokenizer_config.json die naar custom Python-classes verwijst | Willekeurige code-uitvoering bij tokenizerinitialisatie |
| Vocabulairemanipulatie | Gewijzigd vocabulaire dat bepaalde tokens naar onverwachte ID's mapt | Subtiele gedragsveranderingen, omzeilen van safety voor specifieke zinnen |
| Preprocessing-injectie | Custom pre-/postprocessing-functies in de tokenizerconfiguratie | Code-uitvoering tijdens tekstverwerking |
| Vergiftiging van BPE-merge-tabel | Gewijzigde merge-regels die veranderen hoe tekst wordt getokeniseerd | Veranderd modelgedrag voor specifieke inputs |
Dataset-supplychain
Matrix voor risicobeoordeling
| Databron | Integriteitsrisico | Verificatiemethode |
|---|---|---|
| HuggingFace Datasets | Gemiddeld -- community-uploads met beperkte review | Controleer de dataset card, contributorgeschiedenis, steekproefinspectie |
| Common Crawl / C4 | Hoog -- webscrapes bevatten adversariële inhoud | Statistische analyse, toxiciteitsscanning, deduplicatie-audit |
| Interne data | Laag-gemiddeld -- afhankelijk van interne controles | Audit van toegangscontrole, tracking van dataherkomst |
| Synthetische data (LLM-gegenereerd) | Gemiddeld -- modelbiases propageren | Diversiteitsanalyse, hallucinatiepercentage, audit van het bronmodel |
| Gescrapete data (custom) | Hoog -- geen garantie op herkomst | URL-validatie, contentverificatie, juridische review |
Audit van de datapijplijn
import hashlib
from datasets import load_dataset
def audit_dataset(dataset_name, expected_hash=None):
"""Basic dataset integrity audit."""
ds = load_dataset(dataset_name, split="train")
audit_results = {
"name": dataset_name,
"num_samples": len(ds),
"columns": ds.column_names,
"sample_hash": hashlib.sha256(
str(ds[:100]).encode()
).hexdigest(),
}
# Controleer op verdachte patronen in tekstvelden
text_cols = [c for c in ds.column_names if ds.features[c].dtype == "string"]
for col in text_cols:
samples = ds[col][:1000]
injection_patterns = [
"ignore previous", "system prompt", "IMPORTANT:",
"<script", "javascript:", "eval(",
]
for pattern in injection_patterns:
matches = sum(1 for s in samples if pattern.lower() in s.lower())
if matches > 0:
audit_results[f"suspicious_{col}_{pattern}"] = matches
if expected_hash and audit_results["sample_hash"] != expected_hash:
audit_results["integrity_warning"] = "Hash mismatch!"
return audit_resultsAnalyse van bibliotheek-dependencies
ML-specifieke dependency-risico's
| Pakketcategorie | Voorbeelden | Primair risico | Auditfocus |
|---|---|---|---|
| ML-frameworks | PyTorch, TensorFlow, JAX | Native code-exploits, pickle-defaults | Versie-pinning, build-verificatie |
| Orkestratie | LangChain, LlamaIndex, Semantic Kernel | Snelle release-cyclus, onveilige defaults | Changelog-review, tracking van security advisories |
| Dataverwerking | pandas, numpy, Pillow | Kwetsbaarheden in C-extensies, deserialisatie | CVE-tracking, inputvalidatie |
| Model serving | vLLM, TGI, Triton | Netwerkblootstelling, GPU-geheugentoegang | Configuratie-hardening, toegangscontrole |
| Experiment tracking | MLflow, W&B, Neptune | Credentialopslag, artefactintegriteit | Toegangscontrole, artefactondertekening |
SBOM voor AI-systemen
Een standaard SBOM dekt softwarebibliotheken, maar mist AI-specifieke componenten. Een AI-uitgebreide SBOM zou moeten omvatten:
- Model Bill of Materials (MBOM) -- Modelnaam, versie, bron, formaat, checksum, herkomst van trainingsdata
- Data Bill of Materials (DBOM) -- Datasetnamen, versies, bronnen, preprocessing-scripts, licenties
- Standaard SBOM -- Alle Python-/systeempakketten met versies en hashes
- Infrastructure BOM -- GPU-drivers, CUDA-versie, container base images, serving-frameworkversies
Methodologie voor supplychain-audit
Inventariseer alle componenten
Lijst elke dependency over alle zes lagen heen op. Gebruik
pip freeze, inspectie van container images, review van model cards en infrastructuurdocumentatie. Het doel is een volledige bill of materials.Beoordeel de herkomst voor elk component
Beantwoord voor elk component: waar kwam het vandaan, wie heeft het gepubliceerd, hoe werd het geleverd, en is de integriteit geverifieerd? Markeer componenten met onduidelijke of niet-geverifieerde herkomst.
Identificeer kritieke paden
Breng in kaart welke componenten zich op het kritieke pad van input naar output bevinden. Een gecompromitteerde tokenizer treft elk verzoek; een gecompromitteerde evaluatiedataset treft alleen de modelselectie.
Test op bekende aanvalspatronen
Controleer op pickle-bestanden in modelartefacten,
trust_remote_code=Truein laadcode, ongepinde dependencies in requirements-bestanden, en blootgestelde secrets in configuratie.Genereer hardening-aanbevelingen
Prioriteer op risico (positie op het kritieke pad maal exploiteerbaarheid) en haalbaarheid. Quick wins eerst: pin versies, schakel over naar safetensors, verwijder onnodige tools.
Gerelateerde onderwerpen
- Integration & Framework Security -- Kwetsbaarheden op frameworkniveau
- AI Supply Chain Exploitation -- Aanvalstechnieken voor modelserialisatie en dependencies
- Pickle Exploits -- Diepgaande verkenning van pickle-deserialisatie-aanvallen
- Cloud AI Infrastructure Attacks -- Beveiligingsbeoordeling op infrastructuurniveau
Een AI-systeem laadt een model van HuggingFace dat trust_remote_code=True vereist en het safetensors-formaat voor gewichten gebruikt. Een security-auditor beweert dat het systeem veilig is omdat safetensors code-uitvoering voorkomt. Wat is er mis met deze beoordeling?
Referenties
- SLSA (Supply-chain Levels for Software Artifacts) -- Supply chain security framework
- OWASP Machine Learning Security Top 10 -- ML supply chain risks
- Model Cards for Model Reporting (Mitchell et al., 2019) -- Model documentation standards