Python 3,ast.literal_eval(node_or_string)中是否有任何已知的安全漏洞?

32 python security abstract-syntax-tree

有没有已知的方法让ast.literal_eval(node_or_string)的评估实际上不安全?

如果是,是否可以使用补丁?

(我已经知道PyPy [沙盒],它可能更安全,但除非答案是肯定的,否则,我的需求很小,我不会走得那么远.)

mad*_*jar 59

文件指出它是安全的,有相对的literal_eval的安全性没有任何错误是bug跟踪系统,所以你可能会假设它是安全的.

此外,根据源代码,literal_eval将字符串解析为python AST(源树),并且只有在它是文字时才返回.代码永远不会执行,只会被解析,因此没有理由存在安全风险.

  • 如果输入是一个litteral,literal_eval()将返回该值.如果输入超过文字(它包含代码),则literal_eval()将失败,并且执行代码时存在风险.在这两种情况下,literal_eval()都可以完成这项工作.为什么要在之后使用eval()或exec()? (9认同)
  • +1这里没有更多答案的原因是没有必要再说了. (4认同)
  • 风险与使用Python本身大致相同. (2认同)

Ant*_*ala 6

>>> code = '()' * 1000000
>>> ast.literal_eval(code)
[1]    3061 segmentation fault (core dumped)  python2
Run Code Online (Sandbox Code Playgroud)

或较小的文件可能会SIGSEGV在Python 2中崩溃。在某些情况下,它可能是可利用的。

  • @ProdiptaGhosh 它是一个字符串。我没有在这个答案中扩展那些**百万**括号是有充分理由的! (3认同)