基于pythonweb的解释器安全问题

基于pythonweb的解释器安全问题,python,linux,bash,security,Python,Linux,Bash,Security,我正在制作一个基于web的python解释器,它将在基于Linux的python 3解释器上执行代码,并在同一网页上给出输出。但这有一些严重的循环漏洞,比如有人可以使用python的os模块执行bash脚本,可以检查web应用程序的源代码目录等等 有人能建议我如何在我的应用程序中避免此类意外吗 关于简短的回答:没有简单的“仅python”解决方案 一些细节: 用户总是可以尝试调用os,sys,,将open(敏感路径,'rw')作为f:…等,并且很难通过分析代码来检测所有这些情况 如果您允许任何

我正在制作一个基于web的python解释器,它将在基于Linux的python 3解释器上执行代码,并在同一网页上给出输出。但这有一些严重的循环漏洞,比如有人可以使用python的
os
模块执行bash脚本,可以检查web应用程序的源代码目录等等

有人能建议我如何在我的应用程序中避免此类意外吗
关于

简短的回答:没有简单的“仅python”解决方案

一些细节:

  • 用户总是可以尝试调用
    os
    sys
    ,将open(敏感路径,'rw')作为f:…
    等,并且很难通过分析代码来检测所有这些情况

  • 如果您允许任何第三方,那么事情就变得更加复杂了,例如,一些第三方软件包可能会在本地创建一个别名到
    os.execv
    os_ex=os.execv
    ),然后就可以从第三方编写类似
    的脚本;os_ex(…)

或多或少可靠的解决方案是使用“外部沙箱”解决方案:

  • 在非特权docker容器中运行解释器。例如:

  • 将不受信任的脚本写入将通过docker容器中的卷公开的文件
  • 在docker中执行该脚本:

    a
    subprocess.call(['docker','exec','CONTAINER_ID','/usr/bin/python','PATH_TO_SCRIPT'])

    b<代码>子流程调用(['docker'、'exec'、'CONTAINER_ID'、'/usr/bin/python'、'-c',UNTRUSTED_SCRIPT_TEXT])

  • 使用PyPy-s

  • 搜索一些“安全的”。或注意:现有内核不保证安全,可能允许调用
    子进程。请检查\u output
    os.rm
    和其他。所以对于“默认内核”,最好在隔离环境中运行Jupyter服务器
  • 使用非特权用户在中运行解释器。不同的实现具有不同的“安全”级别
  • 使用Jython和
  • 一些奇特的解决方案,如“客户端JS python实现”:
在任何情况下,即使您设法实现或重用现有的“沙盒”,您仍然会遇到许多潜在问题:

  • 如果允许多处理或多线程,那么您可能希望监视CPU资源的利用情况,因为 有些脚本可能希望使用所有内容。即使使用GIL,多线程也可以利用所有内核(用户所要做的就是调用线程中使用c库的函数)
  • 您可能希望监视内存使用情况,因为某些脚本可能会泄漏或只是占用大量内存
  • 监视的其他候选对象:磁盘IO使用情况、网络使用情况、打开的文件描述符使用情况、执行时间等
  • 此外,您还应该始终检查“沙箱解决方案”的安全更新,因为即使是docker有时也容易受到攻击和攻击

推荐阅读:

简短回答:没有简单的“仅python”解决方案

一些细节:

  • 用户总是可以尝试调用
    os
    sys
    ,将open(敏感路径,'rw')作为f:…
    等,并且很难通过分析代码来检测所有这些情况

  • 如果您允许任何第三方,那么事情就变得更加复杂了,例如,一些第三方软件包可能会在本地创建一个别名到
    os.execv
    os_ex=os.execv
    ),然后就可以从第三方编写类似
    的脚本;os_ex(…)

或多或少可靠的解决方案是使用“外部沙箱”解决方案:

  • 在非特权docker容器中运行解释器。例如:

  • 将不受信任的脚本写入将通过docker容器中的卷公开的文件
  • 在docker中执行该脚本:

    a
    subprocess.call(['docker','exec','CONTAINER_ID','/usr/bin/python','PATH_TO_SCRIPT'])

    b<代码>子流程调用(['docker'、'exec'、'CONTAINER_ID'、'/usr/bin/python'、'-c',UNTRUSTED_SCRIPT_TEXT])

  • 使用PyPy-s

  • 搜索一些“安全的”。或注意:现有内核不保证安全,可能允许调用
    子进程。请检查\u output
    os.rm
    和其他。所以对于“默认内核”,最好在隔离环境中运行Jupyter服务器
  • 使用非特权用户在中运行解释器。不同的实现具有不同的“安全”级别
  • 使用Jython和
  • 一些奇特的解决方案,如“客户端JS python实现”:
在任何情况下,即使您设法实现或重用现有的“沙盒”,您仍然会遇到许多潜在问题:

  • 如果允许多处理或多线程,那么您可能希望监视CPU资源的利用情况,因为 有些脚本可能希望使用所有内容。即使使用GIL,多线程也可以利用所有内核(用户所要做的就是调用线程中使用c库的函数)
  • 您可能希望监视内存使用情况,因为某些脚本可能会泄漏或只是占用大量内存
  • 监视的其他候选对象:磁盘IO使用情况、网络使用情况、打开的文件描述符使用情况、执行时间等
  • 此外,您还应该始终检查“沙箱解决方案”的安全更新,因为即使是docker有时也容易受到攻击和攻击

建议阅读:

您需要对用户输入进行消毒。这是一个广泛问题的广泛答案。它被称为沙箱。谷歌搜索“Python沙盒”应该有一堆好东西suggestions@thatotherguy这就是我想要的,因为你需要对用户输入进行消毒。这是对广义q的广义回答