surrealgrain's picture
Add benign ModelScan legacy PyTorch multi-pickle bypass artifact
f5011c5 verified
|
Raw
History Blame Contribute Delete
2.04 kB
---
license: apache-2.0
tags:
- modelscan
- pytorch
- security
---
# ModelScan legacy PyTorch multi-pickle scanner mismatch
This repository contains a benign, non-executing regression artifact for a ModelScan scanner mismatch in legacy PyTorch `.pt` files.
`legacy_marker.pt` follows the legacy PyTorch stream shape:
1. PyTorch magic number pickle
2. protocol-version pickle
3. sys-info pickle
4. object pickle
5. storage-key-list pickle
The object pickle contains a harmless reference to `sys.getsizeof`. It does not contain a command execution payload and should not perform side effects when inspected. ModelScan's default unsafe-global policy marks `sys:*` as CRITICAL, but `scan_pytorch()` calls `scan_pickle_bytes(..., multiple_pickles=False)`, so only the first magic-number pickle is inspected.
## Local verification
Tested against `protectai/modelscan` tag `v0.8.8`, commit `61fcec9c2a37c24c1fb12d84ede30fe248a364bd`.
```text
ModelScan scan(path) issues: 0
ModelScan scan(path) errors: 0
ModelScan scanned: ['legacy_marker.pt']
Full multi-pickle scan issues: [('sys', 'getsizeof', 'CRITICAL')]
```
Artifact SHA-256:
```text
c49a1db639e12cd375462eb2f377596513c40f5c440d901e62aa5dbf04622660 legacy_marker.pt
```
## Relevant source behavior
PyTorch's legacy serializer writes multiple pickles before and after the object pickle. In current PyTorch source, `_legacy_save()` writes the magic number, protocol version, sys-info, then `pickler.dump(obj)`, followed by serialized storage keys. `_legacy_load()` reads those fields in the same order and deserializes the object pickle after the sys-info record.
ModelScan's `scan_pytorch()` accepts the PyTorch magic number, then calls the pickle scanner with `multiple_pickles=False`, which stops after the first pickle and does not inspect the object pickle.
## Expected result
ModelScan should inspect all pickle records that are part of the legacy PyTorch stream, or at minimum continue through the object pickle after validating the magic number and protocol metadata.