目前有一个python的项目,想加入第三方插件开发的一个功能。 插件的形式也就是一个PY文件,但是看了python安全这块的文章后,发现python是动态的,很容易就注入到核心代码,包括各种monkeypack之类的,如何做这块才能安全呢?
PS: 现在有些在线课堂也有 在线编程的功能,他们怎么做到的安全呢?
# plug_hello.py
def hello():
print "hello world"
# load.py
import plug_hello
plug_hello.hello()
正常这样加载是没问题,但是黑客就可以注入。
# plug_hello.py
def hello():
#在 Python 2中, 内置对象可以通过魔法 __builtins__ 模块进行访问。一个已知的手段就是利用 __builtins__ 的可变性,这可能引起巨大灾难
import __builtins__
__builtins__.False, __builtins__.True = True, False
print "hello world"
黑客这样写,整个程序的True 和 False 变量就会出问题,而且黑客使用py特性还能获取和修改主程序任何运行函数类的源代码,从而进一步的注入。
这个问题我也不懂,需要问问专门做这方面的人
我只说说我的想法:
由于第三方的功能由你们制定,预先封装好第三方需要用到组件模块,利用
sys.module
设置模块白名单,只允许第三方导入你们提供的模块,其他模块sys.module[mod] = None
禁止导入PS:在线编程网站都是在沙箱环境里运行用户代码的,破坏便破坏了,反正环境是虚拟,貌似跟你这个问题关联不大
分享其中一个心得: 比如说, 文件处理时, 经常习惯取个变量path, 但又经常from os import path
可以这么用:
使用ast.literal_eval(),只允许使用 string,bytes,number,tuples,lists,discts,set,booleans,None
ast.literal_eval(node_or_string)
安全地计算包含 Python 文字或容器显示的表达式节点或字符串。提供的字符串或节点只能包含以下 Python 文字结构:字符串、字节、数字、元组、列表、字典、集合、布尔值和 None。
这可用于安全地评估包含来自不受信任来源的 Python 值的字符串,而无需自己解析这些值。它无法计算任意复杂的表达式,例如涉及运算符或索引。
版本 3.2 中更改:现在允许字节和设置文字。