Python:使用 chroot 和 chjail 保护不受信任的脚本/子进程?

2023-12-24

我正在编写一个基于 Python 的 Web 服务器,它应该能够执行“插件”,以便可以轻松扩展功能。

为此,我考虑了一种方法,即拥有多个文件夹(每个插件一个)和多个 shell/python 脚本,其中以可能发生的不同事件的预定义名称命名。

一个例子是有一个on_pdf_uploaded.py当 PDF 上传到服务器时执行的文件。为此,我将使用 Python子流程 tools.

为了方便和安全,这将允许我使用 Unix 环境变量来提供更多信息并设置进程的工作目录 (cwd),以便它可以访问正确的文件,而无需查找其位置。

由于插件代码来自不受信任的来源,我希望使其尽可能安全。我的想法是在子进程中执行代码,但将其放入不同用户的 chroot 监狱中,以便它无法访问服务器上的任何其他资源。

不幸的是我找不到任何关于此的信息,而且我不想依赖不受信任的脚本将自己关进监狱。

此外,我也不能将主/调用进程放入 chroot 监狱,因为在服务器应答其他请求时,插件代码可能会同时在多个进程中执行。

所以问题是:如何以最低权限在 chroot 监狱中执行子进程/脚本,以保护服务器的其余部分免受错误的、不受信任的代码的损坏?

谢谢你!


也许是这样的?

# main.py
subprocess.call(["python", "pluginhandler.py", "plugin", env])

Then,

# pluginhandler.py
os.chroot(chrootpath)
os.setgid(gid) # Important! Set GID first! See comments for details.
os.setuid(uid)
os.execle(programpath, arg1, arg2, ..., env)
# or another subprocess call 
subprocess.call["python", "plugin", env])

编辑:想使用 fork() 但我不太明白它的作用。查了一下。新的 代码!

# main.py
import os,sys
somevar = someimportantdata
pid = os.fork()
if pid:
    # this is the parent process... do whatever needs to be done as the parent
else:
    # we are the child process... lets do that plugin thing!
    os.setgid(gid) # Important! Set GID first! See comments for details.
    os.setuid(uid)
    os.chroot(chrootpath)
    import untrustworthyplugin
    untrustworthyplugin.run(somevar)
    sys.exit(0)

