Model Tampering Detection
Manipulatie van modelbestanden detecteren: verificatie van gewichtshashes, validatie van architectuur, inspectie van adapters, verificatie van kwantisatie en integriteitscontroles van de toeleveringsketen.
Model Tampering Detection
Detectie van modelmanipulatie werkt op het niveau van bestanden en artefacten en verifieert dat modelbestanden niet zijn gewijzigd ten opzichte van hun bekend-goede staat. Terwijl behavior diffing veranderingen detecteert via waarneembare uitvoer, onderzoekt manipulatiedetectie de artefacten zelf -- gewichtsbestanden, configuratie, tokenizer, adapters -- op bewijs van ongeautoriseerde wijziging.
Verificatie van gewichtshashes
De meest fundamentele integriteitscontrole is verifiëren dat modelgewichtsbestanden niet zijn veranderd sinds hun laatste bekend-goede staat.
Hashingstrategie
| Aanpak | Wat te hashen | Wanneer te gebruiken |
|---|---|---|
| Hashing op bestandsniveau | SHA-256 van volledige gewichtsbestanden | Snelle verificatie; detecteert elke wijziging |
| Hashing op laagniveau | Hash van de gewichtstensor van elke laag | Identificeert welke lagen zijn gewijzigd |
| Hashing op tensorniveau | Hash van individuele gewichtstensoren | Wijst de exacte gewijzigde componenten aan |
| Statistische fingerprinting | Statistische eigenschappen van gewichtsverdelingen | Detecteert wijzigingen zelfs als het bestandsformaat verandert |
import hashlib
import json
from safetensors import safe_open
def verify_model_integrity(model_path, expected_checksums):
"""
Verifieer de integriteit van modelbestanden tegen bekend-goede checksums.
Geeft een lijst van niet-overeenkomende bestanden terug.
"""
mismatches = []
for filename, expected_hash in expected_checksums.items():
filepath = f"{model_path}/{filename}"
sha256 = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
sha256.update(chunk)
actual_hash = sha256.hexdigest()
if actual_hash != expected_hash:
mismatches.append({
"file": filename,
"expected": expected_hash,
"actual": actual_hash
})
return mismatches
def generate_layer_checksums(model_path):
"""
Genereer checksums per laag voor gedetailleerde integriteitstracking.
"""
checksums = {}
with safe_open(f"{model_path}/model.safetensors", framework="pt") as f:
for key in f.keys():
tensor = f.get_tensor(key)
tensor_bytes = tensor.numpy().tobytes()
checksums[key] = hashlib.sha256(tensor_bytes).hexdigest()
return checksumsEen bekend-goede staat vaststellen
Een hash is alleen nuttig als je een betrouwbare referentie hebt. Stel de bekend-goede staat vast op deze momenten:
| Checkpoint | Wat te registreren | Opslag |
|---|---|---|
| Modelverwerving | Hash alle bestanden direct na download of ontvangst | Veilige, append-only opslag |
| Na fine-tuning | Hash het complete model na elke fine-tuning-run | Gekoppeld aan trainingstaak-ID |
| Pre-deployment | Hash de exacte bestanden die naar productie zijn gedeployed | Gekoppeld aan deployment-ID |
| Na kwantisatie | Hash gekwantiseerde modelbestanden | Gekoppeld aan kwantisatieconfiguratie |
| Geplande audit | Herverifieer periodiek tegen opgeslagen hashes | Auditlog |
Validatie van architectuur
Manipulatie kan inhouden dat de architectuur van het model wordt gewijzigd -- verborgen lagen toevoegen, laaggroottes veranderen of extra componenten invoegen.
Architectuurcontroles
| Controle | Wat te verifiëren | Manipulatiesignaal |
|---|---|---|
| Aantal lagen | Aantal transformer-lagen komt overeen met de specificatie | Extra lagen kunnen backdoor-componenten verbergen |
| Hidden size | Embeddingdimensie komt overeen met de verwachte waarde | Gewijzigde dimensies wijzen op architecturale veranderingen |
| Attention heads | Aantal attention heads per laag | Extra heads kunnen aan backdoor-verwerking gewijd zijn |
| Woordenschatgrootte | Grootte van de tokenizer-woordenschat komt overeen met de verwachte waarde | Toegevoegde tokens kunnen backdoor-triggers zijn |
| Aantal parameters | Totaal aantal parameters komt overeen met de verwachte waarde | Extra parameters wijzen op verborgen componenten |
| Architectuurtype | Modelklasse komt overeen met de verwachte architectuur | Verkeerde architectuurklasse kan op het verwisselen van het model wijzen |
from transformers import AutoConfig
def validate_architecture(model_path, expected_config):
"""
Valideer de modelarchitectuur tegen de verwachte specificatie.
"""
actual_config = AutoConfig.from_pretrained(model_path)
discrepancies = []
checks = {
"num_hidden_layers": expected_config.get("num_hidden_layers"),
"hidden_size": expected_config.get("hidden_size"),
"num_attention_heads": expected_config.get("num_attention_heads"),
"vocab_size": expected_config.get("vocab_size"),
"intermediate_size": expected_config.get("intermediate_size"),
"model_type": expected_config.get("model_type"),
}
for key, expected_value in checks.items():
actual_value = getattr(actual_config, key, None)
if actual_value != expected_value:
discrepancies.append({
"parameter": key,
"expected": expected_value,
"actual": actual_value
})
return discrepanciesInspectie van adapters
Adapters zijn een veelvoorkomende vector voor modelmanipulatie omdat ze klein zijn, eenvoudig te distribueren en het modelgedrag aanpassen zonder de basisgewichten aan te raken.
Checklist voor adapterverificatie
| Controle | Hoe te verifiëren | Risico |
|---|---|---|
| Herkomst van de bron | Verifieer de oorsprong en maker van de adapter | Community-adapters uit onbekende bronnen vormen een hoog risico |
| Bestandsintegriteit | Hash adapterbestanden en vergelijk met gepubliceerde checksums | Wijziging tijdens download of opslag |
| Rank en dimensies | Controleer of de LoRA-rank overeenkomt met de geclaimde specificatie | Hogere rank betekent meer mogelijkheid tot gedragswijziging |
| Doelmodules | Verifieer welke modellagen de adapter aanpast | Adapters die attention-lagen targeten hebben de meeste gedragsimpact |
| Herkomst van trainingsdata | Verifieer de trainingsdata die voor de adapter is gebruikt | Vergiftigde trainingsdata creëert vergiftigde adapters |
| Gedragsimpact | Vergelijk modelgedrag met en zonder de adapter | Onverwachte gedragsveranderingen wijzen op mogelijke kwaadaardige bedoelingen |
from peft import PeftConfig
import json
def inspect_adapter(adapter_path):
"""
Inspecteer een LoRA-adapter op verdachte kenmerken.
"""
config = PeftConfig.from_pretrained(adapter_path)
report = {
"adapter_type": config.peft_type,
"base_model": config.base_model_name_or_path,
"rank": config.r,
"lora_alpha": config.lora_alpha,
"target_modules": list(config.target_modules),
"modules_to_save": config.modules_to_save,
"lora_dropout": config.lora_dropout,
}
# Markeer verdachte kenmerken
flags = []
if config.r > 64:
flags.append("HIGH_RANK: LoRA-rank > 64 duidt op uitgebreide "
"wijzigingsmogelijkheid")
if "embed_tokens" in str(config.target_modules):
flags.append("EMBEDDING_TARGET: Adapter wijzigt invoer-embeddings, "
"wat gedrag op tokenniveau kan veranderen")
if config.modules_to_save:
flags.append("FULL_MODULES: Adapter vervangt sommige modules volledig, "
"niet alleen low-rank-aanpassing")
report["flags"] = flags
return reportRisico's van adapter-stacking
Meerdere adapters kunnen worden gestapeld, en kwaadaardig gedrag kan alleen verschijnen wanneer specifieke combinaties actief zijn:
| Risico | Beschrijving | Mitigatie |
|---|---|---|
| Verborgen interactie | Twee onschuldige adapters werken samen om kwaadaardig gedrag te produceren | Test alle adaptercombinaties, niet alleen individuele adapters |
| Voorwaardelijke activatie | Adaptergedrag hangt af van welke andere adapters actief zijn | Documenteer en test alle deployment-configuraties |
| Override-aanvallen | Kwaadaardige adapter overschrijft een op veiligheid gerichte adapter | Verifieer de laadvolgorde en prioriteit van adapters |
Verificatie van kwantisatie
Kwantisatie verandert de numerieke representatie van gewichten, wat het modelgedrag subtiel kan wijzigen. Kwaadaardige kwantisatie kan worden ontworpen om specifiek gedrag te verslechteren terwijl de algehele prestaties behouden blijven.
Integriteitscontroles van kwantisatie
| Controle | Wat te verifiëren | Tool |
|---|---|---|
| Kwantisatieformaat | Formaat komt overeen met de geclaimde specificatie (GPTQ, AWQ, GGUF, enz.) | Inspectie van bestandsheader |
| Bitbreedte | Daadwerkelijke precisie komt overeen met de geclaimde precisie | Analyse van gewichtsstatistieken |
| Kalibratiedata | Welke data is gebruikt voor kalibratie | Herkomstdocumentatie |
| Behoud van gedrag | Gekwantiseerd model komt binnen verwachte grenzen overeen met het full-precision-gedrag | Behavior diffing |
| Behoud van veiligheid | Veiligheidsgedrag niet disproportioneel beïnvloed door kwantisatie | Vergelijking van veiligheidsbenchmark |
import numpy as np
def verify_quantization_stats(model_path, expected_format, expected_bits):
"""
Verifieer kwantisatieparameters en detecteer anomalieën.
"""
# Laad de kwantisatieconfiguratie
with open(f"{model_path}/quantize_config.json") as f:
quant_config = json.load(f)
issues = []
if quant_config.get("bits") != expected_bits:
issues.append(f"Bitbreedte komt niet overeen: verwacht {expected_bits}, "
f"gekregen {quant_config.get('bits')}")
if quant_config.get("quant_method") != expected_format:
issues.append(f"Formaat komt niet overeen: verwacht {expected_format}, "
f"gekregen {quant_config.get('quant_method')}")
# Controleer op gemengde precisie (sommige lagen op andere precisie)
if quant_config.get("mixed_precision"):
issues.append("Gemengde precisie gedetecteerd -- verifieer welke lagen "
"op verminderde precisie staan")
return issuesVerificatieworkflow van de toeleveringsketen
Verifieer de authenticiteit van de bron
Bevestig dat het model is gedownload van de geclaimde bron. Controleer op HTTPS, verifieer domeinnamen en vergelijk downloadhashes met de gepubliceerde checksums van de aanbieder.
Scan modelbestanden op kwaadaardige code
Modelbestanden in bepaalde formaten (pickle, PyTorch
.bin) kunnen willekeurige code bevatten die tijdens het laden wordt uitgevoerd. Geef de voorkeur aan het SafeTensors-formaat. Scan pickle-bestanden op verdachte codepaden.# Scan op risico's van pickle-gebaseerde code-uitvoering python -c " import pickletools, sys with open(sys.argv[1], 'rb') as f: pickletools.dis(f) " model.bin | grep -E "GLOBAL|REDUCE|BUILD|INST"Verifieer architectuur en checksums
Voer architectuurvalidatie en hashverificatie uit tegen de gepubliceerde specificaties van de aanbieder.
Gedragsmatige smoke test
Voer een snelle gedragsevaluatie uit en vergelijk met de gepubliceerde benchmarks van de aanbieder. Markeer elke significante afwijking.
Documenteer de herkomst
Registreer de complete herkomstketen: bron-URL, downloadtijdstempel, bestandshashes, verificatieresultaten en wie de verificatie uitvoerde.
Gerelateerde onderwerpen
- Backdoor Detection -- gedragsmatige detectie die verificatie op bestandsniveau aanvult
- Behavior Diffing -- gedrag vergelijken wanneer wijzigingen op bestandsniveau worden gedetecteerd
- Model Snapshots -- de modelstatus bewaren voor toekomstige verificatie
- Infrastructure & Supply Chain -- aanvalsvectoren in de toeleveringsketen voor AI-systemen
Referenties
- "SafeTensors: A Simple, Safe Serialization Format" - Hugging Face (2024) - Secure model serialization that prevents code execution during loading
- "Model Supply Chain Security" - MITRE ATLAS (2025) - Supply chain attack taxonomy for AI models
- "Quantization and Safety: How Precision Reduction Affects LLM Safety Behaviors" - arXiv (2025) - Research on quantization's impact on model safety
- "Securing the ML Supply Chain" - Google Security Blog (2024) - Best practices for ML model supply chain security
Een model doorstaat de hashverificatie op bestandsniveau tegen bekend-goede checksums, maar vertoont veiligheidsregressie bij gedragstests. Wat moet je vervolgens onderzoeken?