python pickle对象在取消pickle之前是否可以检查恶意代码?

qxgroojn  于 2023-01-19  发布在  Python
关注(0)|答案(2)|浏览(157)

有没有办法测试pickle文件,看看它在取消pickle期间是否加载了函数或类?
下面很好地总结了如何停止加载所选函数:https://docs.python.org/3/library/pickle.html#restricting-globals
我假设它可以用来检查是否有函数加载,只需阻塞所有函数加载并得到一个错误消息。
但是有没有一种方法可以写一个函数,它只会说:这个pickle对象中只有文本数据,没有函数加载。
我不知道哪一个是安全的!

unftdfkk

unftdfkk1#

基本上没有,真的没有办法。有很多关于这个的文章。你只能使用pickle,如果你信任的来源,你可以直接从来源得到pickle。任何安全措施,你所做的是不足以防止恶意企图无论如何。
https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9https://nedbatchelder.com/blog/202006/pickles_nine_flaws.html等等。
我有时候会用它,但大多数时候是在我和同事打电话并共享了一个pickle文件之后。但更多时候,我自己在本地环境中使用它来存储数据。尽管如此,这不是首选的方式,但它速度很快。
所以,如果有疑问。不要用泡菜。

xqnpmsa8

xqnpmsa82#

谢谢你的回答!
纯泡菜太容易出现安全问题。
Picklemagic声称解决了安全问题;看起来是这样,但我不能确定:http://github.com/CensoredUsername/picklemagic
但是https://medium.com/ochrona/python-pickle-is-notoriously-insecure-d6651f1974c9暗示没有安全的 Package 器(picklemagic已经存在8年了,文章的日期是2021年;所以picklemagic没有被考虑在内?)
防止Pickle Bomb的唯一可靠方法是不要直接使用pickle。不幸的是,与其他不安全的标准库包不同,pickle没有安全的 Package 器或插入式替代品,如用于xml的defusedxml或用于tarfile的tarsafe。此外,也没有很好的方法在取消pickle之前检查pickle或阻止由REDUCE调用的不安全函数调用。
docs确实提供了一个 Package 器来阻止未经授权的函数执行。https://docs.python.org/3.10/tutorial/controlflow.html
它并没有说明哪些内置函数是安全的。如果删除了os,其他的是否安全?不过,如果pickle对象中的内容是明确的,那么限制执行可能就足够容易了。

import builtins
import io
import pickle

safe_builtins = {
    'range',
    'complex',
    'set',
    'frozenset',
    'slice',
}

class RestrictedUnpickler(pickle.Unpickler):

    def find_class(self, module, name):
        # Only allow safe classes from builtins.
        if module == "builtins" and name in safe_builtins:
            return getattr(builtins, name)
        # Forbid everything else.
        raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
                                     (module, name))

def restricted_loads(s):
    """Helper function analogous to pickle.loads()."""
    return RestrictedUnpickler(io.BytesIO(s)).load()

相关问题