我需要制作一种 gnuplot Web 界面,它接收命令列表或文件,将其保存到光盘并告诉 gnuplot 将其渲染为 png(“设置终端 png;设置输出......”)。
用户可以用它做什么讨厌或愚蠢的事情(例如超载 cpu 或 RAM,访问文件系统......)?我怎样才能避免它们?在将代码传递给 gnuplot 之前,我应该删除哪些潜在的恶意行?
我正在通过subprocess.Popen
django 运行 gnuplot。
免责声明——这份清单一定是不完整的
您需要禁用一些东西(至少)。
在 gnuplot 中,看一下help shell
——那些允许用户生成交互式 shell(介于shell
和之间的任何东西logout
都需要被丢弃)。此外,您需要删除所有以!
or开头的行system
(以及任何续行),因为它们调用了 shell 命令。在我要做的潜在危险事情清单上,下一个是使用反向替换。
#homeless1.gp
mysring="`rm -rf ~`"
将清除您的主目录。当然,我没有声称如果你做了所有这些事情,你的脚本将是完全安全的。如果您只允许用户上传一个文件来运行,您最好禁用load
并且call
从那时起您不必担心用户以某种方式上传另一个恶意脚本并从第一个加载它。
另一个想法——gnuplot 允许使用管道调用程序——例如
plot "<awk -F, '{print $0}' mydata.txt" #runs system command awk
你几乎需要禁用任何以空格开头的字符串,<
或者|
- 可能还有转义序列,因为如果它们没有转义任何东西,gnuplot 可能会默默地丢弃它们。
#homeless2.gp
MYSTRING="<rm -rf ~"
plot MYSTRING #removes $HOME -- And doesn't even give you a plot :-(
还有一个……
#homeless3.gp
set output "| rm -rf ~"
您还可以使用以下方法很容易地将脚本卡在无限循环中reread
——该脚本只有一行长:
#inifite_loop.gp
reread #Suckers!!!
即使您构建了一个 chroot 监狱来运行您的脚本,这也是您可能想要禁用的(我对此一无所知,我只是在谷歌搜索如何在 unix 下安全运行脚本时才学会了这个术语......) - - 虽然我想使用上述方法,但用户仍然可以通过用不同的编程语言构建无限循环并从 gnuplot 执行它来固定你的 CPU 的一个核心 - 我猜内存也是如此......
#infinite_mem.gp
!python -c "a=[]; while True: a.append('Suckers!!! '*10000000))" #You'll probably hit swap pretty fast with this...
我想得越多,为了安全地执行此操作,您几乎将不得不从头开始重新编写 gnuplot 解析器并检查所有内容(或沙箱和监视器——对消耗的资源设置仔细的限制)。
(对不起,我确定这不是你想听到的)。
似乎(对我来说)你最好的选择是创建你自己的迷你语言,它只接受一小部分(但有用的)gnuplot 命令子集,并从该组命令构建 gnuplot 脚本......
进度编辑
玩了一会儿之后,您可以在 gnuplot 中禁用管道——
./configure --program-suffix=safer
现在,您需要编辑config.h
由 configure... 生成的内容,注释掉以下行:
#define HAVE_PCLOSE 1
和
#define HAVE_POPEN 1
和
#define PIPES 1
(例如/*#define HAVE_PCLOSE 1*/
,如果您不熟悉 C 注释)。
然后make; [sudo] make install
- 使用我设置的方式后缀,可以将您的“更安全”版本的 gnuplot 调用为gnuplotsafer
.
这消除了管道引起的不安全感(带有|
, <
,甚至反引号的字符串的问题现在是安全的)。外壳,系统和!仍然不安全,您仍然必须通过解析脚本来禁用它们——但这比尝试确保用户没有设置恶意管道要容易得多。
我还建议您在将系统上线之前检查以确保您不能对管道/backtics等进行任何操作,并且我仍然会尝试尽可能多地对整个事情进行沙箱处理。
mgilson 上面所说的一切都非常重要,需要理解——这可能非常危险。但是通过仔细的沙盒和资源使用监控应该可以安全地进行。
看看http://www.plotshare.com/。他们已经存在了一段时间,所以他们一定找到了一种安全的方法。也许你可以和他们谈谈。
我是www.plotshare.com的作者,我今天才看到这个条目。
我要感谢 mgilson 用他的言论使页面更安全。老实说,管道安全问题并没有引起我的注意,因为我倾向于在绘制之前对数据进行预处理,因此很少使用管道。
我将该页面作为一个空闲时间项目运行,并不断尝试改进它。现在,我希望大多数安全漏洞都被填满。
@Lee Phillips:感谢您将情节分享包含在您的书中。现在,我正在添加一些不错的功能(改进的帮助系统、html 画布等),以使在线绘图体验真正优于仅在 shell 中使用 gnuplot。
当我对页面的质量有信心时,我会更加努力地提高在 google 上的知名度。如果您不喜欢该页面的某些内容或错过某个特定功能,请告诉我。