Python:我可以安全地解除对不受信任数据的访问吗?
报告一开始就说: 警告: pickle模块不用于防止错误或错误的操作 恶意构造的数据。从不解除从服务器接收的ICKICK数据 不可信或未经验证的来源 然而,在下面,它似乎描述了一种使用允许对象的白名单来确保取消勾选数据安全的方法 这是否意味着,如果我使用只允许某些“基本”类型的Python:我可以安全地解除对不受信任数据的访问吗?,python,security,pickle,Python,Security,Pickle,报告一开始就说: 警告: pickle模块不用于防止错误或错误的操作 恶意构造的数据。从不解除从服务器接收的ICKICK数据 不可信或未经验证的来源 然而,在下面,它似乎描述了一种使用允许对象的白名单来确保取消勾选数据安全的方法 这是否意味着,如果我使用只允许某些“基本”类型的RestrictedUnpickler,我就可以安全地取消勾选不受信任的数据,或者是否存在此方法无法解决的其他安全问题?如果有,是否有其他方法可以确保取消勾选安全(显然是以无法取消勾选每个流为代价) 对于“基本类型”,我的
RestrictedUnpickler
,我就可以安全地取消勾选不受信任的数据,或者是否存在此方法无法解决的其他安全问题?如果有,是否有其他方法可以确保取消勾选安全(显然是以无法取消勾选每个流为代价)
对于“基本类型”,我的意思正是:
bool
,str
,bytes
bytearray
,int
,float
complex
,元组
,列表
,dict
和set
frozenset
pickle
替代方案的问题时,邮件列表中也讨论了这一想法。例如:
为了更安全,我将使用一个受限取消勾选器作为默认值(用于加载/加载),并强制人们在想要放宽限制时覆盖它。为了真正明确,我将使load/loads只与内置类型一起工作
而且:
我一直想要一个版本的pickle.loads()来获取允许实例化的类列表
以下内容对你来说够了吗
确实如此。谢谢你指出!我从未通过文档中的模块接口部分。也许页面顶部的警告还可以提到有一些方法可以缓解安全问题,并指出“限制全球用户”
是的,那是个好主意:-)
因此,我不知道为什么文档没有更改,但根据我的说法,使用
RestrictedUnpickler
来限制可以取消勾选的类型是一个安全的解决方案。当然,库中可能存在危害系统的bug,但OpenSSL中也可能存在一个bug,它会向所有询问的人显示随机内存数据。我甚至会说,没有安全的方法使用pickle来处理不受信任的数据
即使使用有限的全局变量,Python的动态特性也是如此,一个坚定的黑客仍然有机会找到回到\uuuuuu内置映射的方法,并从那里找到王冠宝石
请参阅以相同的度量应用于pickle
请记住,pickle
仍然是一种堆栈语言,即使允许对有限的全局变量集进行任意调用,也无法预见可能产生的所有对象。pickle文档也没有提到允许调用copyreg
安装的扩展的EXT*
操作码;在这里,您还必须对该注册表中安装的任何内容进行说明。只需要一个向量,就可以将对象调用转换为getattr
等价物,从而使您的防御崩溃
至少对数据使用加密签名,以便验证完整性。您可以限制风险,但如果攻击者曾经设法窃取您的签名机密(密钥),那么他们可能会再次向您提供黑客攻击
相反,我会使用现有的无害格式(如JSON)并添加类型注释;e、 g.使用类型键将数据存储在字典中,并在加载数据时进行转换 在这个答案中,我们将探究pickle协议到底允许攻击者做什么。这意味着我们将只依赖协议的文档化特性,而不是实现细节(除了少数例外)。换句话说,我们将假设
pickle
模块的源代码是正确的,没有bug,并且允许我们完全按照文档所说的去做
pickle协议允许攻击者做什么?
泡菜。在解钩过程中,我们可以:
- 调用(几乎)任何类的方法(只要我们设法取消勾选该类的实例)
- 使用任意参数调用任意可调用项,这要归功于该方法(只要我们能够以某种方式访问该可调用项)
- 再次感谢,调用(几乎)任何未勾选对象的
、append
和extend
方法\uuuuuuu setitem\uuuuu
- 访问允许我们访问的任何属性
- 自由创建以下类型的实例:
,str
,bytes
,list
,tuple
,dict
,int
,float
。这没有文档记录,但这些类型内置于协议本身中,不需要通过bool
Unpickler.find\u class
exec
或eval
,他们可以让我们执行任意代码。如果可以访问os.system
或subprocess.Popen
,则可以运行任意shell命令。当然,我们可以用Unpickler.find\u class
拒绝他们访问这些文件。但是我们到底应该如何实现我们的find\u class
方法呢?哪些函数和类是安全的,哪些是危险的
攻击者的工具箱
在这里,我将尝试解释攻击者可以用来做坏事的一些方法。让攻击者访问这些函数/类意味着您处于危险之中
- 取消勾选期间执行任意代码:
- 及(duh)
- ,以及所有其他
函数子流程