Op tokenisatie gebaseerde aanvallen
Hoe het gedrag van tokenizers misbruikbare gaten creëert tussen voor mensen leesbare tekst en de interne representaties van het model, waardoor filteromzeiling en obfuscatie van payloads mogelijk worden.
De tokenizer is de eerste component die invoer voor een LLM verwerkt en voor mensen leesbare tekst omzet in sequenties van gehele token-ID's. Deze conversie is lossy, niet-intuïtief en modelspecifiek — eigenschappen die een rijk aanvalsoppervlak creëren voor redteamers.
Tokenizer-families
De twee dominante tokenizer-families gedragen zich heel verschillend. BPE wordt gebruikt door de GPT-familie, terwijl SentencePiece wordt gebruikt door LLaMA en vergelijkbare modellen:
| Eigenschap | BPE (GPT-familie) | SentencePiece (LLaMA-familie) |
|---|---|---|
| Witruimte | Vooraf getokeniseerd op spaties | Gecodeerd als ▁-prefix |
| Onbekende tekens | Byte-level fallback | UTF-8-bytetokens |
| Determinisme | Volledig deterministisch | Kan een probabilistisch unigram-model gebruiken |
| Overdraagbaarheid exploit | GPT-specifiek | LLaMA/Mistral-specifiek |
Manipulatie van tokengrenzen
Een belangrijke eigenschap van subword-tokenizers is dat het invoegen van tekens de tokengrenzen kan verschuiven, waardoor de manier verandert waarop het model een woord waarneemt.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# Normale tokenisatie
print(tokenizer.tokenize("ignore")) # ['ign', 'ore']
# Voeg een zero-width space in om de grenzen te wijzigen
print(tokenizer.tokenize("ig\u200bnore")) # Andere tokensplitsing
# Vind tekens die de grenzen verschuiven
word = "dangerous"
splitters = ["\u200b", "\u200c", "\u200d", "\ufeff", "\u00ad"]
for pos in range(1, len(word)):
for s in splitters:
modified = word[:pos] + s + word[pos:]
original_tokens = tokenizer.encode(word)
modified_tokens = tokenizer.encode(modified)
if modified_tokens != original_tokens:
print(f"Boundary shift at position {pos} with {repr(s)}")Tokenbotsingsaanvallen
Verschillende invoerstrings kunnen identieke tokensequenties produceren — een tokenbotsing. Dit betekent dat een veiligheidsfilter dat de ruwe tekst controleert een onschuldige string kan zien, terwijl het model iets totaal anders verwerkt.
# Homoglyph-substitutie: visueel vergelijkbare tekens uit verschillende Unicode-blokken
original = "system"
# Cyrillische 'с', 'у', 'е' zien er identiek uit aan Latijnse 's', 'y', 'e'
homoglyph = "\u0441y\u0455t\u0435m"
# Een filter op tekstniveau ziet andere tekens
assert original != homoglyph
# Maar het model verwerkt ze mogelijk vergelijkbaar, afhankelijk van hoe de tokenizer ermee omgaatGlitch-tokens
Sommige tokenizers bevatten tokens in hun woordenschat die tijdens de training zelden of nooit zijn gezien. Deze "glitch-tokens" kunnen onvoorspelbaar modelgedrag uitlokken wanneer ze worden tegengekomen, waaronder het omzeilen van veiligheidsfilters en hallucinatie.
# Vind tokens met ongebruikelijke eigenschappen
for token_id in range(tokenizer.vocab_size):
token_str = tokenizer.decode([token_id])
# Zoek naar tokens die erg lang zijn, ongebruikelijke tekens bevatten,
# of onverwacht gedrag vertonen bij decoderen en opnieuw coderen
roundtrip = tokenizer.encode(token_str)
if roundtrip != [token_id]:
print(f"Non-roundtrip token {token_id}: {repr(token_str)}")Praktische exploitatie-workflow
- Identificeer de tokenizer — Bepaal de tokenizer-familie (BPE versus SentencePiece) en -versie van het doelmodel
- Profileer het grensgedrag — Test hoe de tokenizer omgaat met zero-width-tekens, Unicode en controletekens
- Zoek naar botsingen — Vind invoer die veiligheidsfilters op tekstniveau omzeilt maar de gewenste tokensequentie produceert
- Test glitch-tokens — Inventariseer ongebruikelijke woordenschat-vermeldingen die onverwacht gedrag kunnen uitlokken
- Valideer end-to-end — Bevestig dat de exploit werkt door de volledige pijplijn heen, niet alleen op tokenizer-niveau
Gerelateerde onderwerpen
- Overzicht van de interne werking van LLM's -- hoe tokenisatie past in de transformer-pijplijn
- Aanvallen op de embeddingruimte -- aanvallen op de embeddinglaag na tokenisatie
- Detectie-ontwijking -- tokenisatie-trucs gebruiken om veiligheidsfilters te omzeilen
- Tokenisatie-security (grondbeginselen) -- diepere analyse van de security-eigenschappen van tokenizers
- Recon & tradecraft -- de doel-tokenizer identificeren via fingerprinting
Referenties
- Sennrich et al., "Neural Machine Translation of Rare Words with Subword Units" (2016) -- de oorspronkelijke BPE-paper voor NLP
- Kudo & Richardson, "SentencePiece: A simple and language independent subword tokenizer" (2018) -- het ontwerp van de SentencePiece-tokenizer
- Rumbelow & Watkins, "SolidGoldMagikarp: Glitch Tokens in GPT" (2023) -- baanbrekend onderzoek naar glitch-tokens
Waarom is een tokenbotsing nuttig om veiligheidsfilters te omzeilen?