做了大量的研究。我只是一个学徒,然而,我有一个项目,我必须运行一个用户的不受信任的Python3代码从一个网站。
如果这个问题有一些移动的部分,我也会提前道歉。
泄漏的巨大风险。
主要问题
如果我所连接的是REST调用的唯一data
H 228H 129),那么AWS-lambda
H 228H 129,或者AWS-lambda容器足够安全?BackGround
似乎大多数公司使用Kubernetes和Docker containers来执行不受信任的python代码(如Leetcode、Programiz或)。
请参阅以下有用的链接:
https://www.programiz.com/blog/online-python-compiler-engineering/https://aws.amazon.com/blogs/compute/running-executables-in-aws-lambda/我的计划
我认为我可以将任意的Python代码作为microservice,发布到AWS函数中,而不是构建自己的containerization/scaling。在Lambda容器中,我可以通过一个简单的exec或eval函数来运行代码,但可能有以下一些限制:
“
safe_list = ['math','acos', 'asin', 'atan', 'print','atan2', 'ceil', 'cos', 'cosh', 'de grees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
safe_dict['abs'] = abs
exec(userCode,{"**__builtins__"**:None},safe_dict )特别说明:
我不太担心无限循环或崩溃,因为我只需要超时并告诉用户再试一次。所需要做的就是运行非常简单的python代码(一般少于几行),然后返回异常、stdout、打印并对结果进行检查。需要运行:数学运算符、列表、循环、lambda函数、映射、筛选器、声明方法、用属性声明类、--这不需要成为成千上万用户的完美项目。我只是想有个网站来增加简历,或许还能在广告上赚点钱,以提高成本。如果有严重的限制,我最终可以用Kubernetes (如上面的链接)来实现它,但希望这个解决方案能运行得足够好。--我只是希望它工作得比较好,而且不需要太长时间来构建或者花费太多的钱。,我不想泄露任何敏感的。我已经计划要做的安全事务:
seconds
AWS lambda:将超时值限制在1-2 lambda:将内存使用量限制为128mbMy自有代码:使用regex确保没有人传入E 1104双下划线E 2105尽可能最小化此微服务(只连接单个AWS-API-gateway). )
其他说明:
我认为我不能在restrictedPython或PyPy的沙箱特性中使用AWSLambda,因为我无法访问这些依赖项OOB。我希望这些不是这个用例所必需的。
,如果用 exec ()无法做到这一点,那么GitHub上是否有安全的python解释器,或者我可以将其复制粘贴到AWS中的文件中,只需调用它们呢?
,我计划允许用户使用以下内容从exec打印:“
@contextlib.contextmanager
def stdoutIO(stdout=None):
old = sys.stdout
if stdout is None:
stdout = StringIO()
sys.stdout = stdout
yield stdout
sys.stdout = old
with stdoutIO() as s:
try:
exec(userCode)
except:
print("Something wrong with the code")
print( s.getvalue())
print(i)如果您有任何问题或建议,请告诉我。
___编辑**添加架构图___

发布于 2021-01-04 17:47:15
我也在调查这个问题,并对AWS是否可以用于运行不受信任的代码感兴趣。基本上你的逻辑看起来是合理的,但有几件事很突出
使用regex确保没有人传入双下划线坏消息。
不要这样做!不可能(或者实际上不可能)检查包含python代码的字符串是否是恶意的。想想有人让你这么叫:
eval(base64.b64decode(b'cHJpbnQoInRoaXMgaXNuJ3QgYmFkLCBidXQgeW91IGRvbid0IGtub3cgdGhhdCEiKQ=='))这安全吗?它会被一个大王捡起来吗?好吧,你可以嘲笑eval(),但是接下来呢?毫无疑问,有一半能力的python开发人员可以找到一条绕过它的途径。
半安全比不安全在所有上都更糟糕
您将开始信任它,构建另一个依赖于半安全层的特性,并最终被黑客攻击。
解决方案
我的问题
我想使用第二种选择,但我担心开发人员会对lambda容器进行污染,而另一个无辜的开发人员则会使用这个容器。
假设我们有一个AWS,它有效地调用eval(user_written_code)并返回结果,它还可能设置一组环境变量,这些变量可以是user_written_code中的引用。
当代码被调用时,lambda阻止他们做任何恶意的事情--例如,lambda用户凭据无法访问任何可怕的东西。他们可以提出请求,耗尽内存,消耗CPU,挂起--所有这些都是由AWS处理的。
但是,我如何阻止以下向量:
server.
,我很想知道是否有其他人确认了这样或那样的方法,是否有有效的方法来防止兰达容器像这样被污染?
发布于 2020-08-13 13:58:22
有趣的文章,我还考虑使用现有的AWS基础设施来运行不受信任的python代码,而不是使用可能很快就会变得昂贵的docker容器。我只是开始研究这个问题,但我更喜欢使用restrictedPython来添加一些安全保护。
我对python和lambda都很陌生,但是您提到restrictedPython不是现成可用的,您所需要做的就是将它作为一个依赖项包含在zip中并将其上传到lambda?除非我遗漏了什么?
也不确定您是否看过这个,但是我发现这个vid非常有用:https://www.youtube.com/watch?v=sL_syMmRkoU
https://stackoverflow.com/questions/62826010
复制相似问题