首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Exec或Eval在AWS中运行不受信任的Python代码

使用Exec或Eval在AWS中运行不受信任的Python代码
EN

Stack Overflow用户
提问于 2020-07-10 01:25:57
回答 2查看 1.3K关注 0票数 5

做了大量的研究。我只是一个学徒,然而,我有一个项目,我必须运行一个用户的不受信任的Python3代码从一个网站。

如果这个问题有一些移动的部分,我也会提前道歉。

  • 我正在寻找一种尽可能安全的方法。这不需要100%完美,除非存在极敏感的data.

泄漏的巨大风险。

主要问题

如果我所连接的是REST调用的唯一data

  • Are (H 228H 129),那么AWS-lambda

  • Are

  • AWS计划是否会对泄漏敏感的有极端的风险,从而使工作在AWS-lambda

  • Are中更安全-- exec()可以突破AWS容器,并建立任何其他网络连接?H 228H 129,或者AWS-lambda容器足够安全?

BackGround

似乎大多数公司使用KubernetesDocker containers来执行不受信任的python代码(如LeetcodeProgramiz或)。

请参阅以下有用的链接:

我的计划

我认为我可以将任意的Python代码作为microservice,发布到AWS函数中,而不是构建自己的containerization/scaling。在Lambda容器中,我可以通过一个简单的execeval函数来运行代码,但可能有以下一些限制:

代码语言:javascript
复制
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:将内存使用量限制为128mb
  • My自有代码:使用regex确保没有人传入E 1104双下划线E 2105尽可能最小化此微服务(只连接单个AWS-API-gateway).

)

其他说明:

我认为我不能在restrictedPython或PyPy的沙箱特性中使用AWSLambda,因为我无法访问这些依赖项OOB。我希望这些不是这个用例所必需的。

  • ,如果用 exec ()无法做到这一点,那么GitHub上是否有安全的python解释器,或者我可以将其复制粘贴到AWS中的文件中,只需调用它们呢?

  • ,我计划允许用户使用以下内容从exec打印:

代码语言:javascript
复制
@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)

如果您有任何问题或建议,请告诉我。

___编辑**添加架构图___

EN

回答 2

Stack Overflow用户

发布于 2021-01-04 17:47:15

我也在调查这个问题,并对AWS是否可以用于运行不受信任的代码感兴趣。基本上你的逻辑看起来是合理的,但有几件事很突出

使用regex确保没有人传入双下划线坏消息。

不要这样做!不可能(或者实际上不可能)检查包含python代码的字符串是否是恶意的。想想有人让你这么叫:

代码语言:javascript
复制
eval(base64.b64decode(b'cHJpbnQoInRoaXMgaXNuJ3QgYmFkLCBidXQgeW91IGRvbid0IGtub3cgdGhhdCEiKQ=='))

这安全吗?它会被一个大王捡起来吗?好吧,你可以嘲笑eval(),但是接下来呢?毫无疑问,有一半能力的python开发人员可以找到一条绕过它的途径。

半安全比不安全在所有上都更糟糕

您将开始信任它,构建另一个依赖于半安全层的特性,并最终被黑客攻击。

解决方案

  1. 使用了许多人和大公司所依赖的一种语言或特性,这样漏洞的风险就很小(如果有人确实发现了零日漏洞,那么就会有比你更有利可图的黑客攻击)。在这里,Javascript可能是一个很好的选择--如果您可以使用它,您还可以尝试将pypy或RustPython编译到web RustPython中,说明您的代码根本不安全,并依赖OS/PAAS来保护您。换句话说,让用户在AWS中运行他们喜欢的任何东西,让亚马逊隔离它。

我的问题

我想使用第二种选择,但我担心开发人员会对lambda容器进行污染,而另一个无辜的开发人员则会使用这个容器。

假设我们有一个AWS,它有效地调用eval(user_written_code)并返回结果,它还可能设置一组环境变量,这些变量可以是user_written_code中的引用。

当代码被调用时,lambda阻止他们做任何恶意的事情--例如,lambda用户凭据无法访问任何可怕的东西。他们可以提出请求,耗尽内存,消耗CPU,挂起--所有这些都是由AWS处理的。

但是,我如何阻止以下向量:

server.

  • Innocent

  • 恶意用户执行模拟内置方法的代码,当该方法被调用时,当前代码上下文和环境变量被发布到某些用户在同一个lambda容器上执行其代码时,
    1. 将巧妙地重用该过程来改进performance.
    2. The无辜用户的代码,并将凭据(环境变量)发布到恶意用户服务器。

,我很想知道是否有其他人确认了这样或那样的方法,是否有有效的方法来防止兰达容器像这样被污染?

票数 1
EN

Stack Overflow用户

发布于 2020-08-13 13:58:22

有趣的文章,我还考虑使用现有的AWS基础设施来运行不受信任的python代码,而不是使用可能很快就会变得昂贵的docker容器。我只是开始研究这个问题,但我更喜欢使用restrictedPython来添加一些安全保护。

我对python和lambda都很陌生,但是您提到restrictedPython不是现成可用的,您所需要做的就是将它作为一个依赖项包含在zip中并将其上传到lambda?除非我遗漏了什么?

也不确定您是否看过这个,但是我发现这个vid非常有用:https://www.youtube.com/watch?v=sL_syMmRkoU

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62826010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档