1# PoC 1: CPU DoS via 500k tensors
2import struct, tempfile
3from gguf.gguf_reader import GGUFReader
4
5# Build craft file
6data = struct.pack('<I', 0x46554747) # magic
7data += struct.pack('<I', 3) # version
8data += struct.pack('<QQ', 500000, 0) # tensor_count=500k, kv_count=0
9# + 500k tensor entries + padding + data
10# Full PoC: see poc_gguf_bypass.py
11
12tmp = tempfile.NamedTemporaryFile(suffix='.gguf', delete=False)
13tmp.write(data); tmp.close()
14reader = GGUFReader(tmp.name, mode='r') # ~25s CPU for 19MB file
1MAX_TENSOR_COUNT = 100_000
2MAX_KV_COUNT = 100_000
3MAX_ARRAY_LENGTH = 1_000_000
4MAX_STRING_LENGTH = 10_000_000 # 10 MB
5MAX_DIM_COUNT = 16
6MAX_DIM_VALUE = 2**31 - 1
7
8if tensor_count > MAX_TENSOR_COUNT:
9 raise ValueError(f"tensor_count {tensor_count} exceeds maximum {MAX_TENSOR_COUNT}")
1def _get_str(self, offset):
2 slen = self._get(offset, np.uint64)
3 if slen[0] > MAX_STRING_LENGTH:
4 raise ValueError(f"String length {slen[0]} exceeds maximum")
5 return slen, self._get(offset + 8, np.uint8, slen[0])
1if n_dims > MAX_DIM_COUNT:
2 raise ValueError(f"Dimension count {n_dims} exceeds maximum")
3if any(d > MAX_DIM_VALUE for d in dims):
4 raise ValueError(f"Dimension value exceeds maximum")
5if any(d == 0 for d in dims):
6 raise ValueError(f"Zero dimension not allowed")
1n_elems = int(np.prod(dims.astype(np.float64))) # Use float64 to detect overflow
2if n_elems > 2**63:
3 raise ValueError(f"Total elements {n_elems} exceeds safe limit")