鉴于我的代码是开源的,而且我在服务器上运行,而且我接受几乎原始的代码,那可能发生在我身上的最糟糕的是什么?

时间:2011-07-07 11:10:04

标签: python security code-injection

我正在研究几种情况,即接受几乎原始的代码会更加容易。所以,

  1. 如果你不能lambda,你可以用表达式做什么最糟糕的,怎么做?
  2. 如果您不能使用导入以及如何使用导入的代码,您可以做的最糟糕的是什么? (不能使用X ==字符串扫描为X)
  3. 另外,如果有人能想到给出d = {key:value,...}这样的expr,B是不必要的: expr.format(key)== d [key]

    不改变格式的显示方式。

3 个答案:

答案 0 :(得分:13)

使用表达式可以做的最糟糕的事情是

__import__('os').system('rm -rf /')

如果服务器进程以root运行。否则,您可以使用

填充内存并使进程崩溃
2**2**1024

或执行shell fork bomb

使服务器暂停
__import__('os').system(':(){ :|:& };:')

或者用Python本身执行一个临时的(但破坏性足够的)fork炸弹:

[__import__('os').fork() for i in xrange(2**64) for x in range(i)]

扫描__import__无济于事,因为有无数种方法可以实现,包括

eval(''.join(['__', 'im', 'po', 'rt', '__']))
getattr(__builtins__, '__imp' + 'ort__')
getattr(globals()['__built' 'ins__'], '__imp' + 'ort__')

请注意,evalexec函数也可用于以间接方式创建上述任何内容。如果要在服务器上进行安全表达式评估,请使用ast.literal_eval

答案 1 :(得分:3)

任意Python代码?

  • 在分区上打开,读取,写入,创建文件。包括填满所有磁盘空间。
  • 将负载放在CPU上的无限循环。
  • 分配所有内存。
  • 做纯Python模块中的事情而不通过将它们的代码复制/粘贴到表达式中来导入它们(弄乱内置的Python内部并且可能找到访问文件,执行它们或导入模块的方法)。 ...

答案 2 :(得分:2)

任何数量的白名单或黑名单都不会阻止人们进入Python的危险部分。例如,您提到在沙箱中运行,其中未定义“打开”。但我可以做到这一点:

real_open = getattr(os, "open")

如果你说我不会os,那么我可以这样做:

real_open = getattr(sys.modules['os'], "open")

real_open = random.__builtins__['open']
等等,等等。一切都是连通的,真正的力量就在那里。坏人会找到它。