我需要创建一种gnuplot web界面,它接收命令或文件列表,将其保存到光盘并告诉gnuplot将其呈现为png(“set terminal png; set output ...”)。
用户可以做些什么令人讨厌或愚蠢的事情(例如重载cpu或RAM,访问文件系统......)? 我该如何避免它们?在将代码传递给gnuplot之前,我应该删除哪些潜在的恶意行?
我从django通过subprocess.Popen
运行gnuplot。
答案 0 :(得分:5)
免责声明 - 此列表无法完成
有些事情你想要禁用(至少)。
在gnuplot中,看看help shell
- 那些允许用户生成交互式shell(shell
和logout
之间的任何内容都需要被丢弃)。此外,您将要删除以!
或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 jail来运行你的脚本(我一无所知的东西,我只是在谷歌搜索如何在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
现在,您需要编辑由configure生成的config.h
...
注释掉:
#define HAVE_PCLOSE 1
和
#define HAVE_POPEN 1
和
#define PIPES 1
(例如/*#define HAVE_PCLOSE 1*/
,如果您不熟悉C评论)。
然后make; [sudo] make install
- 使用我设置的后缀,你的“更安全”版本的gnuplot可以调用为gnuplotsafer
。
这会禁用管道引起的不安全感(包含|
,<
的字符串问题,甚至现在都可以安全地使用反馈。 shell ,系统和!仍然不安全,你
我必须通过解析脚本来禁用它们 - 但这比尝试确保用户不设置恶意管道要容易得多。
我还建议您在将系统置于在线状态之前检查以确保您无法对管道/背板等做任何事情,我仍然会尝试尽可能多地对整个事物进行沙箱化。
答案 1 :(得分:3)
mgilson所说的一切都非常重要 - 这可能非常危险。但是应该可能安全地进行仔细的沙盒和监视资源使用情况。
看看http://www.plotshare.com/。他们已经存在了一段时间,所以他们必须找到一种方法来安全地做到这一点。也许你可以跟他们说话。
答案 2 :(得分:0)
我是www.plotshare.com的作者,我今天刚刚看到这个条目。
我想感谢mgilson让他的评论更加安全。说实话,管道安全问题并不在我看来,因为我倾向于在绘图之前对数据进行预处理,因此很少使用管道。
我将该页面作为空闲时间项目运行,并不断尝试改进它。现在我希望大多数安全漏洞都塞满了。
@Lee Phillips:感谢你在你的书中加入了plotshare。现在我正在添加一些不错的功能(改进的帮助系统,html画布等等),以使在线绘图体验真正优于仅使用shell中的gnuplot。
当我对页面的质量充满信心时,我会在谷歌的可见性上投入更多精力。如果您对页面不喜欢或错过某个特定功能,请告诉我。