This http://www.myelin.co.nz/post/2003/3/13/很有用,我几乎只是窃取了该代码,所以向那个人提供了一个不错的例子表示敬意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:使用 chroot 和 chjail 保护不受信任的脚本/子进程? 的相关文章

  • 为神经网络打乱两个 numpy 数组

    我有两个 numpy 数组用于输入数据 X 和输出数据 y X np array 2 3 sample 1 x 16 4 dtype float sample 2 x y np array 1 0 sample 1 y 0 1 dtype
  • 如何更改默认的Python版本?

    我已经在我的 Mac 上安装了 Python 3 2 我跑完之后 Applications Python 3 2 Update Shell Profile command 当我输入时 这很令人困惑Python V在终端它说Python 2
  • Keras ZeroDivisionError:整数除法或以零为模

    我正在尝试使用 Keras 和 Tensorflow 实现卷积神经网络 我有以下代码 from keras models import Sequential from keras layers import Conv2D MaxPoolin
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • Python设置1和True的解释

    在 IPython 3 交互式 shell 中 In 53 set2 1 2 True hello In 54 len set2 Out 54 3 In 55 set2 Out 55 hello True 2 是因为 1 和 True 得到
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 无法在我的程序中使用 matplotlib 函数

    我正在 Windows 10 中运行 Anaconda 安装 conda 版本 4 3 8 这是我尝试在 python 命令行中运行的代码 import matplotlib pyplot as plt x 1 2 3 4 y 5 6 7
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • 使用 Windows 任务计划程序安排 [Virtualenv 相关] Python 脚本

    I want to schedule a python script to start at 3AM and break at 5PM every weekday However the problem arises when I need
  • 错误:尝试使用 scrappy 登录时出现 raise ValueError("No element found in %s" % response)

    问题描述 我想从我大学的bbs上抓取一些信息 这是地址 http bbs byr cn http bbs byr cn下面是我的蜘蛛的代码 from lxml import etree import scrapy try from scra
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐

  • 数组值可以通过变量变量访问吗?

    我有一个只能通过变量正确访问的数组 如下所示 foo bar pie fixed name variable foo bar echo fixed name variable 这在理论上是回响的pie 但它只是不返回任何东西 所以我需要知道
  • tortoisehg gui 相当于执行“hg push -r”的操作是什么

    我没有看到完成此任务的选项 我只想推送与我的默认分支相关的变更集 而不是我拥有的任何其他本地分支 我想我可以通过使用存储库资源管理器来做到这一点 如下所示 在存储库地址下方的工具栏上 第一个组合框允许我选择一个分支 我将其设置为默认值 然而
  • ListView 中的复选框

    我希望填充一个列表视图 其中包含复选框作为 Android 应用程序中的列表项 我已经实现了一个列表视图 但是如果我选中列表中的任何一个复选框 它会检查列表视图中的其他一些列表 提前致谢 对于自定义布局
  • 根据 C# 中的条件从 JSON 中删除元素

    我有一个 JSON 字符串 我希望能够在 C 中修改它 我希望能够根据其中一个子值是某个值时删除一组数据 采取以下 responseHeader status 0 QTime 0 params explainOther fl score i
  • Ubuntu 16.04 正式支持 SCHED_DEADLINE 吗?

    目前我运行的是 Ubuntu 16 04 Linux 内核版本为 4 16 我编写了一个虚拟程序 将其调度程序更改为 SCHED DEADLINE 但是当我尝试编译它时 它找不到 SCHED DEADLINE 所需的结构和宏的定义 大部分代
  • Java 抽象类:为派生类返回“this”指针

    我正在尝试使用辅助方法编写一些自定义异常来设置变量 如下所示 public class KeyException extends RuntimeException protected String Id protected KeyExcep
  • 将 security=none 应用于上下文根和静态资源:spring security 版本 3.1

    我的应用程序编译为 ROOT war 这基本上意味着我没有除 之外的上下文根 有些页面需要保护 然而有些 URL 不需要它 例如我的http localhost 8080 com http localhost 8080 给出该应用程序的主页
  • 使用 php 处理 Jquery Ajax 表单提交

    最近 我在尝试使用 Jquery 和 Ajax 提交表单时一直在与它们作斗争 我有一个非常简单的表单 其中包含用户名字段和密码字段以及提交按钮 该表单应该做的是 一旦提交表单 信息将通过 Ajax 发送到 php 文件 然后该文件将所述表单
  • 停止更新*无效反应输入

    我正在寻找停止的方法update Input使我的 Shiny 应用程序中的无功值无效的函数 我希望更新函数仅更改可视 UI 组件 而不更改底层反应值 这是一个代表 library shiny ui lt fluidPage sliderI
  • 如何在 Midnight Commander 中过滤目录

    也许是一个愚蠢的问题 但如何在 Midnight Commander 中过滤目录 例如 我有一个包含很多目录的文件夹 其命名如下 holidays 2016 birthdays 2016 holidays 2015 我怎样才能过滤像 201
  • 绘制平滑曲线 - 所需方法

    如何在移动时平滑 iOS 绘图应用程序中的一组点 我尝试过 UIBezierpaths 但当我只是将点 1 2 3 4 2 3 4 5 移动时 我得到的只是它们相交处的锯齿状末端 我听说过样条曲线和所有其他类型 我对 iPhone 编程很陌
  • ConfigurationManager.GetSection(sectionName) 在执行单元测试时返回 null

    我有一个自己的单元测试项目app config文件 它是由正在测试的目标项目定义的真实配置文件的模拟 该模拟文件由单元测试代码 而不是目标项目 加载和处理 如果我仅在这一个测试项目中运行测试 则它可以正常工作 ConfigurationMa
  • WCF:更新服务参考提供重复的配置条目

    我有一个使用 WCF 服务的服务引用的 WPF 应用程序 在对服务进行更新时 我需要更新服务引用 因此我右键单击它并点击 更新服务引用 执行此操作会导致客户端项目的 App config 文件中出现重复条目 它复制了下面的绑定wsHttpB
  • 在SVN Trunk中完全禁用Django的CSRF保护

    我沮丧地花了几个小时 试图禁用 Django 现在试图强加给我的 CSRF 但没有成功 还有其他人尝试过更成功吗 我对任何有效的东西都很好 除了源补丁 但猴子补丁还可以 不要这样做 但如果你必须的话 try this http johnmc
  • NativeActivity 活动的父活动类型

    有什么方法可以从 NativeActivity 中查看其父 Activity 的类型Execute http msdn microsoft com en us library dd781091 aspx方法 是的 您可以执行以下代码块 它将
  • 带有请求的“单击”按钮

    我有一个小网站 我想用请求库填写表格 问题是我在填写表单数据并点击按钮时无法到达下一个站点 Enter 不起作用 重要的是我无法通过某种点击机器人来做到这一点 需要完成此操作 以便我可以在没有图形的情况下运行 info name JohnJ
  • Scrapy如何避免重新下载最近下载的媒体?

    根据https doc scrapy org en latest topics media pipeline html https doc scrapy org en latest topics media pipeline html Sc
  • C++中基类对象和派生类对象的大小

    include
  • .htaccess、Wordpress 和个性 URL

    我一直在研究我能在 WordPress 中的 htaccess 和虚荣 url 上找到的每个 Stack Overflow 主题 但我完全不明白为什么我的主题不起作用 我对 htaccess 完全是个菜鸟 所以我确信这与它有很大关系 我正在
  • Python:使用 chroot 和 chjail 保护不受信任的脚本/子进程?

    我正在编写一个基于 Python 的 Web 服务器 它应该能够执行 插件 以便可以轻松扩展功能 为此 我考虑了一种方法 即拥有多个文件夹 每个插件一个 和多个 shell python 脚本 其中以可能发生的不同事件的预定义名称命名 一个